Files
Enterprise-Knowledge-Base/frontend/src/i18n/locales/ru-RU.ts
T
wizardchen b5a1c88f75 fix(mcp): add OAuth skip endpoint and streamline in-chat interaction cards
Add a dedicated cancel route so users can skip mid-conversation OAuth without
token verification, and restyle OAuth/approval cards to match AgentStreamDisplay
with compact inline actions.
2026-06-29 23:22:28 +08:00

5857 lines
374 KiB
TypeScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export default {
menu: {
knowledgeBase: 'База знаний',
chat: 'Диалог',
newChat: 'Новый диалог',
createChat: 'Создать диалог',
tenant: 'Информация об аккаунте',
settings: 'Настройки системы',
logout: 'Выход',
uploadKnowledge: 'Загрузить знания',
deleteRecord: 'Удалить запись',
clearMessages: 'Очистить сообщения',
clearMessagesSuccess: 'Сообщения очищены',
clearMessagesFailed: 'Не удалось очистить сообщения, попробуйте позже',
batchManage: 'Пакетное управление',
newSession: 'Новый диалог',
pin: 'Закрепить',
unpin: 'Открепить',
pinned: 'Закреплено',
pinFailed: 'Не удалось закрепить, попробуйте позже',
unpinFailed: 'Не удалось открепить, попробуйте позже',
confirmLogout: 'Вы уверены, что хотите выйти?',
systemInfo: 'Информация о системе',
search: 'Поиск',
collapseSidebar: 'Свернуть боковую панель',
expandSidebar: 'Развернуть боковую панель',
logoutSuccess: 'Вы вышли из системы',
myChats: 'Мои чаты',
embedChats: 'Веб-встраивание',
embedChannelNamed: 'Веб-встраивание · {name}',
groupBy: 'Группировать',
groupNone: 'Нет',
groupDate: 'Дата',
channelsSection: 'Чаты каналов',
chatsSection: 'Веб-чаты',
otherSources: 'Другие источники',
noSessions: 'Пока нет диалогов',
loadMoreSessions: 'Загрузить ещё',
agents: 'Агенты',
integrations: 'Публикация и интеграция',
organizations: 'Общие пространства'
},
newUserGuide: {
stepOf: '{current} / {total}',
skip: 'Пропустить',
prev: 'Назад',
next: 'Далее',
done: 'Готово',
reopen: 'Обучение',
steps: {
welcome: {
title: 'Добро пожаловать в WeKnora',
desc: 'Несколько простых шагов познакомят вас с базами знаний, чатом и агентами. Нажмите «Далее», чтобы начать.',
},
knowledge: {
title: 'Создайте базу знаний',
desc: 'С этого всё начинается: загружайте документы, веб-страницы или FAQ, и WeKnora автоматически разберёт и проиндексирует их. Нажмите здесь, чтобы открыть базы знаний.',
},
chat: {
title: 'Начните чат с ИИ',
desc: 'Задавайте вопросы на основе вашей базы знаний и получайте точные ответы со ссылками на источники. Нажмите здесь, чтобы начать новый чат.',
},
agents: {
title: 'Создавайте собственных агентов',
desc: 'Объединяйте базы знаний, промпты и инструменты в переиспользуемых агентов, закрепляя свою экспертизу.',
},
settings: {
title: 'Аккаунт и настройки',
desc: 'Откройте это меню, чтобы управлять аккаунтом, участниками и системными настройками. Обучение можно снова открыть кнопкой помощи рядом с именем вверху меню.',
},
models: {
title: 'Настройте модели',
desc: 'Ключевой шаг: добавьте модели чата, эмбеддингов и другие в управлении моделями, чтобы базы знаний и чат работали. Нажмите «Добавить модель», чтобы начать.',
},
done: {
title: 'Всё готово',
desc: 'Теперь вы знаете основы — начните создавать своего помощника на основе знаний! Вернуться к обучению можно кнопкой помощи рядом с именем в этом меню.',
},
},
},
contextualGuide: {
stepOf: '{current} / {total}',
skip: 'Пропустить',
prev: 'Назад',
next: 'Далее',
done: 'Понятно',
interactHint: 'Нажмите на выделенную область, чтобы продолжить',
kbList: {
steps: {
create: {
title: 'Создайте первую базу знаний',
desc: 'В базах знаний хранятся документы и FAQ. Нажмите выделенную кнопку «Новая база знаний» ниже — мы проведём вас по форме.',
},
},
},
tenantModels: {
needModelsFirst: 'Сначала добавьте модель чата и Embedding, затем создавайте базу знаний.',
needChatModelFirst: 'Перед созданием агента добавьте модель чата (KnowledgeQA).',
steps: {
intro: {
title: 'Сначала настройте модели',
desc: 'Для документной базы нужна модель чата (сводки и ответы) и модель Embedding (векторный поиск). Добавьте их в системных настройках.',
},
addModel: {
title: 'Добавить модели',
desc: 'Нажмите «Добавить модель» и настройте типы KnowledgeQA (чат) и Embedding. В Lite можно загрузить локальные модели через Ollama.',
},
done: {
title: 'Затем продолжите',
desc: 'После сохранения моделей закройте настройки и нажмите «Новая база знаний». Мастер проведёт через тип, индексацию и привязку моделей.',
},
},
stepsAgent: {
intro: {
title: 'Сначала настройте модель чата',
desc: 'Для создания агента нужна хотя бы одна модель KnowledgeQA. Добавьте её в системных настройках (Embedding нужен только для баз знаний).',
},
addModel: {
title: 'Добавить модель чата',
desc: 'Нажмите «Добавить модель» и настройте тип KnowledgeQA.',
},
done: {
title: 'Затем создайте агента',
desc: 'После сохранения закройте настройки и нажмите «Создать агента». Мастер охватит режим, базы знаний и мультимодальные опции.',
},
},
},
kbCreate: {
steps: {
type: {
title: 'Выберите тип',
desc: 'Для PDF, Word и похожих файлов — база документов. Для пар вопрос–ответ — база FAQ. Тип после создания изменить нельзя.',
},
name: {
title: 'Введите название',
desc: 'Например «Руководство продукта» или «FAQ поддержки». Описание необязательно.',
},
indexing: {
title: 'Возможности индексации',
desc: 'По умолчанию включены векторный и ключевой поиск. Можно включить Wiki или граф знаний. Оставьте хотя бы один режим поиска.',
},
navModels: {
title: 'Модели (обязательно)',
desc: 'Каждой базе нужна модель чата; для поиска также нужен Embedding. Откройте «Конфигурация моделей» слева.',
},
llm: {
title: 'Модель чата / сводки',
desc: 'Для сводок и ответов. Если список пуст, через выпадающий список откройте настройки и добавьте модель.',
},
embedding: {
title: 'Модель Embedding',
desc: 'Преобразует текст в векторы для семантического поиска. Работает с векторным/ключевым индексом выше.',
},
parser: {
title: 'Парсер (необязательно)',
desc: 'Как разбираются PDF и Office. По умолчанию подходит в большинстве случаев; меняйте при необходимости OCR.',
},
chunking: {
title: 'Разбиение (необязательно)',
desc: 'Как документ делится на фрагменты для поиска. Размеры по умолчанию подобраны для RAG.',
},
storage: {
title: 'Хранилище (необязательно)',
desc: 'Где хранятся исходные файлы (локально или объектное хранилище). Обычно достаточно значения арендатора.',
},
navMultimodal: {
title: 'Мультимодальность / изображения (необязательно)',
desc: 'Включите, если в документах много диаграмм, сканов или изображений, требующих визуального понимания.',
},
multimodalToggle: {
title: 'Включить мультимодальный разбор',
desc: 'При включении загрузки с изображениями обрабатываются VLM для лучшего поиска.',
},
multimodalVllm: {
title: 'Выберите модель VLM',
desc: 'Для мультимодальности нужна VLM. Если список пуст, добавьте модель в настройках.',
},
faq: {
title: 'Индексация FAQ',
desc: 'Выберите режим индексации пар вопрос–ответ. Записи FAQ можно добавить после создания.',
},
submit: {
title: 'Создать базу знаний',
desc: 'Проверьте тип, название и модели, затем нажмите выделенную кнопку «Создать». Далее подскажем загрузить первый документ.',
},
},
},
agentList: {
steps: {
create: {
title: 'Создайте агента',
desc: 'Агенты объединяют модели, базы знаний, инструменты и промпты в переиспользуемых помощников. Нажмите выделенную кнопку «Создать агента».',
},
},
},
agentCreate: {
steps: {
mode: {
title: 'Выберите режим работы',
desc: '«Быстрый ответ» для простого Q&A; «Умное рассуждение» — инструменты и многошаговое мышление для сложных задач.',
},
agentType: {
title: 'Выберите тип агента',
desc: 'Пресеты подставляют системный промпт, рекомендуемые инструменты и область знаний (например, построение Wiki, анализ данных). При смене типа обновляются имя и описание.',
},
name: {
title: 'Название и описание',
desc: 'Укажите узнаваемое имя. В режиме умного рассуждения может подставиться значение по умолчанию.',
},
navModel: {
title: 'Привязать модель чата',
desc: 'Каждому агенту нужна модель KnowledgeQA как движок рассуждений.',
},
model: {
title: 'Выбор модели',
desc: 'Выберите из настроенных моделей чата или сначала добавьте в системных настройках.',
},
navKnowledge: {
title: 'Связать базы знаний',
desc: 'Определите, к каким знаниям агент может обращаться. По умолчанию — все базы.',
},
knowledge: {
title: 'Область знаний',
desc: '«Все» — универсальный помощник; «Выбранные» — домен; «Нет» — только модель или веб-поиск.',
},
navWebsearch: {
title: 'Веб-поиск (необязательно)',
desc: 'Разрешить агенту вызывать внешний поиск для актуальной информации.',
},
navMultimodal: {
title: 'Загрузка изображений (необязательно)',
desc: 'Позволяет отправлять изображения в чате; нужна VLM в настройках.',
},
multimodal: {
title: 'Включить понимание изображений',
desc: 'Включите переключатель и выберите VLM ниже.',
},
navTools: {
title: 'Инструменты и MCP (необязательно)',
desc: 'В режиме умного рассуждения включите встроенные инструменты и MCP для поиска, кода и др.',
},
submit: {
title: 'Сохранить агента',
desc: 'Нажмите выделенную кнопку подтверждения. Затем выберите этого агента в чате.',
},
},
},
kbDetail: {
steps: {
intro: {
title: 'База знаний пуста',
desc: 'Добавьте первый материал, чтобы искать по нему и общаться в чате. Поддерживаемые файлы можно перетащить мышью.',
},
upload: {
title: 'Добавить документы',
desc: 'Здесь можно загрузить файлы или папки, импортировать URL или создать материал онлайн.',
},
done: {
title: 'Готово после индексации',
desc: 'После обработки документов укажите эту базу через @ в чате и получайте ответы со ссылками на источники.',
},
},
},
chat: {
steps: {
kb: {
title: 'Выберите область знаний',
desc: 'Нажмите @, чтобы выбрать одну или несколько баз знаний или файлов. Иначе используются настройки текущего агента.',
},
input: {
title: 'Введите вопрос',
desc: 'Опишите, что хотите узнать, или нажмите на рекомендуемый вопрос выше.',
},
send: {
title: 'Отправить, чтобы начать чат',
desc: 'После отправки создаётся новая сессия. ИИ отвечает на основе базы знаний и показывает цитаты.',
},
done: {
title: 'Можно исследовать',
desc: 'Задайте вопрос по загруженным документам и посмотрите ответы со ссылками на источники.',
},
},
},
},
batchManage: {
title: 'Управление диалогами',
selectAll: 'Выбрать все',
cancel: 'Отмена',
delete: 'Удалить диалоги',
deleteConfirmTitle: 'Удалить диалоги',
deleteConfirmBody: 'Вы уверены, что хотите удалить выбранные {count} диалог(ов)? Это действие необратимо.',
deleteAllConfirmBody: 'Вы уверены, что хотите удалить все диалоги? Это действие необратимо.',
deleteSuccess: 'Успешно удалено',
deleteFailed: 'Ошибка удаления, попробуйте позже',
noSelection: 'Выберите хотя бы один диалог',
loadFailed: 'Не удалось загрузить список диалогов'
},
knowledgeBase: {
title: 'База знаний',
list: 'Список баз знаний',
fileContent: 'Содержимое файла',
detail: 'Детали базы знаний',
create: 'Создать базу знаний',
edit: 'Редактировать базу знаний',
delete: 'Удалить базу знаний',
name: 'Название',
description: 'Описание',
files: 'Файлы',
settings: 'Настройки',
documentCategoryTitle: 'Теги документов',
faqCategoryTitle: 'Теги FAQ',
untagged: 'Без тега',
tagClearAction: 'Очистить выбор',
tagSearchTooltip: 'Поиск тегов',
tagUpdateSuccess: 'Тег успешно обновлен',
tagEditDialogHeading: 'Редактировать теги',
tagEditDialogTitle: 'Редактировать теги — {name}',
tagEditSearch: 'Поиск тегов...',
tagEditSelectedSection: 'Выбранные',
tagEditAvailableSection: 'Доступные',
tagEditNoSelected: 'Ничего не выбрано',
tagFilterAll: 'Все документы',
tagFilterTitle: 'Фильтр по тегу',
tagFilterPlaceholder: 'Теги',
tagFilterMulti: '{count} тегов',
tagManageTitle: 'Управление тегами',
tagManageDescription: 'Создание, переименование и удаление тегов базы знаний',
tagManageLink: 'Управление тегами…',
tagManageListSection: 'Список тегов',
tagManageDocCount: '{count} документов',
tagManageFaqCount: '{count} записей FAQ',
tagSelectedCount: 'Выбрано: {count}',
tagOverflowTip: 'Нажмите, чтобы изменить теги',
tagNewPlaceholder: 'Название нового тега, Enter для добавления',
category: 'Тег',
tagCreateAction: 'Создать тег',
tagSearchPlaceholder: 'Введите название тега',
tagNamePlaceholder: 'Введите название тега',
tagNameRequired: 'Пожалуйста, укажите название тега',
tagCreateSuccess: 'Тег создан',
tagEditSuccess: 'Тег обновлён',
tagDeleteTitle: 'Удаление тега',
tagDeleteDesc: 'Удалить тег «{name}»? Все записи FAQ под этим тегом также будут удалены.',
tagDeleteDescDoc: 'Удалить тег «{name}»? Все документы под этим тегом также будут удалены.',
tagDeleteSuccess: 'Тег удалён',
tagEditAction: 'Переименовать',
tagDeleteAction: 'Удалить',
tagEmptyResult: 'Подходящие теги не найдены',
tagLabel: 'Тег',
tagPlaceholder: 'Выберите теги',
noTags: 'Нет тегов',
upload: 'Загрузить файл',
uploadSuccess: 'Файл успешно загружен!',
uploadFailed: 'Ошибка загрузки файла!',
docActionUnsupported: 'Этот тип базы знаний не поддерживает данную операцию',
fileExists: 'Файл уже существует',
uploadingMultiple: 'Загрузка {total} файлов...',
uploadAllSuccess: 'Успешно загружено {count} файлов!',
uploadPartialSuccess: 'Загрузка завершена: успешно {success}, ошибка {fail}',
uploadAllFailed: 'Все файлы не удалось загрузить',
uploadingFolder: 'Загрузка {total} файлов из папки...',
uploadingValidFiles: 'Загрузка {valid}/{total} действительных файлов...',
noValidFiles: 'Нет действительных файлов',
noValidFilesInFolder: 'Все {total} файлов в папке не поддерживаются',
noValidFilesSelected: 'Все выбранные файлы не поддерживаются',
hiddenFilesFiltered: 'Отфильтровано {count} скрытых файлов',
imagesFilteredNoVLM: 'Отфильтровано {count} изображений (VLM не включен)',
videosFilteredNoVLM: 'Пропущено {count} видеофайлов (загрузка видео не поддерживается)',
audiosFilteredNoASR: 'Отфильтровано {count} аудиофайлов (ASR не включен)',
invalidFilesFiltered: 'Отфильтровано {count} неподдерживаемых файлов',
unsupportedFileType: 'Неподдерживаемый тип файла',
unsupportedTypesHint: 'Некоторые типы документов ({types}) не имеют доступного парсера и не могут быть обработаны',
goToParserSettings: 'Настроить',
failedFilesList: 'Неудавшиеся файлы:',
andMoreFiles: '...и ещё {count} файлов',
duplicateFilesSkipped: 'Пропущено {count} повторяющихся файлов',
uploadFile: 'Загрузить файл',
uploadFileDesc: 'Поддерживает PDF, Word, TXT, изображения, аудио и т.д.',
importURL: 'Импорт из URL',
importURLDesc: 'Импорт по ссылке URL',
importURLTitle: 'Импорт из URL',
manualCreate: 'Создать вручную',
manualCreateDesc: 'Написать содержимое документа напрямую',
urlRequired: 'Пожалуйста, введите URL',
invalidURL: 'Пожалуйста, введите корректный URL',
urlImportSuccess: 'URL успешно импортирован!',
urlImportFailed: 'Ошибка импорта URL!',
urlExists: 'Этот URL уже существует',
urlLabel: 'Адрес URL',
urlPlaceholder: 'Введите URL веб-страницы, например: https://example.com',
urlTip: 'Поддерживает импорт различного веб-содержимого. Система автоматически извлечет и проанализирует текстовое содержимое с веб-страницы',
typeURL: 'URL',
typeManual: 'Вручную',
typeFile: 'Файл',
channelLabel: 'Канал источника',
channelWeb: 'Веб',
channelApi: 'API',
channelBrowserExtension: 'Расширение браузера',
channelWechat: 'WeChat',
channelWecom: 'WeCom',
channelFeishu: 'Feishu',
channelDingtalk: 'DingTalk',
channelSlack: 'Slack',
channelIm: 'IM канал',
channelNotion: 'Notion',
channelYuque: 'Yuque',
channelUpload: 'Загрузка',
channelManual: 'Вручную',
channelUrl: 'Веб',
channelUnknown: 'Неизвестно',
urlSource: 'Исходный URL',
documentTitle: 'Название документа',
webContent: 'Веб-содержимое',
documentContent: 'Содержимое документа',
importTime: 'Время импорта',
createTime: 'Время создания',
characters: 'символов',
segment: 'Фрагмент',
chunkCount: 'Всего {count} фрагментов',
viewOriginal: 'Просмотр исходного файла',
viewChunks: 'Просмотр фрагментов',
viewMerged: 'Полный текст',
originalFileNotSupported: 'Этот тип файла не поддерживает просмотр исходного файла. Пожалуйста, загрузите для просмотра.',
loadOriginalFailed: 'Не удалось загрузить содержимое исходного файла',
questions: 'Вопросы',
generatedQuestions: 'Сгенерированные вопросы',
childChunk: 'Дочерний блок',
viewParentContext: 'Просмотр родительского контекста',
parentContextLoadFailed: 'Не удалось загрузить родительский контекст',
confirmDeleteQuestion: 'Вы уверены, что хотите удалить этот вопрос? Соответствующий векторный индекс также будет удален.',
legacyQuestionCannotDelete: 'Вопросы в устаревшем формате нельзя удалить. Пожалуйста, сгенерируйте вопросы заново.',
notInitialized: 'База знаний не инициализирована. Пожалуйста, настройте модели в разделе настроек перед загрузкой файлов',
missingStorageEngine: 'Для этой базы знаний не выбрано хранилище. Пожалуйста, настройте хранилище в параметрах перед загрузкой содержимого.',
missingStorageEngineUpload: 'Пожалуйста, настройте хранилище перед загрузкой содержимого',
goToStorageSettings: 'Перейти к настройкам',
getInfoFailed: 'Не удалось получить информацию о базе знаний, загрузка файла невозможна',
missingId: 'Отсутствует ID базы знаний',
deleteFailed: 'Не удалось удалить. Пожалуйста, попробуйте позже!',
quickActions: 'Быстрые действия',
createKnowledgeBase: 'Создать базу знаний',
knowledgeBaseName: 'Название базы знаний',
enterName: 'Введите название базы знаний',
embeddingModel: 'Модель встраивания',
selectEmbeddingModel: 'Выберите модель встраивания',
summaryModel: 'Модель суммаризации',
selectSummaryModel: 'Выберите модель суммаризации',
rerankModel: 'Модель ранжирования',
selectRerankModel: 'Выберите модель ранжирования (опционально)',
createSuccess: 'База знаний успешно создана',
createFailed: 'Не удалось создать базу знаний',
updateSuccess: 'База знаний успешно обновлена',
updateFailed: 'Не удалось обновить базу знаний',
deleteConfirm: 'Вы уверены, что хотите удалить эту базу знаний?',
fileName: 'Имя файла',
fileSize: 'Размер файла',
uploadTime: 'Время загрузки',
status: 'Статус',
actions: 'Действия',
processing: 'Обработка',
completed: 'Завершено',
failed: 'Ошибка',
noFiles: 'Нет файлов',
dragFilesHere: 'Перетащите файлы сюда или',
clickToUpload: 'нажмите для загрузки',
supportedFormats: 'Поддерживаемые форматы',
maxFileSize: 'Макс. размер файла',
viewDetails: 'Просмотр деталей',
downloadFile: 'Скачать файл',
deleteFile: 'Удалить файл',
confirmDeleteFile: 'Вы уверены, что хотите удалить этот файл?',
totalFiles: 'Всего файлов',
totalSize: 'Общий размер',
newSession: 'Новый диалог',
editDocument: 'Редактировать документ',
draft: 'Черновик',
draftTip: 'Временно сохранён, не участвует в поиске',
untitledDocument: 'Документ без названия',
deleteDocument: 'Удалить документ',
moveDocument: 'Переместить в...',
moveToKnowledgeBase: 'Переместить в базу знаний',
moveSelectTarget: 'Выберите целевую базу знаний',
moveNoTargets: 'Совместимые базы знаний не найдены (требуется одинаковый тип и модель эмбеддинга)',
moveMode: 'Режим перемещения',
moveModeReuseVectors: 'Повторное использование векторов (быстро)',
moveModeReuseVectorsDesc: 'Прямое перемещение чанков и векторных индексов. Используйте при одинаковой конфигурации разбиения.',
moveModeReparse: 'Повторный парсинг',
moveModeReparseDesc: 'Повторный парсинг документов с конфигурацией разбиения целевой базы знаний.',
moveConfirm: 'Подтвердить перемещение',
moveConfirmTitle: 'Подтвердите настройки перемещения',
moveStarted: 'Задача перемещения отправлена',
moveFailed: 'Перемещение не удалось',
moveCompleted: 'Перемещение завершено',
moveCompletedWithErrors: 'Перемещение завершено: {success} успешно, {failed} не удалось',
moveProgress: 'Перемещение...',
parsingFailed: 'Парсинг не удался',
parsingInProgress: 'Парсинг...',
generatingSummary: 'Генерация резюме...',
documentSummary: 'Резюме',
detailSectionMeta: 'Основная информация',
deleteConfirmation: 'Подтверждение удаления',
confirmDeleteDocument: 'Подтвердить удаление документа "{fileName}", после удаления восстановление невозможно',
cancel: 'Отмена',
confirmDelete: 'Подтвердить удаление',
viewModeGrid: 'Сетка',
viewModeList: 'Список',
viewModeToggle: 'Переключить вид',
columnName: 'Имя',
columnTag: 'Тег',
columnSize: 'Размер',
columnType: 'Тип',
columnSource: 'Источник',
columnStatus: 'Статус',
columnUpdatedAt: 'Обновлено',
columnActions: 'Действия',
selectAll: 'Выбрать все',
selectedCount: 'Выбрано: {count}',
clearSelection: 'Снять выделение',
batchDelete: 'Удалить выбранные',
batchDeleteConfirmation: 'Подтверждение пакетного удаления',
confirmBatchDeleteDocument: 'Удалить {count} выбранных документов? Это действие нельзя отменить.',
batchDeleteSuccess: 'Удалено документов: {count}',
batchDeleteFailed: 'Ошибка пакетного удаления',
confirmBatchReparseDocument: 'Пересобрать {count} выбранных документов? Существующее содержимое будет удалено, и каждый документ будет обработан заново.',
confirmBatchReparse: 'Подтвердить и обработать заново',
batchReparseSuccess: 'Отправлено задач пересборки: {count}',
batchReparseFailed: 'Ошибка пакетной пересборки',
batchReparseSkippedInFlight: 'Пропущено документов, которые ещё обрабатываются: {count}',
statusCompleted: 'Завершено',
statusProcessing: 'Обработка',
statusFinalizing: 'Оптимизация',
statusPending: 'Ожидание',
statusFailed: 'Ошибка',
statusCancelled: 'Отменено',
statusDraft: 'Черновик',
selectKnowledgeBaseFirst: 'Пожалуйста, сначала выберите базу знаний',
sessionCreationFailed: 'Не удалось создать диалог',
sessionCreationError: 'Ошибка создания диалога',
settingsParsingFailed: 'Не удалось разобрать настройки',
fileUploadEventReceived: 'Получено событие загрузки файла, загруженный ID базы знаний: {uploadedKbId}, текущий ID базы знаний: {currentKbId}',
matchingKnowledgeBase: 'Совпадающая база знаний, начинаем обновление списка файлов',
routeParamChange: 'Изменение параметров маршрута, повторное получение содержимого базы знаний',
fileUploadEventListening: 'Прослушивание события загрузки файла',
apiCallKnowledgeFiles: 'Прямой вызов API для получения списка файлов базы знаний',
responseInterceptorData: 'Поскольку перехватчик ответа уже вернул data, result является частью данных ответа',
hookProcessing: 'Обработка в соответствии со способом useKnowledgeBase hook',
errorHandling: 'Обработка ошибок',
priorityCurrentPageKbId: 'Приоритет использования ID базы знаний текущей страницы',
fallbackLocalStorageKbId: 'Если на текущей странице нет ID базы знаний, попытка получить ID базы знаний из настроек в localStorage',
createNewKnowledgeBase: 'Создать базу знаний',
uninitializedWarning: 'Некоторые базы знаний не инициализированы, необходимо сначала настроить информацию о моделях в настройках, чтобы добавить документы знаний',
initializedStatus: 'Инициализирована',
notInitializedStatus: 'Не инициализирована',
needSettingsFirst: 'Необходимо сначала настроить информацию о моделях в настройках, чтобы добавить знания',
documents: 'Документы',
configureModelsFirst: 'Пожалуйста, сначала настройте информацию о моделях в настройках',
confirmDeleteKnowledgeBase: 'Подтвердить удаление этой базы знаний?',
createKnowledgeBaseDialog: 'Создать базу знаний',
enterNameKb: 'Введите название',
enterDescriptionKb: 'Введите описание',
createKb: 'Создать',
deleted: 'Удалено',
deleteFailedKb: 'Не удалось удалить',
noDescription: 'Нет описания',
emptyKnowledgeDragDrop: 'База знаний пуста, перетащите файлы для загрузки',
pdfDocFormat: 'Файлы pdf, doc формата, не более 10 МБ',
textMarkdownFormat: 'Файлы text, markdown формата, не более 200 КБ',
dragFileNotText: 'Пожалуйста, перетащите файлы, а не текст или ссылки',
searchPlaceholder: 'Поиск по базам знаний...',
docSearchPlaceholder: 'Поиск документов...',
fileTypeFilter: 'Тип файла',
allFileTypes: 'Все типы',
allTags: 'Все теги',
parseStatusFilter: 'Статус',
allParseStatuses: 'Все статусы',
parseStatusPending: 'Ожидание',
parseStatusProcessing: 'Обработка',
parseStatusCompleted: 'Завершено',
parseStatusFailed: 'Ошибка',
sourceFilter: 'Источник',
allSources: 'Все источники',
sourceWeb: 'Веб',
sourceApi: 'API',
sourceBrowserExtension: 'Расширение браузера',
sourceUpload: 'Загрузка',
sourceUrl: 'URL импорт',
sourceManual: 'Создан вручную',
updatedTimeFilter: 'Обновлено',
updatedTimeFrom: 'С',
updatedTimeTo: 'По',
noMatch: 'Совпадающих баз знаний не найдено',
noKnowledge: 'Нет доступных баз знаний',
loadingFailed: 'Не удалось загрузить базы знаний',
operationNotSupportedForType: 'Эта операция не поддерживается для текущего типа базы знаний',
allFilesSkippedNoEngine: 'Все выбранные файлы были пропущены из-за отсутствия парсера',
filesSkippedNoEngine: '{count} файл(ов) пропущено из-за отсутствия парсера',
allUploadSuccess: 'Все файлы загружены ({count})',
partialUploadSuccess: 'Частичная загрузка (успешно: {success}, ошибки: {fail})',
allUploadFailed: 'Все файлы не удалось загрузить ({count})',
deleteSuccess: 'Знание удалено!',
chunkLoadFailed: 'Не удалось загрузить фрагменты',
accessInfo: {
myRole: 'Моя роль',
roleOwner: 'Создатель',
permissionOwner: 'Редактирование, управление настройками, удаление базы знаний',
permissionAdmin: 'Редактирование, управление общим доступом',
permissionEditor: 'Редактирование документов и тегов',
permissionViewer: 'Только просмотр',
fromOrg: 'Из пространства',
sharedAt: 'Дата общего доступа',
lastUpdated: 'Последнее обновление'
},
infoCard: {
tooltip: 'Просмотр информации о базе знаний',
title: 'Информация о базе знаний',
basic: 'Основное',
access: 'Доступ',
binding: 'Привязка хранилища',
capabilities: 'Возможности',
stats: 'Статистика',
type: 'Тип',
createdAt: 'Создано',
source: 'Источник',
sharedTo: 'Общий доступ',
enabled: 'Включено',
vectorStore: 'Векторное хранилище',
fileStorage: 'Файловое хранилище',
documentCount: 'Документы',
faqCount: 'FAQ',
supportedFileTypes: 'Допустимые форматы',
chunking: 'Разделение',
parentShort: 'родитель',
childShort: 'потомок',
},
addDocument: 'Добавить документ',
createdAt: 'Создано',
updatedAt: 'Обновлено',
clickToViewFull: 'Нажмите для полного просмотра',
rebuildDocument: 'Пересобрать документ',
rebuildConfirm: 'Подтвердить пересборку документа "{fileName}"? Существующие фрагменты будут удалены и документ будет повторно проанализирован.',
rebuildSubmitted: 'Задача пересборки отправлена',
rebuildFailed: 'Ошибка пересборки, попробуйте позже',
rebuildInProgress: 'Документ сейчас анализируется, попробуйте позже',
cancelParse: 'Остановить разбор',
cancelParseConfirmBody: 'Остановить разбор «{title}»? Уже записанные фрагменты сохранятся, и их можно будет разобрать заново через «Пересобрать». Ожидающие задачи оптимизации (резюме / вопросы и ответы / граф знаний) будут немедленно отменены.',
cancelParseSubmitted: 'Разбор остановлен',
cancelParseFailed: 'Не удалось остановить, попробуйте позже'
},
uploadConfirm: {
title: 'Подтверждение загрузки',
fileList: 'Файлы для загрузки',
parseConfig: 'Настройки разбора',
configNav: 'Навигация по настройкам разбора',
tabOverview: 'Обзор',
overviewTitle: 'Настройки разбора для этой партии',
overviewDesc: 'Нажмите на строку, чтобы изменить',
backToOverview: 'Вернуться к обзору',
summaryChunkOverlapShort: 'Перекрытие {overlap}',
summaryParentChildShort: 'Родительско-дочернее',
summaryParserMode: 'Режим',
summaryParserBuiltin: 'Встроенный движок (по умолчанию)',
summaryParserForceScanned: 'режим скана',
summaryChunkSize: 'Размер чанка',
summaryChunkOverlap: 'Перекрытие',
summaryStrategy: 'Стратегия',
summaryStrategyDefault: 'По умолчанию',
summaryParentChild: 'Родительско-дочернее',
summaryParentChildOn: 'Вкл. (родитель {parent} / дочерний {child})',
summaryParentChildOff: 'Выкл.',
summaryStatus: 'Статус',
summaryModel: 'Модель',
summaryQuestionCount: 'Вопросов на чанк',
summaryQuestionCountValue: '{count}',
summaryGraphTags: 'Типы связей',
summaryGraphTagsValue: '{count}',
navChunkingSummary: 'Чанк {size}',
statusOn: 'Вкл.',
statusOff: 'Выкл.',
notSet: 'Не задано',
confirm: 'Загрузить и обработать',
cancel: 'Отмена',
uploading: 'Загрузка {current}/{total}',
tabParser: 'Парсер',
tabChunking: 'Разбиение',
tabMultimodal: 'Мультимодальность',
tabAsr: 'Аудио',
tabQuestion: 'Генерация вопросов',
tabGraph: 'Граф знаний',
noFiles: 'Оставьте хотя бы один файл для загрузки',
noItems: 'Добавьте хотя бы один файл или URL',
urlItemLabel: 'URL',
urlAdded: 'URL добавлен',
urlDuplicate: 'Этот URL уже в списке',
addUrl: 'Добавить',
vlmModelRequired: 'В партии есть изображения. Включите мультимодальность и выберите модель VLM.',
multimodalRequiredForImages: 'Выкл. (в партии есть изображения)',
asrModelRequired: 'В партии есть аудио. Включите ASR и выберите модель распознавания речи.',
asrRequiredForAudio: 'Выкл. (в партии есть аудио)',
vlmModelSelectRequired: 'Мультимодальность включена. Выберите модель VLM.',
asrModelSelectRequired: 'Распознавание речи включено. Выберите модель ASR.',
pdfForceScanned: {
label: 'Разбор PDF как сканированного документа',
description: 'Подходит для PDF с веб-печати, сканов и документов с большим числом изображений. Каждая страница будет отрендерена в изображение и обработана через OCR/VLM. Может увеличить время обработки и расходы на модели.'
},
continueAdd: 'Добавить ещё',
addMoreFiles: 'Добавить файлы',
addMoreFolder: 'Добавить из папки',
filesAdded: 'Добавлено файлов: {count}',
filesAllDuplicate: 'Выбранные файлы уже в списке',
titleUrl: 'Подтверждение импорта URL',
titleManual: 'Подтверждение публикации',
overviewDescUrl: 'После подтверждения настроек URL будет загружен и обработан',
overviewDescManual: 'После подтверждения настроек документ будет опубликован и проиндексирован',
confirmUrl: 'Импортировать и обработать',
confirmManual: 'Опубликовать и обработать',
titleReparse: 'Подтверждение повторной обработки',
overviewDescReparse: 'После подтверждения настроек существующее содержимое будет удалено, а документ обработан заново',
confirmReparse: 'Подтвердить и обработать заново',
reparseSource: 'Документ для повторной обработки',
reparseHint: 'Используются настройки прошлой обработки; их можно изменить здесь',
urlSource: 'Источник импорта',
manualSource: 'Документ для публикации',
editUrl: 'Изменить URL',
manualCharCount: '{count} символов',
},
knowledgeStages: {
processConfig: {
title: 'Конфигурация обработки',
kbDefault: 'Используются настройки базы знаний по умолчанию',
chunking: 'Разбиение',
chunkSize: 'размер {n}',
parentChildOn: 'родитель-потомок вкл',
parentChildOff: 'родитель-потомок выкл',
parser: 'Движок парсера',
multimodal: 'Мультимодальность',
asr: 'Аудио (ASR)',
question: 'Генерация вопросов',
questionOn: 'вкл ({n} на фрагмент)',
graph: 'Граф знаний',
on: 'вкл',
off: 'выкл',
},
title: 'Конвейер обработки',
root: 'Обработка знаний',
attempt: 'Попытка {n}',
attemptLatest: 'Попытка {n} (последняя)',
retry: 'Повторить парсинг',
copyDetails: 'Скопировать детали',
copied: 'Скопировано в буфер обмена',
noActivity: 'Нет активности парсинга',
totalDuration: 'Всего: {d}',
total: 'Всего {d}',
detail: {
started: 'Начало',
finished: 'Окончание',
duration: 'Длительность',
input: 'Вход',
output: 'Выход',
metadata: 'Метаданные',
error: 'Ошибка',
showJson: 'Показать JSON',
hideJson: 'Скрыть JSON',
},
stage: {
docreader: 'Парсинг документа',
chunking: 'Разбиение',
embedding: 'Векторизация',
multimodal: 'Мультимодальное распознавание',
postprocess: 'Постобработка',
},
status: {
pending: 'Ожидание',
running: 'Выполняется',
finalizing: 'Оптимизация',
done: 'Готово',
failed: 'Ошибка',
skipped: 'Пропущено',
cancelled: 'Отменено',
},
errorCode: {
DOCREADER_TIMEOUT: 'Истекло время парсинга документа',
DOCREADER_TIMEOUT_SUGGESTION: 'Файл может быть слишком большим, или служба парсинга занята. Повторите позже или разделите документ.',
DOCREADER_UNAVAILABLE: 'Парсер документов недоступен',
DOCREADER_UNAVAILABLE_SUGGESTION: 'Служба парсинга отключена. Обратитесь к администратору.',
DOCREADER_PARSE_FAILED: 'Ошибка парсинга документа',
DOCREADER_PARSE_FAILED_SUGGESTION: 'Не удалось распарсить файл. Убедитесь, что он не повреждён.',
CHUNKING_FAILED: 'Ошибка разбиения',
CHUNKING_FAILED_SUGGESTION: 'Попробуйте изменить настройки разбиения базы знаний.',
EMBEDDING_RATE_LIMIT: 'Превышен лимит запросов к службе эмбеддингов',
EMBEDDING_RATE_LIMIT_SUGGESTION: 'Поставщик эмбеддингов ограничивает запросы. Повторите позже.',
EMBEDDING_PROVIDER_FAIL: 'Ошибка поставщика эмбеддингов',
EMBEDDING_PROVIDER_FAIL_SUGGESTION: 'Поставщик эмбеддингов вернул ошибку. Проверьте настройки поставщика.',
VECTORSTORE_WRITE_FAILED: 'Ошибка записи в векторное хранилище',
VECTORSTORE_WRITE_FAILED_SUGGESTION: 'Векторное хранилище отклонило запись. Проверьте доступность хранилища.',
MULTIMODAL_VLM_FAILED: 'Ошибка распознавания изображений',
MULTIMODAL_VLM_FAILED_SUGGESTION: 'Часть изображений не удалось обработать. Документ всё ещё может быть пригоден.',
MULTIMODAL_ALL_FAILED: 'Все изображения не прошли мультимодальную обработку',
MULTIMODAL_ALL_FAILED_SUGGESTION: 'Проверьте конфигурацию мультимодальной модели.',
TASK_TIMEOUT: 'Задача превысила максимальное время выполнения',
TASK_TIMEOUT_SUGGESTION: 'Задача выполнялась дольше допустимого. Повторите или обратитесь в поддержку.',
UPSTREAM_FAILED: 'Остановлено из-за ошибки на предыдущем этапе',
UPSTREAM_FAILED_SUGGESTION: 'Предыдущий этап завершился с ошибкой и заблокировал выполнение.',
UNKNOWN: 'Неизвестная ошибка',
UNKNOWN_SUGGESTION: 'Проверьте логи приложения для подробностей.',
},
},
agent: {
taskLabel: 'Задача:',
think: 'Размышление',
copy: 'Копировать',
addToKnowledgeBase: 'Добавить в базу знаний',
updatePlan: 'Обновить план',
webSearchFound: 'Найдено <strong>{count}</strong> результатов веб‑поиска',
argumentsLabel: 'Параметры',
toolFallback: 'Инструмент',
stepsCompleted: 'Выполнено <strong>{steps}</strong> шаг(ов)',
stepsCompletedWithDuration: 'Выполнено <strong>{steps}</strong> шаг(ов) за <strong>{duration}</strong>',
reasoningRounds: '<strong>{rounds}</strong> раунд(ов) рассуждений',
toolCalls: '<strong>{tools}</strong> вызов(ов) инструментов',
durationSuffix: '<strong>{duration}</strong>',
stepSummarySeparator: ' · ',
editor: {
skillsConfig: 'Skills',
skillsConfigDesc: 'Настройка предустановленных Skills для агента, предоставляющих специализированные знания и рабочие процессы',
skillsSelection: 'Выбор Skills',
skillsSelectionDesc: 'Выберите диапазон Skills, доступных агенту',
skillsAll: 'Все',
skillsSelected: 'Выбранные',
skillsNone: 'Отключено',
selectSkills: 'Выбрать Skills',
selectSkillsDesc: 'Выберите Skills для активации',
noSkillsAvailable: 'Нет доступных предустановленных Skills',
skillsInfoTitle: 'Что такое Skills?',
skillsInfoContent: 'Skills — это предустановленные модули профессиональных знаний, которые предоставляют агенту инструкции, рабочие процессы и инструменты для конкретных областей. При активации агент автоматически загружает соответствующие знания по мере необходимости.',
createTitle: 'Create Agent',
editTitle: 'Edit Agent',
basicInfo: 'Basic Info',
basicInfoDesc: 'Настройка имени, описания и режима работы агента',
promptsConfig: 'Промпты',
promptsConfigDesc: 'Настройка системных, контекстных, intent/rewrite/fallback промптов',
modelConfig: 'Model Config',
modelConfigDesc: 'Модель чата, вспомогательные модели (ReRank) и параметры генерации',
capabilities: 'Capabilities',
capabilitiesDesc: 'Configure agent capabilities and tools',
toolsConfig: 'Tools',
toolsConfigDesc: 'Configure tools available to the Agent',
knowledgeConfig: 'Knowledge Base',
knowledgeConfigDesc: 'Настройка области баз знаний и стратегии FAQ для агента',
webSearchConfig: 'Web Search',
webSearchConfigDesc: 'Configure web search capabilities for the agent',
configuration: 'Configuration',
agentId: 'Agent ID',
agentIdDesc: 'Use this ID to target the agent in API integrations',
name: 'Name',
namePlaceholder: 'Enter agent name',
nameRequired: 'Agent name is required',
disabled: 'Disable',
disabledDesc: 'When disabled, this agent will not appear in the conversation agent dropdown',
systemPromptRequired: 'System prompt is required',
modelRequired: 'Please select a model',
rerankModelRequired: 'ReRank model is required when using knowledge bases',
contextsMissing: "Context template must contain {'{{'}contexts{'}}'} placeholder when knowledge base is enabled",
queryMissingInContext: "Context template must contain {'{{'}query{'}}'} placeholder",
knowledgeBasesMissing: "It is recommended to include {'{{'}knowledge_bases{'}}'} placeholder in system prompt so the model knows available knowledge bases",
queryMissingInRewrite: "Rewrite user prompt must contain {'{{'}query{'}}'} placeholder",
conversationMissing: "Rewrite user prompt must contain {'{{'}conversation{'}}'} placeholder",
queryMissingInFallback: "Fallback prompt must contain {'{{'}query{'}}'} placeholder",
avatar: 'Avatar',
avatarPlaceholder: 'Enter Emoji or select',
description: 'Description',
descriptionPlaceholder: 'Enter agent description',
baseType: 'Base Type',
normalDesc: 'Quick response, direct answers',
agentDesc: 'Multi-step thinking, deep analysis for complex questions',
model: 'Model',
modelPlaceholder: 'Select Model',
systemPrompt: 'System Prompt',
systemPromptPlaceholder: "Custom system prompt to define agent behavior and role (use {'{{'}web_search_status{'}}'} placeholder for dynamic web search behavior)",
defaultPromptHint: 'Leave empty to use the following default system prompt:',
defaultContextTemplateHint: 'Leave empty to use the following default context template:',
contextTemplateRequired: 'Context template is required',
availablePlaceholders: 'Available Placeholders',
placeholderHint: "Type {'{{'} to trigger autocomplete",
temperature: 'Temperature',
thinking: 'Thinking Mode',
welcomeMessage: 'Welcome Message',
welcomeMessagePlaceholder: 'Message displayed when this agent is selected',
suggestedPrompts: 'Suggested Prompts',
mode: 'Running Mode',
webSearch: 'Web Search',
webSearchProvider: 'Поисковый движок',
webSearchProviderPlaceholder: 'Использовать поисковый движок по умолчанию',
webSearchMaxResults: 'Max Search Results',
webFetchEnabled: 'Автоматически загружать содержимое страниц',
webFetchTopN: 'Количество загружаемых страниц',
knowledgeBases: 'Knowledge Bases',
allKnowledgeBases: 'All Knowledge Bases',
allKnowledgeBasesDesc: 'Agent can access all knowledge bases',
selectedKnowledgeBases: 'Selected Knowledge Bases',
selectedKnowledgeBasesDesc: 'Only access selected knowledge bases',
noKnowledgeBase: 'No Knowledge Base',
noKnowledgeBaseDesc: 'Pure model conversation, no knowledge retrieval',
selectKnowledgeBases: 'Select Knowledge Bases',
selectKnowledgeBasesDesc: 'Select knowledge bases to associate (including collaborative ones)',
myKnowledgeBases: 'My Knowledge Bases',
sharedKnowledgeBases: 'Collaborative Knowledge Bases',
retrieveKBOnlyWhenMentioned: 'Retrieve Only When Mentioned',
retrieveKBOnlyWhenMentionedDesc: "Off: auto-retrieve configured KBs; On: retrieve only when user {'@'} mentions",
retrievalSectionTitle: 'Стратегия поиска',
rerankModel: 'ReRank Model',
rerankModelDesc: 'Used to rerank knowledge base retrieval results for better accuracy',
rerankModelPlaceholder: 'Select ReRank Model',
rerankModelOptionalHint: 'В текущей области нет RAG-базы знаний, поэтому поле необязательное. Если RAG-база будет добавлена позже, будет использоваться модель ReRank по умолчанию для тенанта; всё же рекомендуется настроить её явно.',
maxIterations: 'Max Iterations',
allowedTools: 'Allowed Tools',
multiTurn: 'Multi-turn Conversation',
historyTurns: 'History Turns',
retrievalStrategy: 'Retrieval Strategy',
embeddingTopK: 'Embedding Top K',
keywordThreshold: 'Keyword Threshold',
vectorThreshold: 'Vector Threshold',
rerankTopK: 'Rerank Top K',
rerankThreshold: 'Rerank Threshold',
conversationSettings: 'Conversation',
advancedSettings: 'Advanced Settings',
contextTemplate: 'Context Template',
contextTemplatePlaceholder: 'Custom context template...',
availableContextPlaceholders: 'Available Placeholders',
placeholderQuery: 'User query',
placeholderContexts: 'Retrieved content list',
placeholderCurrentTime: 'Current time (format: 2006-01-02 15:04:05)',
placeholderCurrentWeek: 'Current weekday (e.g., Monday)',
enableQueryExpansion: 'Query Expansion',
enableRewrite: 'Query Rewrite',
queryUnderstandModel: 'Модель понимания запроса',
queryUnderstandModelPlaceholder: 'Оставьте пустым, чтобы использовать основную модель чата',
rewritePromptSystem: 'Rewrite System Prompt',
rewritePromptSystemPlaceholder: 'Leave empty to use default prompt',
rewritePromptUser: 'Rewrite User Prompt',
rewritePromptUserPlaceholder: 'Leave empty to use default prompt',
maxCompletionTokens: 'Max Completion Tokens',
fallbackStrategy: 'Fallback Strategy',
fallbackResponse: 'Fixed Response',
fallbackResponsePlaceholder: 'Sorry, I cannot answer this question.',
fallbackPrompt: 'Fallback Prompt',
fallbackPromptPlaceholder: 'Leave empty to use default prompt'
},
title: 'Agents',
subtitle: 'Configure and manage your agents to customize conversation behavior and capabilities',
createAgent: 'Create Agent',
createAgentShort: 'New',
builtin: 'Built-in',
disabled: 'Disabled',
disable: 'Disable',
enable: 'Enable',
noDescription: 'No description',
selectAgent: 'Select Agent',
noAgents: 'No agents',
manageAgents: 'Manage',
builtinAgents: 'Built-in Agents',
customAgents: 'Custom Agents',
capabilities: {
normal: 'Quick response, direct answers',
agent: 'Multi-step thinking, deep analysis for complex questions',
modelSpecified: 'Model specified',
kbCount: '{count} knowledge base(s) specified',
kbAll: 'Access to all knowledge bases',
kbDisabled: 'Knowledge base disabled',
rerankSpecified: 'ReRank model specified',
webSearchOn: 'Web search enabled',
webSearchOff: 'Web search disabled',
hasPrompt: 'Custom prompt',
default: 'Default configuration',
mcpEnabled: 'MCP services enabled',
multiTurn: 'Multi-turn conversation'
},
type: {
normal: 'Quick Answer',
agent: 'Smart Reasoning',
custom: 'Custom'
},
mode: {
normal: 'Quick Answer',
agent: 'Smart Reasoning'
},
features: {
webSearch: 'Web Search Enabled',
knowledgeBase: 'Knowledge Base Linked',
mcp: 'MCP Services Enabled',
multiTurn: 'Multi-turn Conversation'
},
tabs: {
all: 'All',
mine: 'My Agents',
sharedToMe: 'Shared to Me'
},
sections: {
builtin: 'Встроенные',
mine: 'Созданные мной',
tenantReadonly: 'Рабочая область · Только просмотр',
tenantOthers: 'Рабочая область · Другие участники',
sharedByMe: 'Расшарено мной',
sharedEditable: 'Доступно мне · Можно редактировать',
sharedReadonly: 'Доступно мне · Только просмотр'
},
empty: {
title: 'No Custom Agents',
description: 'Click the button in the top right to create your first agent',
sharedTitle: 'No shared agents yet',
sharedDescription: 'You can join a space or ask others to share agents with you',
favoritesTitle: 'No favorites yet',
favoritesDescription: 'Star an agent from its card to add it here',
recentsTitle: 'Nothing here yet',
recentsDescription: 'Agents you recently used will show up here'
},
detail: {
title: 'Agent Details',
useInChat: 'Use in Chat'
},
shareScope: {
title: 'Share Scope',
desc: 'Space members have read-only access to this agent and will use it according to your current configuration; your changes to the agent will sync to shared spaces. To allow space members to edit knowledge base content, share the knowledge base to the space.',
knowledgeBase: 'Knowledge bases',
chatModel: 'Chat model',
rerankModel: 'Rerank model',
webSearch: 'Web search',
mcp: 'MCP services',
kbAll: 'All knowledge bases',
kbSelected: '{count} selected',
kbNone: 'None',
modelConfigured: 'Configured',
modelNotSet: 'Not set',
enabled: 'On',
disabled: 'Off',
mcpAll: 'All services',
mcpSelected: '{count} selected',
mcpNone: 'None'
},
delete: {
confirmTitle: 'Delete Agent',
confirmMessage: 'Are you sure you want to delete agent "{name}"? This action cannot be undone.',
confirmButton: 'Confirm Delete'
},
messages: {
created: 'Agent created successfully',
updated: 'Agent updated successfully',
deleted: 'Agent deleted',
deleteFailed: 'Delete failed',
saveFailed: 'Save failed',
builtinReadonly: 'Built-in agents cannot be edited',
copied: 'Agent copied successfully',
copyFailed: 'Copy failed',
disabled: 'Agent disabled',
enabled: 'Agent enabled'
},
selector: {
title: 'Select Agent',
builtinSection: 'Built-in Agents',
customSection: 'My Agents',
addNew: 'Add New Agent',
current: 'Current',
goToSettings: 'Settings',
sharedLabel: 'Shared',
notReadyHint: 'Still needs: {items}',
notReadyStatus: 'Setup needed',
notReadyMissing: 'Missing: {items}',
configureAction: 'Configure',
sharedNotReadyContact: 'Ask the sharing organization admin to finish setup',
},
builtinInfo: {
quickAnswer: {
name: 'Quick Answer',
description: 'Knowledge base RAG Q&A for fast and accurate answers'
},
smartReasoning: {
name: 'Smart Reasoning',
description: 'ReAct reasoning framework with multi-step thinking and tool calling'
},
deepResearcher: {
name: 'Deep Researcher',
description: 'Focused on in-depth research and comprehensive analysis, capable of creating research plans, multi-dimensional information retrieval, deep thinking and providing thorough analysis reports'
},
dataAnalyst: {
name: 'Data Analyst',
description: 'Focused on database queries and data analysis, capable of understanding business needs, building SQL queries, analyzing data and providing insights'
},
knowledgeGraphExpert: {
name: 'Knowledge Graph Expert',
description: 'Focused on knowledge graph queries and relationship analysis, capable of exploring entity relationships, discovering hidden connections and building knowledge networks'
},
documentAssistant: {
name: 'Document Assistant',
description: 'Focused on document retrieval and content organization, capable of quickly locating documents, extracting key information and generating summaries'
}
}
},
settings: {
title: 'Настройки',
modelConfig: 'Настройки модели',
modelManagement: 'Управление моделями',
agentConfig: 'Настройки агента',
webSearchConfig: 'Сетевой поиск',
enableMemory: 'Включить память',
enableMemoryDesc: 'При включении система будет записывать историю ваших разговоров и автоматически вспоминать соответствующий контент в будущих беседах для более персонализированных ответов.',
autoCheckUpdate: 'Автоматическая загрузка обновлений',
autoCheckUpdateDesc: 'При включении автоматически проверять и скачивать последнюю версию в фоновом режиме при запуске.',
memoryRequiresNeo4j: 'Функция памяти требует графовую базу данных Neo4j. Пожалуйста, настройте и включите Neo4j (установите NEO4J_ENABLE=true) перед активацией этой функции.',
memoryHowToEnable: 'Руководство по настройке Neo4j',
vectorStoreEngine: 'Движок векторной БД',
parserEngine: 'Движок парсинга',
storageEngine: 'Движок хранения',
mcpService: 'Сервис MCP',
conversationConfig: 'Настройки диалога',
conversationStrategy: 'Стратегия диалога',
versionInfo: 'Информация о версии',
tenantInfo: 'Информация о арендаторе',
apiInfo: 'Информация API',
navGroups: {
account: 'Аккаунт',
workspace: 'Пространство',
modelsRuntime: 'Модели',
dataExtensions: 'Данные и расширения',
platform: 'Платформа',
},
roleDenied: {
title: 'Недостаточно прав',
desc: 'Ваша роль не позволяет открыть этот раздел настроек. Обратитесь к администратору арендатора, чтобы запросить нужную роль.',
},
weknoraCloud: {
title: 'WeKnora Cloud',
description: 'Настройте учётные данные APPID и APPSECRET для WeKnora Cloud. Данные используются для модельных сервисов и движка парсинга документов.',
viewDocs: 'Документация',
unconfigured: 'Учётные данные не настроены. Заполните APPID и APPSECRET.',
configured: 'Учётные данные настроены, статус в норме.',
expired: 'Учётные данные WeKnora Cloud истекли',
expiredDefault: 'Ключ шифрования изменился после перезапуска. Сохранённые данные не могут быть расшифрованы. Введите данные заново.',
reconfigure: 'Перенастроить',
appIdLabel: 'APPID',
appIdDesc: 'ID приложения WeKnora Cloud',
appIdPlaceholder: 'Введите APPID',
appSecretLabel: 'APPSECRET',
appSecretDesc: 'Секрет приложения WeKnora Cloud',
appSecretPlaceholder: 'Введите APPSECRET',
saveHint: 'Данные будут проверены и зашифрованы перед сохранением.',
saveBtn: 'Сохранить',
usageTitle: 'Инструкция',
usageSteps: '1. Сохраните APPID и APPSECRET\n2. Добавьте chat, embedding, rerank и vlm в разделе «Облачные модели» ниже\n3. Парсинг: Настройки БЗ → Движок парсинга → WeKnora Cloud',
fillRequired: 'Заполните APPID и APPSECRET',
saveSuccess: 'Учётные данные сохранены',
saveFailed: 'Не удалось сохранить данные',
credentialConfigured: 'Учётные данные WeKnoraCloud настроены.',
credentialExpired: 'Данные истекли. Перенастройте.',
credentialUnconfigured: 'Учётные данные WeKnoraCloud не настроены. Заполните APPID и APPSECRET.',
checkingStatus: 'Проверка статуса...',
goToSettings: 'Перейти в настройки',
modelHintConfigured: 'Учётные данные WeKnoraCloud настроены. Поддерживаемые модели см. в',
modelHintDocsLink: 'документации API',
modelsSection: {
title: 'Облачные модели',
descReady: 'Зарегистрируйте четыре стандартные модели WeKnora Cloud для чата, поиска, реранкинга и зрения.',
descPending: 'Сначала сохраните учётные данные выше, затем добавьте модели здесь.',
statusAdded: 'Добавлена',
statusPending: 'Нужны учётные данные',
addOne: 'Добавить',
addAllBtn: 'Добавить все отсутствующие ({count})',
addAllConfirm: 'Подтвердить',
confirmAddOne: 'Добавить модель {type} «{name}»?',
confirmAddAll: 'Добавить все {count} отсутствующих облачных моделей сразу?',
allReady: 'Все четыре облачные модели готовы',
},
addModelsSuccess: 'Успешно добавлено моделей: {count}',
addModelsPartial: 'Добавлено: {success}, ошибок: {failed}',
addModelsFailed: 'Не удалось добавить модели',
addModelsEmbeddingFailed: 'Тест подключения Embedding не пройден; не удалось определить размерность вектора',
addModelsDisplayName: {
chat: 'WeKnoraCloud Chat',
embedding: 'WeKnoraCloud Embedding',
rerank: 'WeKnoraCloud ReRank',
vllm: 'WeKnoraCloud Vision',
},
},
system: 'Настройки системы',
systemConfig: 'Системная конфигурация',
knowledgeBaseSettings: 'Настройки базы знаний',
configureKbModels: 'Настройка моделей и параметров разделения документов для этой базы знаний',
manageSystemModels: 'Управление и обновление системных моделей и конфигураций сервисов',
basicInfo: 'Основная информация',
documentSplitting: 'Разделение документов',
apiEndpoint: 'API конечная точка',
enterApiEndpoint: 'Введите API конечную точку, например: http://localhost',
enterApiKey: 'Введите API ключ',
enterKnowledgeBaseId: 'Введите ID базы знаний',
saveConfig: 'Сохранить конфигурацию',
reset: 'Сбросить',
configSaved: 'Конфигурация сохранена успешно',
enterApiEndpointRequired: 'Введите API конечную точку',
enterApiKeyRequired: 'Введите API ключ',
enterKnowledgeBaseIdRequired: 'Введите ID базы знаний',
name: 'Название',
enterName: 'Введите название',
description: 'Описание',
chunkSize: 'Размер блока',
chunkOverlap: 'Перекрытие блоков',
save: 'Сохранить',
saving: 'Сохранение...',
saveSuccess: 'Сохранено успешно',
saveFailed: 'Не удалось сохранить',
model: 'Модель',
llmModel: 'LLM модель',
embeddingModel: 'Модель встраивания',
rerankModel: 'Модель ранжирования',
vlmModel: 'Мультимодальная модель',
modelName: 'Название модели',
modelUrl: 'URL модели',
apiKey: 'API ключ',
cancel: 'Отмена',
saveFailedSettings: 'Не удалось сохранить настройки',
enterNameRequired: 'Введите название',
parser: {
title: 'Парсер',
description: 'Состояние и конфигурация парсеров документов. Настройки здесь приоритетнее переменных окружения сервера. Оставьте пустым для значений по умолчанию.',
// Section / label keys for the redesigned drawer
supportedFileTypes: 'Поддерживаемые форматы',
statusSection: 'Статус',
configSection: 'Конфигурация',
featuresLabel: 'Опции',
loading: 'Загрузка...',
retry: 'Повторить',
noEngineDetected: 'Парсеры не обнаружены. Убедитесь, что сервис DocReader работает.',
disconnected: 'Отключено',
connected: 'Подключено',
available: 'Доступен',
unavailable: 'Недоступен',
builtinDesc: 'Встроенный парсер DocReader (docx/pdf/xlsx и другие сложные форматы)',
currentAddr: 'Текущий',
envVarHint: 'Для изменения установите переменные DOCREADER_ADDR и DOCREADER_TRANSPORT (grpc/http), затем перезапустите сервис.',
selfHostedEndpoint: 'Собственная конечная точка',
formulaRecognition: 'Распознавание формул',
tableRecognition: 'Распознавание таблиц',
sealRecognition: 'Распознавание печатей',
chartRecognition: 'Распознавание диаграмм',
language: 'Язык',
testConnection: 'Проверить с текущими параметрами',
saveConfig: 'Сохранить конфигурацию',
docs: 'Документация',
loadFailed: 'Не удалось загрузить список парсеров',
ensureDocreaderConnected: 'Убедитесь, что сервис DocReader настроен через переменные окружения и подключён',
checkDoneStatusUpdated: 'Проверка выполнена. Статус выше обновлён.',
checkSuccess: 'Тест подключения пройден успешно',
checkFailed: 'Проверка не пройдена',
saveSuccess: 'Сохранено',
saveFailed: 'Ошибка сохранения',
mineruEndpointPlaceholder: 'напр. https://your-mineru.example.com',
defaultPipeline: 'Pipeline по умолчанию',
languagePlaceholder: 'напр. ch, en, ja (по умолчанию ch)',
mineruCloudApiKeyPlaceholder: 'MinerU Cloud API Key',
vlmLabel: 'vlm (визуальная языковая модель)',
mineruHtmlLabel: 'MinerU-HTML (HTML парсинг)',
paddleocrVlEndpointPlaceholder: 'напр. http://your-paddleocr-vl:8080',
paddleocrVlEndpointHint: 'Адрес полного сервиса PaddleOCR-VL (pipeline); суффикс /layout-parsing не требуется',
paddleocrVlCloudTokenPlaceholder: 'Токен PaddleOCR-VL AI Studio'
},
storage: {
title: 'Хранилище',
description: 'Настройте хранение документов и изображений. Здесь задаются параметры хранилищ; в базе знаний выбирается только тип хранилища.',
// Section / label keys for the redesigned drawer
basicSection: 'Основное',
modeSection: 'Режим развёртывания',
credentialsSection: 'Учётные данные',
bucketSection: 'Bucket',
useSslDesc: 'Подключаться к MinIO по HTTPS',
loading: 'Загрузка...',
retry: 'Повторить',
defaultEngine: 'Хранилище по умолчанию',
defaultEngineDesc: 'Хранилище по умолчанию при создании новых баз знаний',
engineLocal: 'Локальное',
engineCos: 'Tencent Cloud COS',
engineTos: 'Volcengine TOS',
engineOss: 'Alibaba Cloud OSS',
engineS3: 'AWS S3',
localTitle: 'Локальное хранилище',
localDesc: 'Хранение файлов в локальной файловой системе сервера. Подходит только для однонодового развёртывания.',
available: 'Доступно',
needsConfig: 'Требует настройки',
configurable: 'Настраиваемое',
pathPrefix: 'Префикс пути (необязательно)',
pathPrefixPlaceholder: 'напр. weknora/images',
prefixPlaceholder: 'напр. weknora',
bucketName: 'Имя бакета',
bucketSelectPlaceholder: 'Выберите или введите имя бакета',
bucketPlaceholder: 'Имя бакета',
minioDesc: 'S3-совместимое самостоятельно размещаемое объектное хранилище для внутренних сетей и частного облака.',
minioDocker: 'Docker-развёртывание',
minioRemote: 'Удалённый MinIO',
detected: 'Обнаружено',
notDetected: 'Не обнаружено',
minioDockerDetected: 'Обнаружены переменные окружения MinIO из Docker. Информация о подключении предоставляется через переменные окружения.',
minioDockerNotDetected: 'Переменные окружения MinIO (MINIO_ENDPOINT и др.) не обнаружены. Проверьте конфигурацию Docker Compose.',
minioRemoteHint: 'Подключение к удалённому MinIO. Требуется ручной ввод параметров подключения.',
cosTitle: 'Tencent Cloud COS',
cosDesc: 'Объектное хранилище Tencent Cloud для публичного облака с поддержкой CDN-ускорения.',
cosSecretIdPlaceholder: 'Tencent Cloud API SecretId',
cosSecretKeyPlaceholder: 'Tencent Cloud API SecretKey',
cosAppIdPlaceholder: 'Tencent Cloud Account AppID',
tosTitle: 'Volcengine TOS',
tosDesc: 'Объектное хранилище Volcengine (TOS) для публичного облака.',
tosAccessKeyPlaceholder: 'Volcengine Access Key',
tosSecretKeyPlaceholder: 'Volcengine Secret Key',
s3Title: 'AWS S3',
s3Desc: 'AWS S3 и совместимые сервисы объектного хранилища для публичного облака.',
s3AccessKeyPlaceholder: 'AWS Access Key',
s3SecretKeyPlaceholder: 'AWS Secret Key',
ks3Title: 'Kingsoft Cloud KS3',
ks3Desc: 'Объектное хранилище Kingsoft Cloud (KS3), подходит для публичного облака.',
ks3AccessKeyPlaceholder: 'Kingsoft Cloud Access Key',
ks3SecretKeyPlaceholder: 'Kingsoft Cloud Secret Key',
ks3EndpointPlaceholder: 'e.g. ks3-cn-beijing.ksyuncs.com',
ks3RegionPlaceholder: 'e.g. BEIJING',
engineKs3: 'Kingsoft Cloud KS3',
obsTitle: 'Huawei Cloud OBS',
obsDesc: 'Объектное хранилище Huawei Cloud (OBS), подходит для публичного облака.',
obsAccessKeyPlaceholder: 'Huawei Cloud Access Key',
obsSecretKeyPlaceholder: 'Huawei Cloud Secret Key',
obsEndpointPlaceholder: 'e.g. obs.cn-north-4.myhuaweicloud.com',
obsRegionPlaceholder: 'e.g. cn-north-4',
engineObs: 'Huawei Cloud OBS',
ossTitle: 'Alibaba Cloud OSS',
ossDesc: 'Объектное хранилище Alibaba Cloud (OSS), подходит для публичного облака.',
ossAccessKeyPlaceholder: 'Alibaba Cloud Access Key',
ossSecretKeyPlaceholder: 'Alibaba Cloud Secret Key',
console: 'Консоль',
docs: 'Документация',
testConnection: 'Тест подключения',
saveConfig: 'Сохранить конфигурацию',
loadFailed: 'Ошибка загрузки',
saveSuccess: 'Сохранено',
saveFailed: 'Ошибка сохранения',
unknownError: 'Неизвестная ошибка',
requestFailed: 'Ошибка запроса',
cos: 'Tencent Cloud COS',
tos: 'Volcengine TOS',
oss: 'Alibaba Cloud OSS',
ks3: 'Kingsoft Cloud KS3',
obs: 'Huawei Cloud OBS',
}
},
webSearchSettings: {
title: 'Настройки веб-поиска',
description: 'Настройте веб-поиск, чтобы ответы могли включать актуальную информацию из интернета.',
// Section keys for the redesigned drawer
basicSection: 'Основное',
credentialsSection: 'Подключение',
optionsSection: 'Опции',
providersTitle: 'Поисковые провайдеры',
addProvider: 'Добавить провайдер',
editProvider: 'Редактировать провайдер',
noProviders: 'Поисковые провайдеры не настроены. Нажмите «Добавить провайдер», чтобы начать.',
deleteConfirm: 'Вы уверены, что хотите удалить этот провайдер?',
default: 'По умолчанию',
providerNameLabel: 'Название',
providerNamePlaceholder: 'Напр., Продакшн Bing Поиск',
providerTypeLabel: 'Тип провайдера',
providerDescLabel: 'Описание',
providerDescPlaceholder: 'Опционально, например: для тестовой среды',
engineIdLabel: 'ID движка',
setAsDefault: 'Установить по умолчанию',
free: 'Бесплатно',
viewDocs: 'Документация для получения ключа',
apiKeyUnchanged: 'Оставьте пустым, чтобы сохранить текущий ключ',
testConnection: 'Проверить соединение',
testing: 'Тестирование...',
noDescription: "Нет описания",
noProvidersDesc: "Добавьте провайдера веб-поиска, чтобы позволить вашим агентам получать информацию из Интернета в реальном времени.",
basicInfo: "Основная информация",
credentials: "Учетные данные",
setAsDefaultDesc: "Этот провайдер будет использоваться по умолчанию, если агент не укажет свой",
searchBehaviorTitle: 'Поведение поиска',
defaultProviderLabel: 'Провайдер по умолчанию',
defaultProviderDescription: 'Выберите провайдер поиска по умолчанию для агентов, не указавших собственный.',
providerLabel: 'Провайдер поиска',
providerDescription: 'Выберите поисковый сервис, используемый для веб-поиска',
providerPlaceholder: 'Выберите поисковую систему...',
proxyUrlLabel: 'HTTP-прокси',
proxyUrlPlaceholder: 'Напр. http://127.0.0.1:7890 (необязательно)',
proxyUrlHelp: 'Укажите, если доступ к API поиска нужен через прокси; иначе используются переменные HTTP_PROXY/HTTPS_PROXY.',
apiKeyLabel: 'API-ключ',
baseUrlLabel: 'URL экземпляра',
baseUrlPlaceholder: 'https://searxng.example.com',
apiKeyDescription: 'Введите API-ключ выбранного провайдера поиска',
apiKeyPlaceholder: 'Введите API-ключ',
maxResultsLabel: 'Максимум результатов',
maxResultsDescription: 'Максимальное количество результатов за один поиск (1-50)',
includeDateLabel: 'Включать дату публикации',
includeDateDescription: 'Добавлять информацию о дате публикации в результаты поиска',
compressionLabel: 'Метод сжатия',
compressionDescription: 'Выберите, как обрабатывать содержимое результатов поиска',
compressionNone: 'Без сжатия',
compressionSummary: 'LLM-конспект',
blacklistLabel: 'Чёрный список URL',
blacklistDescription: 'Исключите домены или URL из результатов. По одному в строке. Поддерживаются подстановки (*) и регулярные выражения (/pattern/).',
blacklistPlaceholder: `Например:
*://*.example.com/*
/example\.(net|org)/`,
errors: {
unknown: 'Неизвестная ошибка'
},
toasts: {
loadProvidersFailed: 'Не удалось загрузить список поисковых провайдеров: {message}',
saveSuccess: 'Настройки веб-поиска сохранены',
saveFailed: 'Не удалось сохранить настройки: {message}',
providerCreated: 'Поисковый провайдер создан',
providerUpdated: 'Поисковый провайдер обновлён',
providerDeleted: 'Поисковый провайдер удалён',
testSuccess: 'Подключение успешно',
testFailed: 'Подключение не удалось',
}
},
vectorStoreSettings: {
title: 'Движок векторной базы данных',
description: 'Регистрация и управление экземплярами векторных баз данных для поиска по базе знаний.',
// Section key for the redesigned drawer
basicSection: 'Основное',
storesTitle: 'Векторные базы данных',
addStore: 'Добавить базу данных',
editStore: 'Редактировать базу данных',
deleteConfirm: 'Вы уверены, что хотите удалить эту векторную базу данных?',
emptyDesc: 'Векторные базы данных не настроены. Нажмите "Добавить базу данных", чтобы начать.',
engineTypeLabel: 'Тип движка',
nameLabel: 'Название',
namePlaceholder: 'например, my-vector-store',
connectionInfo: 'Информация о подключении',
advancedIndexConfig: 'Расширенные настройки',
fields: {
addr: 'URL',
host: 'Хост',
port: 'Порт',
username: 'Имя пользователя',
password: 'Пароль',
api_key: 'API ключ',
use_tls: 'Использовать TLS',
scheme: 'Схема',
grpc_address: 'gRPC адрес',
database: 'Имя базы данных',
use_default_connection: 'Использовать подключение по умолчанию',
index_name: 'Имя индекса',
number_of_shards: 'Шарды',
number_of_replicas: 'Реплики',
collection_prefix: 'Префикс коллекции',
collection_name: 'Имя коллекции',
shard_number: 'Количество шардов',
replication_factor: 'Фактор репликации',
shards_num: 'Шарды',
replica_number: 'Реплики в памяти',
desired_shard_count: 'Количество шардов',
insecure_skip_verify: 'Пропустить проверку TLS',
hnsw_m: 'HNSW M (степень графа)',
hnsw_ef_construction: 'HNSW ef_construction',
hnsw_ef_search: 'HNSW ef_search',
knn_engine: 'Движок k-NN',
},
envTag: 'DEFAULT',
testConnection: 'Тест подключения',
testing: 'Тестирование...',
immutableNotice: 'Тип движка, подключение и настройки индекса нельзя изменить после создания.\nДля изменения удалите и создайте заново.',
insecureSkipVerifyWarning: 'Отключение проверки сертификата TLS делает соединение уязвимым для атак «человек посередине». Используйте только для dev-кластеров с самоподписанными сертификатами — никогда в продакшене.',
validation: {
nameRequired: 'Название обязательно',
engineTypeRequired: 'Тип движка обязателен',
fieldRequired: '{field} обязательно',
indexNamePattern: 'Должно начинаться с буквы. Допускаются только буквы, цифры, подчёркивание и дефис (макс. 128)',
},
toasts: {
storeCreated: 'Векторная база данных создана',
storeUpdated: 'Векторная база данных обновлена',
storeDeleted: 'Векторная база данных удалена',
testSuccess: 'Тест подключения успешен',
testFailed: 'Тест подключения не удался',
duplicateName: 'Векторная база данных с таким именем уже существует',
errorGeneric: 'Произошла ошибка. Попробуйте снова.',
},
},
chatHistorySettings: {
title: 'Управление сообщениями',
description: 'Настройте базу знаний истории чата для автоматической индексации сообщений и семантического поиска',
enableLabel: 'Включить индексацию сообщений',
enableDescription: 'При включении новые сообщения будут автоматически индексироваться в базу знаний для векторного поиска',
embeddingModelLabel: 'Модель Embedding',
embeddingModelDescription: 'Выберите модель встраивания для векторизации сообщений чата',
embeddingModelLocked: 'Сообщения уже индексированы; модель встраивания нельзя изменить (требуется очистка индексных данных)',
statsTitle: 'Статистика индексации',
statsIndexedMessages: 'Проиндексированные сообщения',
statsNotConfigured: 'Индексация сообщений не настроена',
statsNotConfiguredDesc: 'Включите и выберите модель Embedding для автоматической индексации сообщений',
toasts: {
saveSuccess: 'Конфигурация управления сообщениями сохранена',
saveFailed: 'Не удалось сохранить конфигурацию: {message}',
loadFailed: 'Не удалось загрузить конфигурацию: {message}',
},
},
retrievalSettings: {
title: 'Настройки поиска',
description: 'Настройте глобальные параметры поиска, общие для поиска по знаниям и сообщениям',
embeddingTopKLabel: 'Векторный поиск Top K',
embeddingTopKDescription: 'Максимальное количество результатов векторного поиска',
vectorThresholdLabel: 'Порог векторного сходства',
vectorThresholdDescription: 'Минимальная оценка сходства для векторного поиска (0-1, выше — точнее)',
keywordThresholdLabel: 'Порог совпадения ключевых слов',
keywordThresholdDescription: 'Минимальная оценка совпадения для поиска по ключевым словам (0-1)',
rerankTopKLabel: 'Rerank Top K',
rerankTopKDescription: 'Максимальное количество результатов после повторного ранжирования',
rerankThresholdLabel: 'Порог Rerank',
rerankThresholdDescription: 'Минимальный порог оценки для повторного ранжирования (от -10 до 10)',
rerankModelLabel: 'Модель Rerank',
rerankModelDescription: 'Выберите модель для повторного ранжирования результатов поиска',
rerankModelRequired: 'Пожалуйста, выберите модель Rerank. Функция поиска требует эту модель для ранжирования результатов.',
toasts: {
saveSuccess: 'Конфигурация поиска сохранена',
saveFailed: 'Не удалось сохранить конфигурацию: {message}',
},
},
graphSettings: {
title: 'Настройки графа знаний',
description: 'Настройте извлечение сущностей и отношений для автоматического построения графа знаний из текста (примечание: это не то же самое, что «граф ссылок страниц» внутри Wiki — там показаны связи между Wiki-страницами, а здесь строится граф сущностей и отношений на основе LLM)',
enableLabel: 'Включить извлечение сущностей и отношений',
enableDescription: 'Автоматически извлекать сущности и отношения из текста при включении',
tagsLabel: 'Типы отношений',
tagsDescription: 'Определите теги типов отношений для извлечения, разделённые запятыми',
tagsPlaceholder: 'Введите типы отношений, например: работает_в, коллега, друг',
generateRandomTags: 'Сгенерировать случайные теги',
sampleTextLabel: 'Образец текста',
sampleTextDescription: 'Образец текста для тестирования извлечения сущностей и отношений',
sampleTextPlaceholder: 'Введите текст, содержащий сущности и отношения...',
generateRandomText: 'Сгенерировать случайный текст',
entityListLabel: 'Список сущностей',
entityListDescription: 'Сущности и их атрибуты, извлечённые из текста',
nodeNamePlaceholder: 'Введите имя сущности',
attributePlaceholder: 'Введите значение атрибута',
addAttribute: 'Добавить атрибут',
manageEntitiesLabel: 'Управление сущностями',
manageEntitiesDescription: 'Добавить или удалить узлы сущностей',
addEntity: 'Добавить сущность',
relationListLabel: 'Список отношений',
relationListDescription: 'Определите связи отношений между сущностями',
selectEntity: 'Выберите сущность',
selectRelationType: 'Выберите тип отношения',
manageRelationsLabel: 'Управление отношениями',
manageRelationsDescription: 'Добавить или удалить отношения между сущностями',
addRelation: 'Добавить отношение',
extractActionsLabel: 'Действия извлечения',
extractActionsDescription: 'Выполнить извлечение сущностей и отношений или управлять образцами данных',
startExtraction: 'Начать извлечение',
extracting: 'Извлечение...',
defaultExample: 'Пример по умолчанию',
clearExample: 'Очистить пример',
completeModelConfig: 'Пожалуйста, сначала завершите настройку модели',
tagsGenerated: 'Теги успешно сгенерированы',
tagsGenerateFailed: 'Не удалось сгенерировать теги',
textGenerated: 'Текст успешно сгенерирован',
textGenerateFailed: 'Не удалось сгенерировать текст',
pleaseInputText: 'Пожалуйста, сначала введите образец текста',
extractSuccess: 'Извлечение сущностей и отношений выполнено успешно',
extractFailed: 'Не удалось извлечь сущности и отношения',
exampleLoaded: 'Пример загружен',
exampleCleared: 'Пример очищен',
disabledWarning: 'База данных графа знаний не включена, извлечение сущностей и отношений будет недоступно',
howToEnable: 'Как включить граф знаний?',
saveSuccess: 'Настройки графа сохранены',
saveFailed: 'Не удалось сохранить настройки: {message}',
errors: {
unknown: 'Неизвестная ошибка'
}
},
initialization: {
title: 'Инициализация',
welcome: 'Добро пожаловать в WeKnora',
description: 'Пожалуйста, настройте систему перед началом работы',
step1: 'Шаг 1: Настройка LLM модели',
step2: 'Шаг 2: Настройка модели встраивания',
step3: 'Шаг 3: Настройка дополнительных моделей',
complete: 'Завершить инициализацию',
skip: 'Пропустить',
next: 'Далее',
previous: 'Назад',
ollamaServiceStatus: 'Статус службы Ollama',
refreshStatus: 'Обновить статус',
ollamaServiceAddress: 'Адрес службы Ollama',
notConfigured: 'Не настроено',
notRunning: 'Не запущено',
normal: 'Нормально',
installedModels: 'Установленные модели',
none: 'Временно отсутствует',
knowledgeBaseInfo: 'Информация о базе знаний',
knowledgeBaseName: 'Название базы знаний',
knowledgeBaseNamePlaceholder: 'Введите название базы знаний',
knowledgeBaseDescription: 'Описание базы знаний',
knowledgeBaseDescriptionPlaceholder: 'Введите описание базы знаний',
llmModelConfig: 'Конфигурация LLM большой языковой модели',
modelSource: 'Источник модели',
local: 'Ollama (локальный)',
remote: 'Remote API (удаленный)',
modelName: 'Название модели',
modelNamePlaceholder: 'Например: qwen3:0.6b',
baseUrl: 'Base URL',
baseUrlPlaceholder: 'Например: https://api.openai.com/v1, удалите часть /chat/completions в конце URL',
apiKey: 'API Key (необязательно)',
apiKeyPlaceholder: 'Введите API Key (необязательно)',
downloadModel: 'Скачать модель',
installed: 'Установлено',
notInstalled: 'Не установлено',
notChecked: 'Не проверено',
checkConnection: 'Проверить соединение',
connectionNormal: 'Соединение в норме',
connectionFailed: 'Ошибка соединения',
checkingConnection: 'Проверка соединения',
embeddingModelConfig: 'Конфигурация модели встраивания',
embeddingWarning: 'В базе знаний уже есть файлы, невозможно изменить конфигурацию модели встраивания',
dimension: 'Размерность',
dimensionPlaceholder: 'Введите размерность вектора',
detectDimension: 'Определить размерность',
rerankModelConfig: 'Конфигурация модели ранжирования',
enableRerank: 'Включить модель ранжирования',
multimodalConfig: 'Мультимодальная конфигурация',
enableMultimodal: 'Включить извлечение информации из изображений',
visualLanguageModelConfig: 'Конфигурация визуально-языковой модели',
interfaceType: 'Тип интерфейса',
openaiCompatible: 'Совместимый с OpenAI интерфейс',
storageServiceConfig: 'Конфигурация службы хранения',
storageType: 'Тип хранения',
bucketName: 'Bucket Name',
bucketNamePlaceholder: 'Введите имя Bucket',
pathPrefix: 'Path Prefix',
pathPrefixPlaceholder: 'Например: images',
secretId: 'Secret ID',
secretIdPlaceholder: 'Введите COS Secret ID',
secretKey: 'Secret Key',
secretKeyPlaceholder: 'Введите COS Secret Key',
region: 'Region',
regionPlaceholder: 'Например: ap-beijing',
appId: 'App ID',
appIdPlaceholder: 'Введите App ID',
functionTest: 'Тест функции',
testDescription: 'Загрузите изображение для тестирования функций описания изображений и распознавания текста модели VLM',
selectImage: 'Выбрать изображение',
startTest: 'Начать тест',
testResult: 'Результат теста',
imageDescription: 'Описание изображения:',
textRecognition: 'Распознавание текста:',
processingTime: 'Время обработки:',
testFailed: 'Тест не удался',
multimodalProcessingFailed: 'Ошибка мультимодальной обработки',
documentSplittingConfig: 'Конфигурация разделения документов',
splittingStrategy: 'Стратегия разделения',
balancedMode: 'Сбалансированный режим',
balancedModeDesc: 'Размер блока: 1000 / Перекрытие: 200',
precisionMode: 'Точный режим',
precisionModeDesc: 'Размер блока: 512 / Перекрытие: 100',
contextMode: 'Контекстный режим',
contextModeDesc: 'Размер блока: 2048 / Перекрытие: 400',
custom: 'Пользовательский',
customDesc: 'Настроить параметры вручную',
chunkSize: 'Размер блока',
chunkOverlap: 'Перекрытие блоков',
separatorSettings: 'Настройки разделителей',
selectOrCustomSeparators: 'Выберите или настройте разделители',
characters: 'символов',
separatorParagraph: 'Разделитель абзацев (\\n\\n)',
separatorNewline: 'Перевод строки (\\n)',
separatorPeriod: 'Точка (。)',
separatorExclamation: 'Восклицательный знак (!)',
separatorQuestion: 'Вопросительный знак (?)',
separatorSemicolon: 'Точка с запятой (;)',
separatorChineseSemicolon: 'Китайская точка с запятой (;)',
separatorComma: 'Запятая (,)',
separatorChineseComma: 'Китайская запятая (,)',
entityRelationExtraction: 'Извлечение сущностей и отношений',
enableEntityRelationExtraction: 'Включить извлечение сущностей и отношений',
relationTypeConfig: 'Конфигурация типов отношений',
relationType: 'Тип отношения',
generateRandomTags: 'Сгенерировать случайные теги',
completeModelConfig: 'Пожалуйста, завершите конфигурацию модели',
systemWillExtract: 'Система будет извлекать соответствующие сущности и отношения из текста в соответствии с выбранными типами отношений',
extractionExample: 'Пример извлечения',
sampleText: 'Пример текста',
sampleTextPlaceholder: 'Введите текст для анализа, например: "Красный особняк", также известный как "Сон в красном тереме", является одним из четырех великих классических произведений китайской литературы, написанным Цинь Сюэцином в династии Цин...',
generateRandomText: 'Сгенерировать случайный текст',
entityList: 'Список сущностей',
nodeName: 'Имя узла',
nodeNamePlaceholder: 'Имя узла',
addAttribute: 'Добавить атрибут',
attributeValue: 'Значение атрибута',
attributeValuePlaceholder: 'Значение атрибута',
addEntity: 'Добавить сущность',
completeEntityInfo: 'Пожалуйста, завершите информацию о сущности',
relationConnection: 'Соединение отношений',
selectEntity: 'Выберите сущность',
addRelation: 'Добавить отношение',
completeRelationInfo: 'Пожалуйста, завершите информацию об отношении',
startExtraction: 'Начать извлечение',
extracting: 'Извлечение...',
defaultExample: 'Пример по умолчанию',
clearExample: 'Очистить пример',
updateKnowledgeBaseSettings: 'Обновить настройки базы знаний',
updateConfigInfo: 'Обновить информацию о конфигурации',
completeConfig: 'Завершить конфигурацию',
waitForDownloads: 'Пожалуйста, дождитесь завершения загрузки всех моделей Ollama перед обновлением конфигурации',
completeModelConfigInfo: 'Пожалуйста, завершите информацию о конфигурации модели',
knowledgeBaseIdMissing: 'Отсутствует ID базы знаний',
knowledgeBaseSettingsUpdateSuccess: 'Настройки базы знаний успешно обновлены',
configUpdateSuccess: 'Конфигурация успешно обновлена',
systemInitComplete: 'Инициализация системы завершена',
operationFailed: 'Операция не удалась',
updateKnowledgeBaseInfoFailed: 'Не удалось обновить базовую информацию о базе знаний',
knowledgeBaseIdMissingCannotSave: 'Отсутствует ID базы знаний, невозможно сохранить конфигурацию',
operationFailedCheckNetwork: 'Операция не удалась, проверьте сетевое соединение',
imageUploadSuccess: 'Изображение успешно загружено, можно начать тестирование',
multimodalConfigIncomplete: 'Мультимодальная конфигурация неполная, пожалуйста, завершите мультимодальную конфигурацию перед загрузкой изображения',
pleaseSelectImage: 'Пожалуйста, выберите изображение',
multimodalTestSuccess: 'Мультимодальный тест успешен',
multimodalTestFailed: 'Мультимодальный тест не удался',
pleaseEnterSampleText: 'Пожалуйста, введите текст примера',
pleaseEnterRelationType: 'Пожалуйста, введите тип отношения',
pleaseEnterLLMModelConfig: 'Пожалуйста, введите конфигурацию LLM большой языковой модели',
noValidNodesExtracted: 'Не извлечено допустимых узлов',
noValidRelationsExtracted: 'Не извлечено допустимых отношений',
extractionFailedCheckNetwork: 'Извлечение не удалось, проверьте сетевое соединение или формат текста',
generateFailedRetry: 'Генерация не удалась, попробуйте еще раз',
pleaseCheckForm: 'Пожалуйста, проверьте правильность заполнения формы',
detectionSuccessful: 'Обнаружение успешно, размерность автоматически заполнена как',
detectionFailed: 'Обнаружение не удалось',
detectionFailedCheckConfig: 'Обнаружение не удалось, проверьте конфигурацию',
modelDownloadSuccess: 'Модель успешно загружена',
modelDownloadFailed: 'Не удалось загрузить модель',
downloadStartFailed: 'Не удалось начать загрузку',
queryProgressFailed: 'Не удалось запросить прогресс',
checkOllamaStatusFailed: 'Не удалось проверить статус Ollama',
getKnowledgeBaseInfoFailed: 'Не удалось получить информацию о базе знаний',
textRelationExtractionFailed: 'Не удалось извлечь текстовые отношения',
pleaseEnterKnowledgeBaseName: 'Пожалуйста, введите название базы знаний',
knowledgeBaseNameLength: 'Длина названия базы знаний должна быть от 1 до 50 символов',
knowledgeBaseDescriptionLength: 'Длина описания базы знаний не может превышать 200 символов',
pleaseEnterLLMModelName: 'Пожалуйста, введите название LLM модели',
pleaseEnterBaseURL: 'Пожалуйста, введите BaseURL',
pleaseEnterEmbeddingModelName: 'Пожалуйста, введите название модели встраивания',
pleaseEnterEmbeddingDimension: 'Пожалуйста, введите размерность встраивания',
dimensionMustBeInteger: 'Размерность должна быть допустимым целым числом, обычно 768, 1024, 1536, 3584 и т.д.',
pleaseEnterTextContent: 'Пожалуйста, введите текстовое содержание',
textContentMinLength: 'Текстовое содержание должно содержать не менее 10 символов',
pleaseEnterValidTag: 'Пожалуйста, введите действительный тег',
tagAlreadyExists: 'Этот тег уже существует',
checkFailed: 'Проверка не удалась',
startingDownload: 'Запуск загрузки...',
downloadStarted: 'Загрузка началась',
model: 'Модель',
startModelDownloadFailed: 'Не удалось запустить загрузку модели',
downloadCompleted: 'Загрузка завершена',
downloadFailed: 'Загрузка не удалась',
knowledgeBaseSettingsModeMissingId: 'В режиме настроек базы знаний отсутствует ID базы знаний',
completeEmbeddingConfig: 'Пожалуйста, сначала полностью заполните конфигурацию встраивания',
detectionSuccess: 'Обнаружение успешно,',
dimensionAutoFilled: 'размерность автоматически заполнена:',
checkFormCorrectness: 'Пожалуйста, проверьте правильность заполнения формы',
systemInitializationCompleted: 'Инициализация системы завершена',
generationFailedRetry: 'Генерация не удалась, пожалуйста, попробуйте еще раз',
chunkSizeDesc: 'Размер каждого текстового блока. Большие блоки сохраняют больше контекста, но могут снизить точность поиска.',
chunkOverlapDesc: 'Количество символов, перекрывающихся между соседними блоками. Помогает сохранить контекст на границах блоков.',
selectRelationType: 'Выберите тип отношения'
},
auth: {
login: 'Вход',
logout: 'Выход',
oidcLogin: 'Войти через OIDC',
oidcLoginWithProvider: 'Войти через {provider}',
redirectingToOIDC: 'Перенаправление к поставщику удостоверений...',
orContinueWith: 'Или продолжить с помощью',
oidcLoginFailed: 'Ошибка входа через OIDC',
oidcStateMismatch: 'Не удалось проверить состояние OIDC, попробуйте снова',
username: 'Имя пользователя',
email: 'Почта Email',
password: 'Пароль',
confirmPassword: 'Подтвердите пароль',
rememberMe: 'Запомнить меня',
forgotPassword: 'Забыли пароль?',
loginSuccess: 'Вход выполнен успешно!',
loginSuccessTitle: 'Вход выполнен',
loginSuccessContent: 'С возвращением. Вы вошли в {name}',
loginSuccessContentWithRole: 'С возвращением. Вы вошли в {name} · роль {role}',
loginFailed: 'Ошибка входа',
loggingIn: 'Вход...',
register: 'Регистрация',
registering: 'Регистрация...',
createAccount: 'Создать аккаунт',
haveAccount: 'Уже есть аккаунт?',
noAccount: 'Ещё нет аккаунта?',
backToLogin: 'Вернуться ко входу',
registerNow: 'Зарегистрироваться',
loginHint: 'Войдите, чтобы продолжить, или создайте аккаунт ниже, если вы впервые здесь.',
firstTime: 'Впервые в WeKnora?',
registerSuccess: 'Регистрация успешна! Система создала для вас эксклюзивного арендатора, пожалуйста, войдите',
registerFailed: 'Ошибка регистрации',
subtitle: 'RAG, ReAct-агент и Wiki — корпоративный фреймворк знаний на основе больших моделей',
registerSubtitle: 'После регистрации система создаст для вас эксклюзивного арендатора',
emailPlaceholder: 'Введите адрес электронной почты',
passwordPlaceholder: 'Введите пароль (8-32 символа, включая буквы и цифры)',
confirmPasswordPlaceholder: 'Введите пароль ещё раз',
usernamePlaceholder: 'Введите имя пользователя',
emailRequired: 'Введите адрес электронной почты',
emailInvalid: 'Введите правильный формат электронной почты',
passwordRequired: 'Введите пароль',
passwordMinLength: 'Пароль должен быть не менее 8 символов',
passwordMaxLength: 'Пароль не может превышать 32 символа',
passwordMustContainLetter: 'Пароль должен содержать буквы',
passwordMustContainNumber: 'Пароль должен содержать цифры',
usernameRequired: 'Введите имя пользователя',
usernameMinLength: 'Имя пользователя должно быть не менее 2 символов',
usernameMaxLength: 'Имя пользователя не может превышать 20 символов',
usernameInvalid: 'Имя пользователя может содержать только буквы, цифры, подчёркивания и китайские иероглифы',
confirmPasswordRequired: 'Подтвердите пароль',
passwordMismatch: 'Введённые пароли не совпадают',
loginError: 'Ошибка входа, пожалуйста, проверьте электронную почту или пароль',
loginErrorRetry: 'Ошибка входа, пожалуйста, повторите попытку позже',
registerError: 'Ошибка регистрации, пожалуйста, повторите попытку позже',
forgotPasswordNotAvailable: 'Функция восстановления пароля временно недоступна, пожалуйста, свяжитесь с администратором'
},
authStore: {
errors: {
parseUserFailed: 'Не удалось разобрать данные пользователя',
parseTenantFailed: 'Не удалось разобрать данные арендатора',
parseKnowledgeBasesFailed: 'Не удалось разобрать список баз знаний',
parseCurrentKnowledgeBaseFailed: 'Не удалось разобрать текущую базу знаний'
}
},
common: {
confirm: 'Подтвердить',
cancel: 'Отмена',
save: 'Сохранить',
delete: 'Удалить',
edit: 'Редактировать',
default: 'По умолчанию',
create: 'Создать',
search: 'Поиск',
filter: 'Фильтр',
export: 'Экспорт',
import: 'Импорт',
upload: 'Загрузить',
download: 'Скачать',
refresh: 'Обновить',
loading: 'Загрузка...',
noData: 'Нет данных',
noMoreData: 'Весь контент загружен',
error: 'Ошибка',
success: 'Успешно',
failed: 'Ошибка',
warning: 'Предупреждение',
info: 'Информация',
selectAll: 'Выбрать все',
yes: 'Да',
no: 'Нет',
ok: 'OK',
close: 'Закрыть',
back: 'Назад',
next: 'Далее',
finish: 'Завершить',
all: 'Все',
reset: 'Сбросить',
clear: 'Очистить',
website: 'Официальный сайт',
chromeExtension: 'Расширение Chrome',
clawhubSkill: 'Claw Skill',
newBadge: 'New',
github: 'GitHub',
githubStarTip: 'Открыть репозиторий на GitHub — поставьте Star, если проект полезен',
on: 'Вкл',
off: 'Выкл',
resetToDefault: 'Сбросить по умолчанию',
confirmDelete: 'Подтвердить удаление',
deleteSuccess: 'Успешно удалено',
deleteFailed: 'Ошибка удаления',
saveSuccess: 'Успешно сохранено',
saveFailed: 'Ошибка сохранения',
file: 'Файл',
knowledgeBase: 'База знаний',
noResult: 'Нет результатов',
remove: 'Удалить',
defaultUser: 'Пользователь',
copyFailed: 'Ошибка копирования',
retry: 'Повторить',
expand: 'Развернуть',
collapse: 'Свернуть',
me: 'Я',
copy: 'Копировать',
copied: 'Скопировано'
},
mentionDetail: {
faqCount: '{count} вопросов и ответов',
kbCount: '{count} документов',
belongsToKb: 'База знаний: ',
belongsToOrg: 'Пространство: ',
readOnlyFromAgent: 'Только чтение (от агента)',
noCompatibleKbForAgent: 'Инструменты текущего агента не соответствуют возможностям ни одной базы знаний в области видимости — нечего упомянуть.'
},
file: {
upload: 'Загрузить файл',
uploadSuccess: 'Файл успешно загружен',
uploadFailed: 'Ошибка загрузки файла',
delete: 'Удалить файл',
deleteSuccess: 'Файл успешно удален',
deleteFailed: 'Ошибка удаления файла',
download: 'Скачать файл',
preview: 'Предпросмотр',
unsupportedFormat: 'Неподдерживаемый формат файла',
maxSizeExceeded: 'Превышен максимальный размер файла',
selectFile: 'Выберите файл'
},
tenant: {
title: 'Информация об арендаторе',
currentTenant: 'Текущий арендатор',
switchTenant: 'Переключить рабочее пространство',
switcher: {
menuLabel: 'Переключить рабочее пространство',
currentBadge: 'Текущий',
homeBadge: 'Home',
homeTooltip: 'Ваше основное рабочее пространство',
empty: 'Вы состоите только в одном рабочем пространстве',
},
currentChip: {
home: 'Основной арендатор',
},
sectionDescription: 'Просмотр детальной конфигурации арендатора',
apiDocument: 'Документация API',
name: 'Имя арендатора',
id: 'ID арендатора',
createdAt: 'Дата создания',
updatedAt: 'Дата обновления',
status: 'Статус',
active: 'Активен',
inactive: 'Неактивен',
systemInfo: 'Системная информация',
viewSystemInfo: 'Просмотр информации о версии системы и конфигурации учётной записи пользователя',
version: 'Версия',
buildTime: 'Время сборки',
goVersion: 'Версия Go',
userInfo: 'Информация о пользователе',
userId: 'ID пользователя',
username: 'Имя пользователя',
email: 'Электронная почта',
tenantInfo: 'Информация об арендаторе',
tenantId: 'ID арендатора',
tenantName: 'Название арендатора',
description: 'Описание',
business: 'Бизнес',
noDescription: 'Нет описания',
noBusiness: 'Нет',
statusActive: 'Активен',
statusInactive: 'Не активирован',
statusSuspended: 'Приостановлен',
statusUnknown: 'Неизвестен',
apiKey: 'API Key',
keepApiKeySafe: 'Пожалуйста, храните ваш API Key в безопасности, не раскрывайте его в общественных местах или репозиториях кода',
storageInfo: 'Информация о хранилище',
storageQuota: 'Квота хранилища',
used: 'Использовано',
usage: 'Использование',
apiDevDocs: 'Документация для разработчиков API',
useApiKey: 'Используйте ваш API Key для начала разработки, просмотрите полную документацию API и примеры кода.',
viewApiDoc: 'Просмотреть документацию API',
loadingAccountInfo: 'Загрузка информации об учётной записи...',
loadingInfo: 'Загрузка данных...',
loadFailed: 'Загрузка не удалась',
retry: 'Повторить',
apiKeyCopied: 'API Key скопирован в буфер обмена',
unknown: 'Неизвестно',
formatError: 'Ошибка формата',
searchPlaceholder: 'Поиск по имени или введите ID арендатора...',
searchHint: 'Поиск по имени или введите ID арендатора напрямую',
noMatch: 'Не найдено подходящих арендаторов',
switchSuccessTitle: 'Пространство переключено',
switchSuccessContent: 'Вы вошли в {name}',
switchSuccessContentWithRole: 'Вы вошли в {name} · роль {role}',
loadTenantsFailed: 'Не удалось загрузить список арендаторов',
loading: 'Загрузка...',
loadMore: 'Загрузить еще',
create: {
action: 'Создать новое рабочее пространство',
dialogTitle: 'Создать новое рабочее пространство',
dialogSubtitle: 'У рабочего пространства собственные базы знаний и участники. Вы станете его владельцем.',
nameLabel: 'Название',
namePlaceholder: 'Например: Мой новый проект',
nameRequired: 'Введите название рабочего пространства',
descriptionLabel: 'Описание (необязательно)',
descriptionPlaceholder: 'Кратко опишите назначение рабочего пространства',
submit: 'Создать',
cancel: 'Отмена',
success: 'Рабочее пространство создано',
failed: 'Не удалось создать рабочее пространство',
},
details: {
idLabel: 'ID арендатора',
idDescription: 'Уникальный идентификатор вашего арендатора',
nameLabel: 'Название арендатора',
nameDescription: 'Название арендатора, к которому вы принадлежите',
descriptionLabel: 'Описание арендатора',
descriptionDescription: 'Подробное описание арендатора',
businessLabel: 'Бизнес арендатора',
businessDescription: 'Бизнес-направление, к которому относится арендатор',
statusLabel: 'Статус арендатора',
statusDescription: 'Текущий рабочий статус арендатора',
createdAtLabel: 'Время создания арендатора',
createdAtDescription: 'Дата и время создания арендатора',
editName: 'Изменить имя',
editNamePlaceholder: 'Введите новое имя арендатора',
editNameConfirm: 'Сохранить',
editNameCancel: 'Отмена',
editNameRequired: 'Имя арендатора не может быть пустым',
editNameSuccess: 'Имя арендатора обновлено',
editNameFailed: 'Не удалось обновить имя арендатора',
editDescription: 'Изменить описание',
editDescriptionPlaceholder: 'Введите новое описание арендатора',
editDescriptionSuccess: 'Описание арендатора обновлено',
editDescriptionFailed: 'Не удалось обновить описание арендатора',
descriptionEmptyPlaceholder: 'Не указано'
},
storage: {
quotaLabel: 'Квота хранения',
quotaDescription: 'Общий объём хранилища, выделенный арендатору',
usedLabel: 'Использовано хранения',
usedDescription: 'Объём уже использованного пространства',
usageLabel: 'Использование хранения',
usageDescription: 'Процент использованного пространства'
},
leaveDangerZone: {
title: 'Покинуть это рабочее пространство',
desc: 'Завершает ваше членство в этом пространстве. Вы потеряете доступ к базам знаний и агентам. Позже вас можно снова пригласить.',
button: 'Покинуть пространство',
},
messages: {
fetchFailed: 'Не удалось получить информацию об арендаторе',
networkError: 'Ошибка сети, попробуйте позже'
},
api: {
title: 'Информация об API',
description: 'Просматривайте и управляйте своим API-ключом',
keyLabel: 'API Key',
keyDescription: 'Ключ для API-запросов. Храните его в безопасности.',
urlLabel: 'URL API',
urlDescription: 'Базовый путь REST API; при вызове добавляйте конкретный путь эндпоинта.',
copyUrlTitle: 'Скопировать URL API',
urlCopySuccess: 'URL API скопирован в буфер обмена',
copyTitle: 'Скопировать API Key',
resetTitle: 'Сбросить API Key',
resetConfirmTitle: 'Сбросить API Key?',
resetConfirmBody: 'После сброса прежний API Key немедленно перестаёт действовать. Все приложения, SDK и скрипты, использующие старый ключ, должны быть переведены на новый ключ. Это действие нельзя отменить.',
resetConfirmOk: 'Сбросить',
resetConfirmCancel: 'Отмена',
resetSuccess: 'API Key сброшен; новый ключ показан в поле выше',
resetFailed: 'Не удалось сбросить API Key',
docLabel: 'Документация API',
docDescription: 'Ознакомьтесь с полной документацией и примерами API,',
openDoc: 'Открыть документацию',
userSectionTitle: 'Информация о пользователе',
userIdLabel: 'ID пользователя',
userIdDescription: 'Ваш уникальный идентификатор пользователя',
usernameLabel: 'Имя пользователя',
usernameDescription: 'Имя, используемое для входа',
emailLabel: 'Электронная почта',
emailDescription: 'Ваш зарегистрированный адрес электронной почты',
createdAtLabel: 'Время регистрации',
createdAtDescription: 'Время создания учётной записи',
noKey: 'API Key отсутствует',
copySuccess: 'API Key скопирован в буфер обмена',
copyFailed: 'Не удалось скопировать, пожалуйста, сделайте это вручную',
desktopPortLabel: 'Локальный порт API (desktop)',
desktopPortDescription:
'Укажите фиксированный порт (например, 37841), чтобы расширение Chrome и другие инструменты всегда использовали один URL API. 0 — случайный порт при каждом запуске. После сохранения перезапустите приложение.',
desktopPortSave: 'Сохранить',
desktopPortSaved: 'Сохранено. Перезапустите приложение, чтобы применить.',
desktopPortSaveFailed: 'Не удалось сохранить',
desktopPortInvalid: 'Введите порт от 0 до 65535',
desktopBindPublicLabel: 'Разрешить доступ к API в LAN',
desktopBindPublicDescription:
'Встроенный сервер слушает 0.0.0.0 — другие устройства в локальной сети смогут обращаться к API по адресу ниже. Риски доступа выше; настройте брандмауэр и маршрутизацию. После изменения перезапустите приложение.',
desktopBindPublicSaved: 'Сохранено. Перезапустите приложение, чтобы применить.',
desktopBindPublicSaveFailed: 'Не удалось сохранить',
lanUrlLabel: 'Базовый URL API для LAN',
lanUrlDescription:
'Отображается после включения доступа в LAN и перезапуска. Если IP неверный, подставьте IPv4 из сетевых настроек системы.',
lanUrlCopyTitle: 'Копировать LAN URL API',
lanUrlCopySuccess: 'LAN URL API скопирован',
lanUrlUnavailable:
'API слушает все интерфейсы, но LAN IPv4 не удалось определить автоматически. Узнайте IPv4 в настройках сети и соберите http://ВАШ_IP:ПОРТ/api/v1 вручную.',
}
},
system: {
title: 'Системная информация',
sectionDescription: 'Просмотр сведений о версии системы и конфигурации учётной записи пользователя',
loadingInfo: 'Загрузка данных...',
retry: 'Повторить',
versionLabel: 'Версия приложения',
versionDescription: 'Версия сервиса приложения (weknora-app)',
frontendVersionLabel: 'Версия UI',
frontendVersionDescription: 'Версия сборки UI (weknora-ui)',
versionMismatch: 'Не совпадает с версией приложения',
buildTimeLabel: 'Время сборки',
buildTimeDescription: 'Время, когда система была собрана',
goVersionLabel: 'Версия Go',
goVersionDescription: 'Версия языка Go, используемая backend',
startedAtLabel: 'Время запуска сервиса',
startedAtDescription: 'Момент последнего запуска текущего процесса backend',
uptimeLabel: 'Время работы',
uptimeDescription: 'Непрерывное время работы с момента этого запуска',
uptimeDays: '{n} д',
uptimeHours: '{n} ч',
uptimeMinutes: '{n} мин',
uptimeSeconds: '{n} с',
dbVersionLabel: 'Версия базы данных',
dbVersionDescription: 'Текущая версия миграции базы данных',
dbMigrationFailedTag: 'Миграция не удалась',
dbMigrationFailedTitle: 'Сбой миграции базы данных',
dbMigrationFailedDesc: 'Миграция базы данных при запуске не завершилась успешно. Часть таблиц или индексов могла не создаться, из-за чего Wiki, граф знаний и другие функции могут не работать. Сначала ознакомьтесь с руководством по диагностике ниже; если проблема сохраняется, сообщите о ней по ссылке.',
dbMigrationViewDocs: 'Открыть руководство по диагностике',
dbMigrationReportIssue: 'Не удаётся починить? Создать issue',
keywordIndexEngineLabel: 'Движок индексации ключевых слов',
keywordIndexEngineDescription: 'Используемый в настоящее время движок индексации ключевых слов',
vectorStoreEngineLabel: 'Движок векторного хранилища',
vectorStoreEngineDescription: 'Используемый в настоящее время движок векторного хранилища',
graphDatabaseEngineLabel: 'Движок графовой базы данных',
graphDatabaseEngineDescription: 'Используемый в настоящее время движок графовой базы данных',
unknown: 'Неизвестно',
messages: {
fetchFailed: 'Не удалось получить информацию о системе',
networkError: 'Ошибка сети, попробуйте позже'
},
globalSettings: {
title: 'Системные настройки',
description: 'Настройки платформы, применяемые в режиме реального времени. Изменения сразу действуют для всех тенантов. Доступны только системным администраторам.',
loading: 'Загрузка...',
empty: 'Нет доступных для настройки параметров',
badgeRequiresRestart: 'Нужен перезапуск',
badgeSecret: 'Конфиденциально',
badgeOverride: 'Переопределено',
badgeOverrideTooltip: 'Это значение сохранено администратором в БД и переопределяет переменную окружения и значение по умолчанию.',
modifiedAt: 'Последнее изменение: {value}',
tagInputPlaceholder: 'Нажмите Enter, чтобы добавить запись, например: example.com / *.foo.com / 10.0.0.0/8',
priorityHint: {
title: 'О приоритете',
tier1: 'Параметры, сохранённые на этой странице (с пометкой «Переопределено»), всегда имеют приоритет — переменная окружения для них игнорируется.',
tier2: 'Параметры, не сохранённые здесь, берутся из переменной окружения, а если её нет — из встроенного значения по умолчанию.',
tier3: 'Чтобы вернуть параметр под управление переменной окружения, нажмите кнопку «Сбросить» в его строке.',
},
keyLabels: {
auth: {
registration_mode: 'Режим самостоятельной регистрации',
},
ssrf: {
whitelist: 'Белый список SSRF-защиты',
},
tenant: {
max_owned_per_user: 'Максимум тенантов на пользователя',
default_storage_quota_gb: 'Квота хранилища для новых тенантов по умолчанию (ГБ)',
},
asynq: {
concurrency: 'Параллелизм воркеров асинхронных задач',
},
},
keyDescriptions: {
auth: {
registration_mode:
'Режим самостоятельной регистрации. self_serve = любой может создать аккаунт; invite_only = открытая регистрация отключена, приглашать могут только Owner/Admin. Вступает в силу сразу после сохранения; используйте self_serve осторожно (в публичном интернете появятся спам-регистрации).',
},
ssrf: {
whitelist:
'Белый список SSRF-защиты. Можно указать example.com / *.foo.com / 10.0.0.0/8 / 2001:db8::1. Вступает в силу сразу после сохранения. Переменная окружения SSRF_WHITELIST_EXTRA по-прежнему задаётся при развёртывании и здесь не переопределяется.',
},
tenant: {
max_owned_per_user:
'Максимальное число тенантов, которыми может владеть обычный (не супер) пользователь через самостоятельное создание. Читается при каждом создании тенанта и вступает в силу сразу после сохранения. 0 — встроенное значение по умолчанию 10; отрицательное значение полностью снимает ограничение (не рекомендуется для публичных развёртываний).',
default_storage_quota_gb:
'Квота хранилища по умолчанию (ГБ) для нового тенанта: векторы, оригиналы, текст, индексы и т.д. Читается только при создании — изменения применяются только к новым тенантам и не перезаписывают существующие. 0 или отрицательное значение — встроенное значение по умолчанию 10 ГБ.',
},
asynq: {
concurrency:
'Параллелизм воркеров асинхронных задач (размер пула потоков asynq). Парсинг документов, эмбеддинги и подобные задачи в основном ждут I/O, поэтому увеличение значения сокращает очередь при массовой загрузке. Для применения требуется перезапуск процесса сервиса.',
},
},
enumLabels: {
auth: {
registration_mode: {
self_serve: 'Самостоятельная (любой может зарегистрироваться)',
invite_only: 'Только по приглашению (открытая регистрация отключена)',
},
},
},
confirm: {
header: 'Подтверждение опасного действия',
confirmBtn: 'Подтвердить сохранение',
cancelBtn: 'Отмена',
emptyValue: '(пусто)',
defaultBody: 'Вы собираетесь изменить «{label}» на: {value}',
bodyAuthRegistrationMode: 'Вы собираетесь изменить «{label}» на: {value}\n\nЕсли переключить на self_serve, любой пользователь публичного интернета сможет создать аккаунт — убедитесь, что это ожидаемое поведение.',
},
listConfirm: {
ssrf: {
whitelist: {
add: {
header: 'Добавить запись в белый список SSRF',
body: 'Добавить {entry} в белый список SSRF? Соответствующие хосты / IP / подсети будут обходить защиту от SSRF и смогут обращаться к внутренним сервисам через агентов. Добавляйте только полностью доверенные записи.',
confirmBtn: 'Добавить',
},
remove: {
header: 'Удалить запись из белого списка SSRF',
body: 'Удалить {entry} из белого списка SSRF? После удаления запись снова будет блокироваться защитой от SSRF.',
confirmBtn: 'Удалить',
},
},
},
},
messages: {
loadFailed: 'Не удалось загрузить системные настройки',
saveSuccess: 'Сохранено',
saveFailed: 'Ошибка сохранения'
},
reset: {
label: 'Сбросить',
tooltip: 'Очистить переопределение из UI и вернуться к переменной окружения или встроенному значению по умолчанию',
confirmBtn: 'Подтвердить сброс',
confirmBody: 'Сбросить «{label}»? Это удалит запись переопределения в БД и вернёт значение из переменной окружения или встроенное по умолчанию.',
success: 'Сброшено к значению по умолчанию',
failed: 'Ошибка сброса'
},
admins: {
label: 'Системные администраторы',
description: 'Пользователи с правами уровня платформы. Введите email и нажмите Enter, чтобы повысить пользователя до администратора; нажмите × на теге, чтобы отозвать права. Вы (текущий пользователь) являетесь администратором и не отображаетесь в списке — отозвать собственные права нельзя.',
placeholder: 'Введите email пользователя и нажмите Enter',
loadFailed: 'Не удалось загрузить системных администраторов',
saveSuccess: 'Системные администраторы обновлены',
saveFailed: 'Ошибка обновления системных администраторов',
confirm: {
promote: {
header: 'Повысить до системного администратора',
body: 'Повысить пользователя {email} до системного администратора? Пользователь получит права уровня платформы: доступ ко всем тенантам, изменение системных настроек и управление списком администраторов.',
confirmBtn: 'Повысить',
},
revoke: {
header: 'Отозвать права администратора',
body: 'Отозвать права системного администратора у {email}? После отзыва пользователь потеряет доступ ко всем системным функциям.',
confirmBtn: 'Отозвать',
},
},
},
bulkApply: {
label: 'Применить ко всем существующим тенантам',
tooltip: 'По умолчанию сохранённое значение применяется только к новым тенантам. Нажмите, чтобы также перезаписать всех существующих.',
confirmBtn: 'Подтвердить применение',
confirmBody: 'Перезаписать квоту хранилища всех существующих тенантов значением {value} ГБ. Тенанты, чью квоту вручную правили эксплуатация, также будут перезаписаны. Продолжить?',
success: 'Обновлена квота хранилища у {count} тенантов: {gb} ГБ',
failed: 'Ошибка применения ко всем тенантам'
},
audit: {
tabLabel: 'Журнал аудита',
description:
'События уровня платформы: изменения системных настроек, выдача/отзыв роли системного администратора, массовая синхронизация квот. Сортировка от новых к старым.',
refresh: 'Обновить',
retry: 'Повторить',
loading: 'Загрузка…',
end: 'Конец списка.',
empty: 'Событий аудита платформы пока нет.',
forbidden: 'Нет прав на просмотр журнала аудита платформы.',
systemActor: 'Система',
errors: {
generic: 'Не удалось загрузить журнал аудита'
},
actorRole: {
system_admin: 'Системный администратор'
},
columns: {
time: 'Время',
actor: 'Кто',
action: 'Событие',
target: 'Цель',
path: 'Запрос',
outcome: 'Результат'
},
action: {
'system.setting_changed': 'Изменена системная настройка',
'system.admin_promoted': 'Выдан системный администратор',
'system.admin_revoked': 'Отозван системный администратор'
},
outcome: {
success: 'Успешно',
denied: 'Отказано'
},
target: {
bulkQuota: 'Массовая синхронизация: квота хранилища по умолчанию',
bulkQuotaDiff: 'Применено к {count} тенантам ({gb} ГБ)',
promoteIdempotent: 'Уже системный администратор (идемпотентно)',
revokeNoop: 'И так не был системным администратором (идемпотентно)',
requiredRole: 'Требуемая роль: {role}',
valueNull: '(не задано)'
},
expanded: {
actorId: 'ID инициатора',
targetUserId: 'ID целевого пользователя',
targetType: 'Тип цели',
targetId: 'ID цели',
details: 'Сырые детали'
}
}
}
},
mcp: {
testResult: {
title: 'Результат теста: {name}',
connectionSuccess: 'Соединение установлено',
connectionFailed: 'Соединение не удалось',
toolsTitle: 'Доступные инструменты',
resourcesTitle: 'Доступные ресурсы',
descriptionLabel: 'Описание',
schemaLabel: 'Структура параметров',
emptyDescription: 'Сервис не предоставил инструменты или ресурсы',
requireApproval: 'Требуется подтверждение',
requireApprovalTip: 'При включении агент ждёт подтверждения перед вызовом инструмента.',
approvalSaveFailed: 'Не удалось сохранить настройку'
}
},
error: {
network: 'Ошибка сети',
server: 'Ошибка сервера',
notFound: 'Не найдено',
unauthorized: 'Не авторизован',
forbidden: 'Доступ запрещен',
unknown: 'Неизвестная ошибка',
tryAgain: 'Пожалуйста, попробуйте еще раз',
networkError: 'Ошибка сети, проверьте подключение',
invalidCredentials: 'Неверное имя пользователя или пароль',
tokenRefreshFailed: 'Не удалось обновить токен',
pleaseRelogin: 'Пожалуйста, войдите снова',
fileSizeExceeded: 'Размер файла не может превышать {size}МБ!',
unsupportedFileType: 'Неподдерживаемый тип файла!',
invalidFileType: 'Неверный тип файла!',
missingKbId: 'Отсутствует ID базы знаний',
tokenNotFound: 'Токен входа не найден, войдите снова',
streamFailed: 'Ошибка потокового соединения',
auth: {
loginFailed: 'Ошибка входа',
registerFailed: 'Ошибка регистрации',
getUserFailed: 'Не удалось получить информацию о пользователе',
getTenantFailed: 'Не удалось получить информацию о тенанте',
updatePreferencesFailed: 'Не удалось обновить настройки',
refreshTokenFailed: 'Не удалось обновить токен',
logoutFailed: 'Ошибка выхода',
validateTokenFailed: 'Ошибка проверки токена'
},
model: {
createFailed: 'Не удалось создать модель',
getFailed: 'Не удалось получить модель',
updateFailed: 'Не удалось обновить модель',
deleteFailed: 'Не удалось удалить модель'
},
tenant: {
listFailed: 'Не удалось получить список тенантов',
searchFailed: 'Не удалось выполнить поиск тенантов',
resetApiKeyFailed: 'Не удалось сбросить API Key',
updateFailed: 'Не удалось обновить информацию об арендаторе'
},
initialization: {
checkFailed: 'Проверка не пройдена',
testFailed: 'Тест не пройден'
},
invalidImageLink: 'Invalid image link'
},
model: {
llmModel: 'LLM модель',
embeddingModel: 'Модель встраивания',
rerankModel: 'Модель ранжирования',
vlmModel: 'Мультимодальная модель',
modelName: 'Название модели',
modelProvider: 'Поставщик модели',
modelUrl: 'URL модели',
apiKey: 'API ключ',
testConnection: 'Проверить соединение',
connectionSuccess: 'Соединение успешно',
connectionFailed: 'Ошибка соединения',
dimension: 'Размерность',
maxTokens: 'Макс. токенов',
temperature: 'Температура',
topP: 'Top P',
selectModel: 'Выберите модель',
customModel: 'Пользовательская модель',
builtinModel: 'Встроенная модель',
defaultTag: 'По умолчанию',
addModelInSettings: 'Перейти в общие настройки для добавления моделей',
loadFailed: 'Не удалось загрузить список моделей',
selectModelPlaceholder: 'Выберите модель',
searchPlaceholder: 'Поиск моделей...',
editor: {
addTitle: 'Добавить модель',
editTitle: 'Редактировать модель',
sectionType: 'Тип модели',
typeLabel: 'Тип модели',
sectionSource: 'Источник',
sectionProvider: 'Настройки провайдера',
sectionAdvanced: 'Дополнительные параметры',
sourceLabel: 'Источник модели',
sourceLocal: 'Ollama',
sourceRemote: 'API',
description: {
chat: 'Настройте языковую модель для диалогов',
embedding: 'Настройте модель встраивания для текстовой векторизации',
rerank: 'Настройте модель для повторного ранжирования результатов',
vllm: 'Настройте визуально-языковую модель для мультимодального понимания',
asr: 'Настройте модель распознавания речи для транскрибации аудио',
default: 'Настройте информацию о модели'
},
modelNamePlaceholder: {
local: 'например: llama2:latest',
remote: 'например: gpt-4, claude-3-opus',
localVllm: 'например: llava:latest',
remoteVllm: 'например: gpt-4-vision-preview',
remoteAsr: 'например: whisper-1'
},
baseUrlLabel: 'Base URL',
displayNameLabel: 'Отображаемое имя (опционально)',
displayNamePlaceholder: 'например: модель поддержки',
displayNameDesc: 'Используется только в интерфейсе. Для вызовов по-прежнему используется имя модели выше.',
baseUrlPlaceholder: 'например: https://api.openai.com/v1',
baseUrlPlaceholderVllm: 'например: http://localhost:11434/v1',
baseUrlPlaceholderAsr: 'например: https://api.openai.com/v1',
apiKeyOptional: 'API Key (опционально)',
apiKeyPlaceholder: 'Введите API Key',
customHeadersLabel: 'Пользовательские заголовки запроса (опционально)',
customHeadersDesc: 'Дополнительные HTTP-заголовки, добавляемые к запросам к удалённому API модели (например, для авторизации корпоративного шлюза или трассировки). Зарезервированные заголовки, такие как Authorization / Content-Type, игнорируются.',
customHeadersAdd: 'Добавить заголовок',
customHeadersKeyPlaceholder: 'Имя заголовка',
customHeadersValuePlaceholder: 'Значение заголовка',
connectionTest: 'Проверка соединения',
testing: 'Проверка...',
testConnection: 'Проверить соединение',
searchPlaceholder: 'Поиск моделей...',
downloadLabel: 'Скачать: {keyword}',
refreshList: 'Обновить список',
dimensionLabel: 'Размерность вектора',
dimensionPlaceholder: 'например: 1536',
checkDimension: 'Определить размерность',
dimensionDetected: 'Определение выполнено, размерность: {value}',
dimensionFailed: 'Не удалось определить, введите размерность вручную',
remoteDimensionDetected: 'Обнаружена размерность: {value}',
dimensionOverrideLabel: 'Пользовательская выходная размерность',
dimensionOverrideDesc: 'Включайте только если документация провайдера подтверждает поддержку параметра dimensions.',
supportsVisionLabel: 'Поддержка визуального / мультимодального ввода',
supportsVisionDesc: 'Поддерживает ли модель изображения и другой мультимодальный ввод',
thinkingControlLabel: 'Формат параметров режима размышления',
thinkingControlDesc:
'Определяет, как переключатель «Режим размышления» агента записывается в API. При возможности выбирается по поставщику/модели; при несоответствии измените по документации API. При выборе «Не отправлять» переключатель «Режим размышления» агента не действует.',
thinkingControl: {
none: {
label: 'Не отправлять параметры размышления',
hint: 'Переключатель «Режим размышления» агента не действует; параметры размышления не отправляются в запросе',
},
chatTemplateKwargs: {
label: 'chat_template_kwargs',
hint: 'Пользовательские OpenAI-совместимые шлюзы, NVIDIA NIM, vLLM / локальный Qwen',
},
enableThinking: {
label: 'enable_thinking',
hint: 'Alibaba DashScope: qwen3, qwen-plus, qwen-max, qwen-turbo',
},
thinkingType: {
label: 'thinking.type',
hint: 'Volcengine Ark; Tencent LKEAP (DeepSeek V3 и др.; по умолчанию для LKEAP; для R1 — «Не отправлять»)',
},
},
dimensionHint: 'Модель выбрана. Нажмите «Определить размерность», чтобы автоматически получить значение.',
loadModelListFailed: 'Не удалось загрузить список моделей',
listRefreshed: 'Список обновлён',
fillModelAndUrl: 'Сначала заполните идентификатор модели и Base URL',
remoteBaseUrlRequired: 'Для Remote API необходимо указать Base URL',
unsupportedModelType: 'Неподдерживаемый тип модели',
connectionSuccess: 'Соединение установлено',
connectionFailed: 'Соединение не установлено',
connectionConfigError: 'Соединение не установлено, проверьте конфигурацию',
downloadStarted: 'Начата загрузка {name}',
downloadCompleted: '{name} успешно загружена',
downloadFailed: 'Не удалось загрузить {name}',
downloadStartFailed: 'Не удалось запустить загрузку',
ollamaUnavailable: 'Сервис Ollama недоступен, локальные модели недоступны для выбора',
ollamaNotSupportRerank: 'Ollama не поддерживает модели ReRank, используйте удалённый API',
goToOllamaSettings: 'Открыть настройки',
validation: {
modelNameRequired: 'Введите название модели',
modelNameEmpty: 'Название модели не может быть пустым',
modelNameMax: 'Название модели не может превышать 100 символов',
baseUrlRequired: 'Введите Base URL',
baseUrlEmpty: 'Base URL не может быть пустым',
baseUrlInvalid: 'Недопустимый Base URL, введите корректный адрес'
},
providerLabel: 'Провайдер',
providerPlaceholder: 'Выберите провайдера модели',
providers: {
openai: {
label: 'OpenAI',
description: 'gpt-5.2, gpt-5-mini, etc.'
},
azure_openai: {
label: 'Azure OpenAI',
description: 'Сервис OpenAI на платформе Microsoft Azure',
},
aliyun: {
label: 'Aliyun DashScope',
description: 'qwen-plus, tongyi-embedding-vision-plus, qwen3-rerank, etc.'
},
zhipu: {
label: 'Zhipu BigModel',
description: 'glm-4.7, embedding-3, rerank, etc.'
},
openrouter: {
label: 'OpenRouter',
description: 'openai/gpt-5.2-chat, google/gemini-3-flash-preview, etc.'
},
generic: {
label: 'Пользовательский (OpenAI-совместимый)',
description: 'Generic API endpoint'
},
siliconflow: {
label: 'SiliconFlow',
description: 'deepseek-ai/DeepSeek-V3.1, etc.'
},
jina: {
label: 'Jina',
description: 'jina-clip-v1, jina-embeddings-v2-base-zh, etc.'
},
volcengine: {
label: 'Volcengine',
description: 'doubao-1-5-pro-32k-250115, doubao-embedding-vision-250615, etc.'
},
deepseek: {
label: 'DeepSeek',
description: 'deepseek-chat, deepseek-reasoner, etc.'
},
hunyuan: {
label: 'Hunyuan',
description: 'hunyuan-pro, hunyuan-standard, hunyuan-embedding, etc.'
},
minimax: {
label: 'MiniMax',
description: 'MiniMax-M3, MiniMax-M2.7, MiniMax-M2.7-highspeed, etc.'
},
mimo: {
label: 'MiMo',
description: 'mimo-v2-flash'
},
gemini: {
label: 'Google Gemini',
description: 'gemini-3-flash-preview, gemini-2.5-pro, etc.'
},
gpustack: {
label: 'GPUStack',
description: 'Choose your deployed model on GPUStack'
},
modelscope: {
label: 'ModelScope',
description: 'Qwen/Qwen3-8B, Qwen/Qwen3-Embedding-8B, etc.'
},
qiniu: {
label: 'Qiniu Cloud',
description: 'deepseek/deepseek-v3.2-251201, z-ai/glm-4.7, etc.'
},
moonshot: {
label: 'Moonshot',
description: 'kimi-k2-turbo-preview, moonshot-v1-8k-vision-preview, etc.'
},
qianfan: {
label: 'Baidu Qianfan',
description: 'ernie-5.0-thinking-preview, embedding-v1, bce-reranker-base, etc.'
},
longcat: {
label: 'LongCat AI',
description: 'LongCat-Flash-Chat, LongCat-Flash-Thinking, etc.'
},
lkeap: {
label: 'Tencent Cloud LKEAP',
description: 'DeepSeek-R1, DeepSeek-V3, lke-reranker-base и др.'
},
nvidia: {
label: "NVIDIA",
description: "deepseek-ai-deepseek-v3_1, nv-embed-v1, rerank-qa-mistral-4b, etc.",
},
novita: {
label: "Novita AI",
description: "moonshotai/kimi-k2.5, zai-org/glm-5, minimax/minimax-m2.7, qwen/qwen3-embedding-0.6b, etc.",
},
}
},
builtinTag: 'Built-in'
},
createChat: {
title: 'Привет, я WeKnora — ваши знания всегда под рукой',
newSessionTitle: 'Новая сессия',
messages: {
selectKnowledgeBase: 'Сначала выберите базу знаний',
createFailed: 'Не удалось создать сессию',
createError: 'Не удалось создать сессию, попробуйте позже'
}
},
knowledgeList: {
create: 'Создать базу знаний',
createFAQ: 'Создать FAQ-базу',
subtitle: 'Управляйте и организуйте свои базы знаний, поддерживаются документные и FAQ-базы знаний',
uninitializedBanner: 'Некоторые базы знаний не инициализированы. Сначала настройте модели в разделе настроек, чтобы добавлять документы.',
empty: {
title: 'Базы знаний отсутствуют',
description: 'Нажмите «Создать базу знаний» в левом быстром действии, чтобы добавить первую базу.',
sharedTitle: 'No shared knowledge bases',
sharedDescription: 'You can join a shared space or request others to share knowledge bases with you',
favoritesTitle: 'No favorites yet',
favoritesDescription: 'Star a knowledge base from its card to add it here',
recentsTitle: 'Nothing here yet',
recentsDescription: 'Knowledge bases you recently opened will show up here'
},
delete: {
confirmTitle: 'Подтверждение удаления',
confirmMessage: 'Удалить базу знаний «{name}»? Отменить действие будет невозможно.',
confirmButton: 'Удалить'
},
pin: {
pin: 'Закрепить',
unpin: 'Открепить',
pinSuccess: 'Закреплено',
unpinSuccess: 'Откреплено',
failed: 'Операция не удалась'
},
sections: {
pinned: 'Закреплённые',
mine: 'Созданные мной',
tenantReadonly: 'Рабочая область · Только просмотр',
tenantOthers: 'Рабочая область · Другие участники',
sharedByMe: 'Расшарено мной',
sharedEditable: 'Доступно мне · Можно редактировать',
sharedReadonly: 'Доступно мне · Только просмотр'
},
messages: {
deleted: 'База знаний удалена',
deleteFailed: 'Не удалось удалить базу знаний',
file: '文件',
knowledgeBase: '知识库',
noResult: '无结果'
},
features: {
knowledgeGraph: 'Граф знаний включен',
multimodal: 'Мультимодальность включена',
questionGeneration: 'Генерация вопросов включена'
},
processing: 'Обработка задачи импорта',
processingDocuments: 'Обработка {count} документов',
stats: {
documents: 'Количество документов',
faqEntries: 'FAQ записи',
chunks: 'Количество фрагментов'
},
uploadProgress: {
uploadingTitle: 'Загрузка документов папки в «{name}»',
detail: 'Готово {completed} из {total} файлов',
keepPageOpen: 'Пожалуйста, не закрывайте страницу, пока идет загрузка.',
completedTitle: 'Загрузка для «{name}» завершена',
completedDetail: 'Загружено {total} файлов. Обновляем список, чтобы показать статус разбора...',
refreshing: 'Обновляем список и статусы разбора...',
errorTip: 'Часть файлов загрузить не удалось. Проверьте уведомления.',
unknownKb: 'База знаний {id}'
},
createShort: 'New',
myKnowledgeBases: 'My Knowledge Bases',
sharedKnowledgeBases: 'Shared Knowledge Bases',
sharedToOrgs: 'Shared to {count} space(s)',
sharedLabel: 'Shared',
myLabel: 'Mine',
fromAgent: 'From agent {name}',
fromAgentShort: 'Agent: {name}',
tabs: {
all: 'All',
myKnowledgeBases: 'My Knowledge Bases',
sharedToMe: 'Shared with me'
},
emptyShared: 'No collaborative knowledge bases yet. Join a shared space to access knowledge bases from others.',
menu: {
viewDetails: 'View Details'
},
detail: {
title: 'Shared Knowledge Base',
overview: 'Overview',
overviewDesc: 'View knowledge base information and source',
permission: 'Permission',
permissionDesc: 'View your permissions for this knowledge base',
sourceType: 'Source',
sourceTypeKbShare: 'KB shared directly to this space',
sourceTypeAgent: 'Visible via shared agent',
sourceOrg: 'Space',
sourceFromAgent: 'Agent',
agentKbStrategy: 'Agent KB strategy',
agentKbStrategyAll: 'All knowledge bases',
agentKbStrategySelected: 'Selected knowledge bases',
agentKbStrategyNone: 'No knowledge bases',
sharedAt: 'Shared At',
myPermission: 'My Permission',
canEdit: 'Can edit knowledge base content',
canView: 'Can view knowledge base content',
canSearch: 'Can search and use knowledge base',
goToKb: 'Go to Knowledge Base',
enabled: 'Enabled',
disabled: 'Disabled'
}
},
embedPublish: {
title: 'Встраивание на веб-страницу',
description: 'Встройте агента на свою веб-страницу: посетители смогут общаться через встроенное окно чата или плавающую кнопку.',
create: 'Новый канал встраивания',
channelsTitle: 'Каналы встраивания',
disabled: 'Отключено',
empty: 'Каналов встраивания пока нет',
unnamed: 'Без названия',
agent: 'Агент',
rateLimit: 'Лимит',
rateLimitUnit: '/мин',
allowedOrigins: 'Разрешённые домены',
embedCode: 'Код встраивания',
widgetCode: 'Скрипт виджета',
copyCode: 'Копировать код',
rotateToken: 'Сменить токен',
rotatePublishToken: 'Сменить токен публикации',
channelKey: 'Ключ канала',
channelKeyDesc: 'Долгоживущий секрет для интеграции на сторонних сайтах — храните в безопасности',
channelKeyHint: 'Не удалось загрузить ключ канала. Закройте и снова откройте канал или обновите страницу.',
channelKeyLoadFailed: 'Не удалось загрузить ключ канала',
channelKeyUnavailable: 'Ключ недоступен',
resetKeyTitle: 'Сбросить ключ канала',
resetKeyConfirmOk: 'Сбросить',
resetKeyConfirmBody: 'После сброса старый ключ канала немедленно отзывается. Все развёрнутые фрагменты встраивания должны использовать новый ключ. Отменить нельзя.',
resetKeySuccess: 'Ключ канала сброшен — новый ключ показан в поле ввода',
resetKeyFailed: 'Не удалось сбросить ключ канала',
copyChannelKeyTitle: 'Копировать ключ канала',
revealKey: 'Показать ключ',
hideKey: 'Скрыть ключ',
delete: 'Удалить',
edit: 'Редактировать',
createTitle: 'Новый канал встраивания',
editTitle: 'Редактировать канал встраивания',
name: 'Название',
nameDesc: 'Для админ-списков и идентификации канала',
namePlaceholder: 'напр. Поддержка на сайте',
nameDefaultHint: 'По умолчанию «{agent} · Встраивание на сайт». Можно изменить; при пустом поле при сохранении используется имя по умолчанию.',
defaultChannelName: 'Встраивание на сайт',
defaultChannelNameWithAgent: '{agent} · Встраивание на сайт',
welcomeMessage: 'Приветствие',
welcomePlaceholder: 'Здравствуйте! Чем могу помочь?',
welcomeMessageDesc: 'Показывается во встроенном чате до первого сообщения посетителя; оставьте пустым, чтобы скрыть',
showSuggestedQuestions: 'Рекомендуемые вопросы',
showSuggestedQuestionsDesc: 'Показывать быстрые вопросы до первого сообщения посетителя — из настроек агента и связанных баз знаний',
originsLabel: 'Разрешённые домены (по одному в строке, минимум один)',
originsHint: 'Один полный origin в строке (напр. https://shop.example.com), минимум один; поддерживаются поддомены *.example.com',
originsRequired: 'Укажите хотя бы один разрешённый домен',
originsInvalid: 'Неверный домен: {origin}',
originsWildcardProd: "В production запрещён wildcard '*'",
originsCount: '{n} дом.',
originsPlaceholder: 'https://shop.example.com',
rateLimitLabel: 'Запросов в минуту',
rateLimitDesc: 'На IP посетителя, макс. запросов к API встраивания в минуту; избыток временно отклоняется. По умолчанию 30.',
rateLimitDayLabel: 'Дневной лимит запросов',
rateLimitDayDesc: 'Суточный лимит запросов канала (все IP); ограничивает злоупотребление при утечке токена публикации. По умолчанию 10000.',
publishTokenWarning: 'Токен публикации виден в исходном коде страницы встраивания — любой посетитель сайта может его прочитать. Считайте его публикуемым ключом, а не секретом: не встраивайте агентов с чувствительными данными, настройте whitelist доменов и лимиты, при утечке немедленно смените токен.',
debug: 'Отладочный предпросмотр',
createdDebugHint: 'Канал создан — откройте отладочный предпросмотр в новой вкладке',
primaryColor: 'Основной цвет',
pageTitle: 'Заголовок страницы',
pageTitleDesc: 'В шапке чата и вкладке браузера; приоритетнее названия',
pageTitlePlaceholder: 'AI-ассистент',
headerTitleMode: 'Заголовок шапки',
headerTitleModeChannel: 'Фиксированный заголовок канала',
headerTitleModeSession: 'Следовать заголовку сессии',
headerTitleModeDesc: 'Фиксированный: всегда заголовок страницы. Сессия: авто-заголовок из первого сообщения; до генерации — заголовок страницы.',
tokenHint: 'Не удалось загрузить ключ канала. Закройте и снова откройте канал.',
createdWithToken: 'Канал создан — ключ канала показан ниже',
created: 'Канал встраивания создан',
updated: 'Канал встраивания обновлён',
saveFailed: 'Не удалось сохранить',
deleted: 'Удалено',
tokenRotated: 'Ключ канала сброшен',
copied: 'Код встраивания скопирован',
loadError: 'Не удалось загрузить',
missingChannel: 'Отсутствует канал встраивания или токен',
invalidChannel: 'Недействительный канал встраивания',
sessionFailed: 'Не удалось создать сессию чата, попробуйте позже',
channelDisabled: 'Канал встраивания отключён. Включите в редакторе агента → Встраивание на веб-страницу',
loading: 'Загрузка...',
tabIframe: 'iframe',
tabWidget: 'Виджет',
tabSecure: 'Безопасный режим',
widgetPosition: 'Позиция виджета',
widgetPreview: 'Предпросмотр виджета',
positionBottomRight: 'Справа внизу',
positionBottomLeft: 'Слева внизу',
positionTopRight: 'Справа вверху',
positionTopLeft: 'Слева вверху',
publishToken: 'Ключ канала',
publishTokenHelp: 'Ключ канала (em_…) — долгоживущий секрет канала, как API Key. Откройте детали канала, чтобы просмотреть и скопировать; сброс немедленно аннулирует предыдущий ключ.',
sessionTokenHelp: 'После открытия чата iframe обменивает ключ канала на краткосрочный сеансовый (ems_…, ~30 мин). Дальнейшие запросы используют сеансовый, ключ не остаётся в URL.',
rotateTokenHelp: 'Сброс отзывает предыдущий ключ. Обновите все развёрнутые фрагменты встраивания.',
revealToken: 'Показать',
hideToken: 'Скрыть',
copyToken: 'Копировать ключ канала',
tokenCopied: 'Ключ канала скопирован',
awaitingToken: 'Ожидание токена от страницы-хоста…',
preview: 'Предпросмотр',
previewIframeHint: 'Как iframe выглядит на сторонней странице (как в скопированном коде).',
previewWidgetHint: 'Плавающий виджет на mock-странице. На реальном сайте токен передаётся через postMessage.',
previewMockPage: 'Mock-страница хоста',
previewLoading: 'Загрузка предпросмотра…',
previewUnavailable: 'Предпросмотр недоступен. Убедитесь, что канал включён и Redis доступен.',
defaultChatTitle: 'AI-ассистент',
newChat: 'Новый чат',
channelsPanelIntro: 'Создайте каналы встраивания для агента, настройте внешний вид и безопасность, затем разверните на сторонних сайтах.',
sectionChannel: 'Информация о канале',
sectionSecurity: 'Безопасность и лимиты',
sectionCapabilities: 'Возможности чата',
allowWebSearch: 'Показывать переключатель веб-поиска',
allowWebSearchDesc: 'При включении посетители видят кнопку веб-поиска в поле ввода и могут включать или выключать его сами; по умолчанию выключен. Кнопка появляется только если у привязанного агента включён веб-поиск.',
allowMemory: 'Разрешить память',
allowMemoryDesc: 'При включении анонимные посетители сохраняют контекст в рамках одной сессии; память теряется при очистке данных браузера или новом чате. По умолчанию выключено.',
allowFileUpload: 'Показывать кнопку загрузки изображений',
allowFileUploadDesc: 'При включении посетители видят кнопку загрузки изображений в поле ввода. Кнопка появляется только если у привязанного агента включена загрузка изображений.',
agentWebSearchDisabledHint: 'У этого агента не включён веб-поиск. Посетители не увидят кнопку веб-поиска, пока вы не включите его в настройках агента.',
agentImageUploadDisabledHint: 'У этого агента не включена загрузка изображений. Посетители не увидят кнопку загрузки, пока вы не включите её в настройках агента.',
sectionAppearance: 'Внешний вид',
sectionDeploy: 'Развернуть на сайте',
stepChannel: 'Канал',
stepSecurity: 'Безопасность',
stepCapabilities: 'Возможности',
stepAppearance: 'Внешний вид',
stepWebhook: 'Webhook',
stepDeploy: 'Развёртывание',
deployIntro: 'Выберите способ встраивания и скопируйте код ниже на сайт. Ключ канала внизу — для аутентификации и сброса.',
deployStepToken: 'Ключ канала',
deployStepTokenDesc: 'Долгоживущий секрет (em_…), как API Key. Только на этой странице при создании/сбросе — храните надёжно.',
deployStepEmbed: 'Копировать код встраивания',
deployStepEmbedDesc: 'Выберите способ встраивания и вставьте код на сайт.',
embedIframeDesc: 'Встроить полный чат в фиксированную область страницы.',
embedWidgetDesc: 'Плавающая кнопка в углу; по клику открывается панель чата.',
embedSecureDesc: 'Рекомендуется: токен публикации только на вашем backend, страница получает краткосрочные токены — долгоживущий секрет не попадает в браузер.',
deployAfterSaveHint: 'После сохранения здесь можно скопировать ключ канала и код встраивания.',
widgetTokenNote: 'Скрипт виджета должен содержать ключ канала; iframe обменивает учётные данные при загрузке.',
secureTokenNote: 'На странице нет токена публикации — только endpoint вашего backend (data-token-endpoint). Backend обменивает токен на 30-минутный; виджет обновляет до истечения.',
secureServerLabel: 'Пример server-side endpoint токена (токен публикации только на сервере)',
secureServerCode: 'Пример для сервера',
tabServerNode: 'Node.js',
tabServerGo: 'Go',
sectionBasic: 'Основные настройки',
sectionToken: 'Ключ канала',
sectionEmbed: 'Код встраивания',
enabled: 'Включить канал',
deleteConfirm: 'Удалить этот канал? Развёрнутые фрагменты перестанут работать.',
rotateConfirmTitle: 'Сбросить ключ канала?',
rotateConfirmBody: 'Старый ключ немедленно перестанет работать. Обновите все развёрнутые фрагменты.',
defaultLocale: 'Язык по умолчанию',
defaultLocaleDesc: 'Язык интерфейса при открытии чата; пусто — браузер или setLocale() виджета.',
defaultLocaleBrowser: 'Браузер / хост',
sessionCountLabel: '{n} сессий',
},
knowledgeEditor: {
titleCreate: 'Создать базу знаний',
titleEdit: 'Настройки базы знаний',
navGroups: {
basic: 'Основное',
processing: 'Индексация и разбор',
data: 'Хранение и данные',
integration: 'Публикация',
},
sidebar: {
basic: 'Основная информация',
models: 'Конфигурация моделей',
vectorStore: 'Vector Store',
chunking: 'Настройки разбиения',
advanced: 'Дополнительные настройки',
faq: 'FAQ настройки',
wiki: 'Wiki настройки',
graph: 'Граф знаний',
multimodal: 'Обработка изображений',
asr: 'Аудио',
storage: 'Storage Engine',
datasource: 'Источники данных',
share: 'Sharing',
indexing: 'Стратегия индексации',
},
errors: {
vectorStoreBindingInvalid:
'The selected vector store cannot be used. Choose a different store or use the system default.',
vectorStoreUnavailable:
'The selected vector store is currently unavailable. Check its connection configuration in Settings → Vector Stores.',
},
basic: {
title: 'Основная информация',
description: 'Укажите название и описание базы знаний',
kbId: 'ID базы знаний',
kbIdDesc: 'Используйте этот ID для указания базы знаний в API-интеграциях',
typeLabel: 'Тип базы знаний',
typeDocument: 'Документальная',
typeFAQ: 'FAQ (вопрос-ответ)',
typeDescription: 'FAQ подходит для структурированных Q&A; документальный тип поддерживает загрузку файлов и разбиение; Wiki автоматически создает связанные страницы знаний через LLM.',
nameLabel: 'Название базы знаний',
namePlaceholder: 'Введите название базы знаний',
descriptionLabel: 'Описание базы знаний',
descriptionPlaceholder: 'Введите описание базы знаний (необязательно)'
},
wiki: {
title: 'Wiki настройки',
description: 'Настройте автоматическую генерацию Wiki',
synthesisModelLabel: 'Модель синтеза',
synthesisModelPlaceholder: 'Выберите LLM модель для генерации Wiki',
synthesisModelTip: 'Если не указано, используется модель суммаризации',
languageLabel: 'Язык Wiki',
maxPagesLabel: 'Макс. страниц за Ingest',
maxPagesTip: 'Максимальное количество страниц для создания/обновления за одну операцию (0 = без ограничения)',
extractionGranularityLabel: 'Детализация извлечения',
extractionGranularityTip: 'Управляет количеством извлекаемых сущностей/концепций на документ. Точнее — компактный индекс, грубее — более полный',
granularityFocused: 'Фокус',
granularityStandard: 'Стандарт',
granularityExhaustive: 'Полный',
granularityFocusedHint: 'Извлекает только главные темы документа (например, резюме → человек и его проекты). Самый чистый результат, возможны пропуски.',
granularityStandardHint: 'Главные темы плюс подробно обсуждаемые сущности/концепции. Пропускает упомянутые вскользь. Рекомендуемое значение.',
granularityExhaustiveHint: 'Извлекает все именованные сущности и концепции, включая мимоходом упомянутые технологии. Подходит для глоссария.',
},
indexing: {
title: 'Стратегия индексации',
description: 'Настройте конвейер обработки после загрузки документов. Каждый способ индексации можно включить или выключить независимо',
searchTitle: 'RAG-поиск',
searchDesc: 'Разбивает документы на чанки, векторизует и индексирует ключевые слова, поддерживая гибридный поиск',
wikiTitle: 'Wiki-база знаний',
wikiDesc: 'Автоматически создаёт взаимосвязанные Wiki-страницы и формирует структурированную систему знаний',
graphTitle: 'Граф знаний',
graphDesc: 'Извлекает сущности и связи, строит граф знаний и поддерживает поиск по графу',
atLeastOne: 'Должна быть включена хотя бы одна стратегия индексации',
embeddingRequired: 'RAG-поиск требует настройки модели Embedding',
wikiModelRequired: 'Wiki-база знаний требует настройки модели синтеза',
lockedTip: 'В базе знаний уже есть содержимое, изменение стратегии индексации недоступно. Чтобы изменить, сначала очистите базу знаний.',
rebuildConfirmTitle: 'Перестроить индекс',
rebuildConfirmBody: 'Стратегия индексации изменена. Переобработать существующие {count} документов? Это может занять некоторое время.',
rebuildSuccess: 'Задача перестроения отправлена, всего {count} документов',
rebuildSkip: 'Перестроение можно запустить вручную позже в источниках данных',
},
wikiBrowser: {
viewInGraph: 'Открыть в графе',
tabDocuments: 'Документы',
tabWiki: 'Wiki',
tabGraph: 'Граф',
tabGraphTip: 'Граф связей между Wiki-страницами (граф ссылок страниц). Это НЕ то же самое, что граф знаний на основе сущностей и отношений, настраиваемый в «Настройки БЗ → Граф знаний».',
searchPlaceholder: 'Поиск Wiki-страниц...',
searchNoResults: 'Страницы не найдены',
viewModeToggle: 'Переключить вид каталога',
viewTree: 'Дерево',
viewList: 'Список',
loadMore: 'Загрузить ещё (осталось {remaining})',
filterAll: 'Все типы',
newFolder: 'Новый каталог',
newRootFolder: 'Новый каталог',
newSubfolder: 'Новый подкаталог',
folderActions: 'Действия с каталогом',
folderNamePlaceholder: 'Введите название каталога',
createFolderSuccess: 'Каталог создан',
createFolderFailed: 'Не удалось создать каталог',
movePageSuccess: 'Страница перемещена',
movePageFailed: 'Не удалось переместить страницу',
renameFolder: 'Переименовать каталог',
renameFolderSuccess: 'Каталог переименован',
renameFolderFailed: 'Не удалось переименовать каталог',
deleteFolder: 'Удалить каталог',
deleteFolderConfirm: 'Удалить каталог «{name}»?',
deleteFolderSuccess: 'Каталог удалён',
deleteFolderFailed: 'Не удалось удалить каталог',
deleteFolderNotEmpty: 'Каталог не пуст. Сначала удалите страницы и подкаталоги.',
moveFolderSuccess: 'Каталог перемещён',
moveFolderFailed: 'Не удалось переместить каталог',
moveFolderIntoSelf: 'Нельзя переместить каталог в себя или свой подкаталог',
moveConfirm: 'Переместить в «{target}»?',
moveConfirmTitle: 'Подтвердить перемещение',
rootFolderLabel: 'Корень',
dropToRoot: 'Перетащите сюда, чтобы переместить в корень',
filterSummary: 'Резюме',
filterKnowledge: 'Знания',
filterEntity: 'Сущности',
filterConcept: 'Концепции',
filterSynthesis: 'Синтез',
filterComparison: 'Сравнения',
viewReader: 'Читатель',
viewGraph: 'Граф',
stats: '{pages} страниц · {links} ссылок',
emptyTitle: 'Wiki-страниц пока нет',
emptyDesc: 'Загрузите документы с включённым Wiki для автоматической генерации страниц',
selectPageHint: 'Выберите страницу слева для просмотра',
version: 'v{ver}',
aliases: 'Псевдонимы',
linksTo: 'Ссылается на',
linkedFrom: 'Цитируется',
sources: 'Исходные документы',
recentActivity: 'Последняя активность',
graphEmpty: 'Загрузка графа...',
fitView: 'По размеру экрана',
logTitle: 'Журнал активности',
indexTitle: 'Индекс',
logFeedTag: 'Лента событий',
logEmpty: 'Записей журнала пока нет',
logLoading: 'Загрузка…',
logLoadMore: 'Загрузить ещё',
indexOverviewTag: 'Каталог',
indexEmpty: 'Пока нет wiki-страниц. Сначала загрузите документы.',
graphNoData: 'Нет данных графа. Сначала загрузите документы. (Здесь показаны связи между Wiki-страницами, что отличается от графа сущностей и отношений в «Настройки БЗ → Граф знаний».)',
showArrows: 'Показать стрелки',
hideArrows: 'Скрыть стрелки',
expandNeighbors: 'Развернуть соседей',
bloomNeighbors: 'Добавить соседей',
growFrontier: 'Расширить границу ({count})',
growFrontierTitle: 'Развернуть все {count} узлов с пунктирным кольцом за один клик',
cardEgoTitle: 'Текущий фокус',
cardOverviewTitle: 'Обзор БЗ',
cardOverviewPrimary: '{returned} / {total} узлов',
cardOverviewHintTruncated: 'Дважды щёлкните узел, чтобы сфокусироваться на его подграфе',
cardOverviewHintFull: 'Показаны все узлы базы знаний',
cardRelatedNodes: '{count} связанных узлов',
helpButtonTitle: 'Справка',
helpTitle: 'Действия на холсте',
helpClickAction: 'Клик',
helpClickDesc: 'Открыть детали узла',
helpDblClickAction: 'Двойной клик',
helpDblClickDesc: 'Сфокусироваться на узле',
helpShiftClickAction: 'Shift + клик',
helpShiftClickDesc: 'Добавить соседей на холст',
helpHoverPlusAction: 'Наведение → ⊕',
helpHoverPlusDesc: 'То же, что Shift + клик',
helpDragAction: 'Перетащить узел',
helpDragDesc: 'Изменить положение узла',
helpPanAction: 'Перетащить пустое место',
helpPanDesc: 'Переместить холст',
helpZoomAction: 'Колесо мыши',
helpZoomDesc: 'Масштабировать холст',
neighborsProgress: 'Показано {visible} из {total} соседей (еще {hidden} не загружено)',
neighborsAllShown: 'Все {total} соседей уже на холсте (нажмите «Развернуть», чтобы сфокусироваться на подграфе этого узла)',
neighborsNone: 'У этой страницы нет связанных соседей',
neighborsCenterUnreachable: 'Показано {visible} из {total} соседей ({hidden} недоступны: мёртвые ссылки, отфильтрованы или удалены)',
neighborsOverviewHidden: 'Показано {visible} из {total} соседей ({hidden} вне обзора — нажмите «Развернуть», чтобы переключиться сюда)',
backToOverview: 'Вернуться к обзору',
healthCheck: 'Проверка здоровья',
queueStatus: '{count} ожидающих задач в очереди Wiki',
issueTitle: 'На этой странице есть {count} неразрешенных конфликтов или ошибок знаний',
issueFixBtn: 'AI Автоисправление',
issueMixed: 'Смешанная инфо',
issueConflict: 'Фактический конфликт',
issueOutdated: 'Устарело',
issueAttention: 'Требует внимания',
issueReportedBy: 'Сообщил {reporter}',
issueAiLinter: 'AI Линтер',
issueIgnore: 'Игнорировать',
globalIssuesTitle: 'Глобальные проблемы содержимого',
globalIssuesCount: 'Ожидающие проблемы содержимого: {count}',
globalIssuesEmpty: 'Нет ожидающих проблем содержимого',
issuePagePrefix: 'Страница: ',
issueGoFix: 'Исправить',
fixAssistantTitle: 'Wiki Умный помощник исправления',
issueFixSuggestions: 'Предложения по оптимизации ({count})',
issueFixSingle: 'Исправить',
fixStartError: 'Не удалось запустить помощник исправления',
issueFixPromptSingle: 'Пожалуйста, исправьте проблему (ID: {id}) на странице [[{slug}]].',
issueFixPromptAutoStart: 'Пожалуйста, исправьте следующие проблемы на странице [[{slug}]]:',
issueFixPromptAutoEnd: '',
},
buttons: {
create: 'Создать базу знаний',
save: 'Сохранить настройки'
},
messages: {
loadModelsFailed: 'Не удалось загрузить список моделей',
loadDataFailed: 'Не удалось загрузить данные базы знаний',
notFound: 'База знаний не найдена',
nameRequired: 'Пожалуйста, введите название базы знаний',
embeddingRequired: 'Пожалуйста, выберите модель встраивания',
summaryRequired: 'Пожалуйста, выберите модель суммаризации',
multimodalInvalid: 'Проверка мультимодальной конфигурации не удалась',
createSuccess: 'База знаний успешно создана',
createFailed: 'Не удалось создать базу знаний',
missingId: 'Отсутствует ID базы знаний',
buildDataFailed: 'Не удалось сформировать данные для отправки',
updateSuccess: 'Настройки сохранены',
indexModeRequired: 'Выберите режим индексации для FAQ базы знаний',
storageChangeConfirm: 'В базе знаний уже есть файлы. Смена хранилища может сделать старые файлы недоступными. Продолжить?'
},
document: {
title: 'Управление документами',
subtitle: 'Загружайте файлы кликом или перетаскиванием — поддерживается автоматический разбор разных форматов и умное разбиение на фрагменты для быстрого поиска'
},
faq: {
title: 'Настройки FAQ',
subtitle: 'Управление записями FAQ с пакетным импортом, редактированием и тестированием поиска',
description: 'Определите стратегию индексации и общие правила для FAQ-базы знаний',
indexModeLabel: 'Режим индексации',
indexModeDescription: 'Только вопросы дают более высокую точность, вопросы+ответы повышают полноту выдачи.',
questionIndexModeLabel: 'Режим индексации вопросов',
questionIndexModeDescription: 'Объединенная: стандартные и похожие вопросы индексируются вместе. Раздельная: каждый вопрос индексируется независимо для более точного поиска, но требует больше места.',
entryGuide: 'Каждый FAQ включает основной вопрос, похожие вопросы, негативные примеры и несколько ответов. Управляйте ими в деталях FAQ-базы.',
tagDesc: 'Выберите теги для записей FAQ',
tagPlaceholder: 'Выберите теги',
modes: {
questionOnly: 'Только вопросы',
questionAnswer: 'Вопрос + ответ',
combined: 'Объединенная',
separate: 'Раздельная'
},
standardQuestion: 'Основной вопрос',
answers: 'Ответы',
similarQuestions: 'Похожие вопросы',
negativeQuestions: 'Негативные примеры',
categoryLabel: 'Тег FAQ',
categoryButton: 'Сменить тег',
editorCreate: 'Создать FAQ запись',
editorEdit: 'Редактировать FAQ запись',
addAnswer: 'Добавить ответ',
answerPlaceholder: 'Введите содержимое ответа, поддерживается многострочный текст, нажмите Ctrl+Enter или нажмите кнопку для добавления',
similarPlaceholder: 'Введите похожий вопрос и нажмите значок плюса для добавления',
negativePlaceholder: 'Введите негативный пример и нажмите значок плюса для добавления',
answerRequired: 'Добавьте хотя бы один ответ',
noAnswer: 'Ответы отсутствуют',
noSimilar: 'Похожие вопросы отсутствуют',
noNegative: 'Нет негативных примеров',
emptyTitle: 'Нет записей FAQ',
emptyDesc: 'Нажмите "Создать FAQ запись" выше, чтобы начать',
searchPlaceholder: 'Поиск стандартных вопросов...',
searchTest: 'Тест поиска',
searchTestTitle: 'Тест поиска FAQ',
queryLabel: 'Запрос',
queryPlaceholder: 'Введите вопрос для поиска',
vectorThresholdLabel: 'Порог векторного сходства',
vectorThresholdDesc: 'Диапазон 0-1, по умолчанию 0.7',
keywordThresholdLabel: 'Порог совпадения ключевых слов',
keywordThresholdDesc: 'Диапазон 0-1, по умолчанию 0.5',
matchCountLabel: 'Количество результатов',
matchCountDesc: 'Диапазон 1-50, по умолчанию 10',
searchButton: 'Начать поиск',
searching: 'Поиск...',
searchResults: 'Результаты поиска',
noResults: 'Совпадающих записей FAQ не найдено',
score: 'Сходство',
matchType: 'Тип совпадения',
matchedQuestion: 'Совпавший вопрос',
matchTypeEmbedding: 'Векторное совпадение',
matchTypeKeywords: 'Совпадение ключевых слов',
similarityThresholdLabel: 'Порог сходства',
statusEnabled: 'Включено',
statusDisabled: 'Выключено',
statusEnableSuccess: 'Запись FAQ включена',
statusDisableSuccess: 'Запись FAQ отключена',
statusUpdateFailed: 'Не удалось обновить статус',
recommended: 'Рекомендовать',
recommendedEnabled: 'Рекомендация включена',
recommendedDisabled: 'Рекомендация отключена',
recommendedEnableSuccess: 'Рекомендация записи FAQ включена',
recommendedDisableSuccess: 'Рекомендация записи FAQ отключена',
recommendedUpdateFailed: 'Не удалось обновить статус рекомендации',
batchOperations: 'Пакетные операции',
batchUpdateTag: 'Пакетная установка тегов',
batchUpdateTagTip: 'Установить теги для {count} выбранных записей',
batchEnable: 'Пакетное включение',
batchDisable: 'Пакетное отключение',
batchEnableRecommended: 'Пакетное включение рекомендации',
batchDisableRecommended: 'Пакетное отключение рекомендации',
standardQuestionDesc: 'Set the standard phrasing of the question — this is the most common way users ask it.',
answersDesc: 'Provide complete and accurate answer content. Multiple answers can be added to cover different scenarios.',
similarQuestionsDesc: 'Add questions with the same meaning but different phrasing to help the system better match user queries.',
negativeQuestionsDesc: 'Add questions that should not match this answer, to exclude false positives.',
addFaq: 'Add FAQ',
manageFaq: 'FAQ Actions',
createGroup: 'New'
},
faqImport: {
title: 'Пакетный импорт FAQ',
modeLabel: 'Режим импорта',
appendMode: 'Добавить',
replaceMode: 'Заменить существующие записи',
fileLabel: 'Выберите файл',
fileTip: 'Поддерживаются JSON / CSV / Excel. Заголовки CSV/Excel: 标签(必填), 问题(必填), 相似问题(选填-多个用##分隔), 反例问题(选填-多个用##分隔), 机器人回答(必填-多个用##分隔), 是否全部回复(选填-默认FALSE), 是否停用(选填-默认FALSE), 是否禁止被推荐(选填-默认False 可被推荐). Также поддерживаются старый заголовок «分类» и формат: standard_question, answers, similar_questions, negative_questions',
clickToUpload: 'Нажмите для загрузки файла',
dragDropTip: 'или перетащите файл сюда',
importButton: 'Импортировать FAQ',
deleteSelected: 'Удалить выбранные',
deleteSuccess: 'Выбранные записи удалены',
previewCount: 'Разобрано записей: {count}',
previewMore: 'Ещё {count} записей не показано',
importSuccess: 'Импорт завершён',
parseFailed: 'Не удалось разобрать файл',
invalidJSON: 'Неверный формат JSON',
unsupportedFormat: 'Формат файла не поддерживается',
selectFile: 'Сначала выберите файл для импорта',
downloadExample: 'Скачать пример',
downloadExampleJSON: 'Скачать пример JSON',
downloadExampleCSV: 'Скачать пример CSV',
downloadExampleExcel: 'Скачать пример Excel'
},
faqExport: {
exportButton: 'Экспорт CSV',
exportSuccess: 'Экспорт успешен',
exportFailed: 'Ошибка экспорта'
},
models: {
title: 'Конфигурация моделей',
description: 'Выберите подходящие AI-модели для базы знаний',
llmLabel: 'LLM модель',
llmDesc: 'Большая языковая модель для диалогов и вопросов-ответов',
llmPlaceholder: 'Выберите LLM модель',
embeddingLabel: 'Модель встраивания',
embeddingDesc: 'Модель встраивания для векторизации текста',
embeddingPlaceholder: 'Выберите модель встраивания',
embeddingLocked: 'В базе знаний уже есть файлы. Модель встраивания нельзя изменить',
embeddingOptional: '(необязательно)',
embeddingWikiOptionalDesc: 'Необязательно. Если задано, используется для сопоставления по сходству при классификации каталога Wiki, чтобы новые страницы лучше повторно использовали существующие папки; иначе классификация выполняется по полному дереву каталога.',
rerankLabel: 'Модель ReRank',
rerankDesc: 'Модель для переранжирования результатов поиска (необязательно)',
rerankPlaceholder: 'Выберите модель ReRank (необязательно)'
},
chunking: {
title: 'Настройки разбиения',
description: 'Управляет тем, как загруженные документы разбиваются перед эмбеддингом. Значения по умолчанию подходят для большинства случаев — настройте только если качество поиска плохое.',
sizeLabel: 'Размер блока',
sizeDescription: 'Максимальное количество символов в блоке (100–4000). По умолчанию 512 ≈ 100–130 английских токенов. Меньше для FAQ (200–400), больше для повествовательных документов (1000–2000).',
characters: 'символов',
overlapLabel: 'Перекрытие блоков',
overlapDescription: 'Количество символов, общих для соседних блоков (0–500). По умолчанию 80 ≈ 15% размера — оптимум по текущим исследованиям. 0 для FAQ/структурированных данных, 150–200 для длинных повествований.',
separatorsLabel: 'Разделители',
separatorsDescription: 'Символы или строки, которые сплиттер предпочитает при резке. Разделители более высокого приоритета пробуются первыми; порядок по умолчанию: абзацы → предложения → пунктуация.',
separatorsPlaceholder: 'Выберите или настройте разделители',
separators: {
doubleNewline: 'Двойной перевод строки (\\n\\n)',
singleNewline: 'Одинарный перевод строки (\\n)',
periodCn: 'Китайская точка (。)',
exclamationCn: 'Восклицательный знак (!)',
questionCn: 'Вопросительный знак (?)',
semicolonCn: 'Китайская точка с запятой (;)',
semicolonEn: 'Точка с запятой (;)',
space: 'Пробел ( )'
},
parentChildLabel: 'Родительско-дочернее разбиение',
parentChildDescription: 'Двухуровневое разбиение: маленькие дочерние блоки используются для векторного матчинга (точные совпадения), большой родительский блок возвращается LLM (более богатый контекст). Рекомендуется для длинных документов (>10 страниц); пропустите для коротких FAQ для экономии хранилища.',
parentChunkSizeLabel: 'Размер родительского блока',
parentChunkSizeDescription: 'Размер контекстного блока, возвращаемого LLM (512–8192). По умолчанию 4096 ≈ 1000 английских токенов, комфортно вписывается в любое современное контекстное окно.',
childChunkSizeLabel: 'Размер дочернего блока',
childChunkSizeDescription: 'Размер встроенного блока для векторного матчинга (64–2048). По умолчанию 384 ≈ 80 токенов — оптимум для эмбеддеров уровня sentence-transformer / BGE.',
strategyLabel: 'Стратегия разбиения',
strategyDescription: 'Выберите способ разбиения документов на блоки. Автоматический режим анализирует каждый документ и выбирает оптимальную стратегию.',
strategyPlaceholder: 'Выберите стратегию разбиения (по длине, если не указано)',
strategies: {
auto: {
label: 'Автоматически',
tooltip: 'Профилировщик документа сам выбирает между «По заголовкам», «По структуре» и «По длине» разбиением для каждой загрузки.'
},
heading: {
label: 'По заголовкам',
tooltip: 'Разбивает по границам заголовков Markdown (#, ##, ###); каждый фрагмент получает свой путь заголовков. Подходит для хорошо структурированного Markdown.'
},
heuristic: {
label: 'По структуре',
tooltip: 'Разбивает по обнаруженным структурным признакам: разрывы страниц, нумерованные разделы, многоязычные маркеры глав (DE/EN/ZH), заголовки в верхнем регистре. Идеально для PDF без заголовков Markdown.'
},
legacy: {
label: 'По длине',
tooltip: 'Игнорирует структуру и разбивает рекурсивно по числу символов и разделителям — оригинальное поведение. Используйте, если стратегии с учётом структуры работают некорректно.'
}
},
overlapWarning: 'Перекрытие велико по сравнению с размером блока — блоки будут содержать большую часть одинакового контента.',
advancedLabel: 'Расширенные параметры',
tokenLimitLabel: 'Лимит токенов на блок',
tokenLimitDescription: 'Жёсткий лимит токенов на блок (0–8192). 0 = выкл (только символы). Активируйте, когда у вашего эмбеддера небольшой токен-лимит: 200 для MiniLM (256 ток), 400 для BGE/Cohere (512 ток). Современные эмбеддеры (OpenAI, Voyage, Jina-v3) поддерживают >2000 токенов — оставьте 0.',
languagesLabel: 'Языковые подсказки',
languagesDescription: 'Ограничивает эвристические паттерны выбранными языками (DE/EN/ZH). Пусто = автоопределение из образца. Установите явно для однородных корпусов, чтобы избежать ложных срабатываний между языками.',
languagesPlaceholder: 'Автоопределение',
languageOptions: {
de: 'Немецкий',
en: 'Английский',
zh: 'Китайский'
},
debug: {
toggle: 'Проверить разбиение',
toggleHint: 'Запустить разбиение для примера текста без повторной загрузки',
sampleLabel: 'Пример текста',
samplePlaceholder: 'Вставьте фрагмент Markdown / простого текста, чтобы увидеть, как его разобьет текущая конфигурация…',
presetLabel: 'Загрузить пример:',
samples: {
markdown: 'Markdown-документ',
faq: 'Список FAQ',
chapter: 'Главы PDF',
plain: 'Обычный текст'
},
runButton: 'Запустить предпросмотр',
loading: 'Запуск разбиения на примере…',
errorPrefix: 'Ошибка предпросмотра',
selectedTier: 'Выбранная стратегия',
rejected: 'Отклоненные уровни',
contextHeader: 'Контекстный заголовок',
fallbackWarning: 'Цепочка стратегий полностью исчерпана — текущие настройки не позволяют разумно разбить контент',
profile: {
lines: 'строк',
chars: 'символов',
headings: 'заголовков Markdown',
pageBreaks: 'разрывов страниц',
chapterMarkers: 'маркеров глав',
languages: 'языки'
},
stats: {
chunks: 'блоков',
truncated: 'обрезано; всего {total}'
}
}
},
multimodal: {
title: 'Обработка изображений',
description: 'Настройте понимание изображений для парсинга и поиска нетекстового контента',
},
asr: {
title: 'Распознавание речи для аудио',
description:
'Настройте ASR (речь → текст). При включении можно загружать аудиофайлы и транскрибировать их в текст (mp3, wav, m4a, flac, ogg и др.). Загрузка видео не поддерживается.',
label: 'Включить распознавание речи для аудио',
desc: 'При включении в базу можно загружать аудио; речь транскрибируется в текст для парсинга и поиска',
modelLabel: 'Модель ASR',
modelDescription: 'Модель распознавания речи для транскрибации аудио (например, OpenAI Whisper)',
modelPlaceholder: 'Выберите модель ASR',
},
advanced: {
title: 'Расширенные настройки',
description: 'Настройте генерацию вопросов и мультимодальные возможности',
questionGeneration: {
label: 'AI генерация вопросов',
description: 'Генерация связанных вопросов для каждого фрагмента с помощью LLM при парсинге документа для улучшения полноты поиска. Включение увеличит время парсинга документа.',
countLabel: 'Количество вопросов',
countDescription: 'Количество вопросов для генерации на фрагмент документа (1-10)'
},
multimodal: {
label: 'Мультимодальная функция',
description: 'Включите понимание мультимедийного контента, такого как изображения',
vllmLabel: 'VLLM модель для зрения',
vllmDescription: 'Визуально-языковая модель, необходимая для мультимодального понимания',
vllmPlaceholder: 'Выберите VLLM модель (обязательно)',
storageTitle: 'Конфигурация хранилища',
storageTypeLabel: 'Тип хранилища',
storageTypeDescription: 'Выберите способ хранения мультимодальных файлов (MinIO или Tencent Cloud COS)',
storageTypeOptions: {
minio: 'MinIO',
cos: 'Tencent Cloud COS'
},
minioDisabledWarning: 'MinIO не включен. Автоматически переключено на Tencent Cloud COS. Чтобы использовать MinIO, сначала включите его в конфигурации системы.',
minio: {
bucketLabel: 'Имя Bucket',
bucketDescription: 'Название бакета MinIO (обязательно)',
bucketPlaceholder: 'Введите имя Bucket (обязательно)',
useSslLabel: 'Использовать SSL',
useSslDescription: 'Определяет, использовать ли SSL-соединение',
pathPrefixLabel: 'Префикс пути',
pathPrefixDescription: 'Необязательный префикс для путей хранения файлов',
pathPrefixPlaceholder: 'Введите префикс пути',
bucketHint: 'Select an existing bucket with public read access, or enter a new name to create automatically',
policyLabels: {
public: 'Public Read',
private: 'Private',
custom: 'Custom'
}
},
cos: {
secretIdLabel: 'SecretId',
secretIdDescription: 'ID секретного ключа Tencent Cloud API (обязательно)',
secretIdPlaceholder: 'Введите SecretId (обязательно)',
secretKeyLabel: 'SecretKey',
secretKeyDescription: 'Секретный ключ Tencent Cloud API (обязательно)',
secretKeyPlaceholder: 'Введите SecretKey (обязательно)',
regionLabel: 'Регион',
regionDescription: 'Регион, в котором находится бакет COS (обязательно)',
regionPlaceholder: 'Например: ap-guangzhou (обязательно)',
bucketLabel: 'Имя Bucket',
bucketDescription: 'Название бакета COS (обязательно)',
bucketPlaceholder: 'Введите имя Bucket (обязательно)',
appIdLabel: 'AppId',
appIdDescription: 'ID приложения Tencent Cloud (обязательно)',
appIdPlaceholder: 'Введите AppId (обязательно)',
pathPrefixLabel: 'Префикс пути',
pathPrefixDescription: 'Необязательный префикс для путей хранения файлов',
pathPrefixPlaceholder: 'Введите префикс пути'
}
}
},
share: {
description: 'Share the knowledge base with spaces so members can access and use it',
addShare: 'Share',
unshareConfirm: 'Are you sure you want to unshare from "{name}"?',
tip1: 'After sharing, space members will access this knowledge base based on the assigned permissions',
tip2: 'Editable permission allows members to modify content; Read-only permission only allows retrieval and Q&A'
}
},
chat: {
title: 'Диалог',
newChat: 'Новый чат',
suggestedQuestions: 'Вы можете спросить меня',
suggestedQuestionsLoading: 'Загрузка предложений...',
refreshSuggestedQuestions: 'Обновить предложения',
inputPlaceholder: 'Введите ваше сообщение...',
send: 'Отправить',
thinking: 'Думаю...',
regenerate: 'Сгенерировать заново',
copy: 'Копировать',
delete: 'Удалить',
reference: 'Ссылка',
noMessages: 'Нет сообщений',
waitingForAnswer: 'Ожидание ответа...',
cannotAnswer: 'Извините, я не могу ответить на этот вопрос.',
summarizingAnswer: 'Подведение итогов ответа...',
loading: 'Загрузка...',
enterDescription: 'Введите описание',
referencedContent: 'Использовано {count} связанных материалов',
deepThinking: 'Глубокое мышление завершено',
knowledgeBaseQandA: 'Вопросы и ответы на основе базы знаний',
askKnowledgeBase: 'Задайте вопрос базе знаний',
sourcesCount: '{count} источников',
pleaseEnterContent: 'Пожалуйста, введите содержимое!',
pleaseUploadKnowledgeBase: 'Пожалуйста, сначала загрузите базу знаний!',
replyingPleaseWait: 'Идёт ответ, пожалуйста, попробуйте позже!',
createSessionFailed: 'Не удалось создать сеанс',
createSessionError: 'Ошибка создания сеанса',
unableToGetKnowledgeBaseId: 'Невозможно получить ID базы знаний',
summaryInProgress: 'Идёт подготовка ответа…',
referencesTitle: 'Использовано {count} связанного материала',
referencesDocCount: 'Использовано {count} документ(ов)',
referencesDocAndWebCount: 'Использовано {docCount} документ(ов) и {webCount} веб-страниц(ы)',
referenceChunkCount: '{count} фрагмент(ов)',
fallbackHint: 'В базе знаний не найдено релевантного содержимого. Выше представлен прямой ответ модели.',
channelWeb: 'Веб',
channelApi: 'API',
channelIm: 'IM',
chunkLabel: 'Фрагмент {index}:',
navigateToDocument: 'Просмотр документа',
referenceIconAlt: 'Иконка ссылок на материалы',
chunkIdLabel: 'ID фрагмента:',
documentIdLabel: 'ID документа:',
chunkOrdinal: 'Фрагмент {index}',
previewContent: 'Предпросмотр содержимого',
noPlanSteps: 'Подробные шаги не предоставлены',
chunkIndexLabel: 'Фрагмент №{index}',
chunkPositionLabel: '(позиция: {position})',
noRelatedChunks: 'Связанные фрагменты не найдены',
noSearchResults: 'Результаты поиска не найдены',
relevanceHigh: 'Высокая релевантность',
relevanceMedium: 'Средняя релевантность',
relevanceLow: 'Низкая релевантность',
relevanceWeak: 'Слабая релевантность',
webSearchNoResults: 'Результаты веб-поиска не найдены',
otherSource: 'Другие источники',
webGroupIntro: 'Следующие {count} записей получены из',
graphConfigTitle: 'Настройки графа',
entityTypesLabel: 'Типы сущностей:',
relationTypesLabel: 'Типы связей:',
graphResultsHeader: 'Найдено {count} связанных результатов',
graphNoResults: 'Данные графа не найдены',
unknownLink: 'Неизвестная ссылка',
contentLengthLabel: 'Длина {value}',
notProvided: 'Не указано',
promptLabel: 'Промпт',
errorMessageLabel: 'Сообщение об ошибке',
summaryLabel: 'Сводка',
rawTextLabel: 'Исходный текст',
collapseRaw: 'Свернуть оригинал',
expandRaw: 'Развернуть оригинал',
noWebContent: 'Содержимое страницы не получено',
lengthChars: '{value} символов',
lengthThousands: '{value} тыс. символов',
lengthTenThousands: '{value} ×10⁴ символов',
sqlQueryExecuted: 'Выполненный SQL-запрос:',
sqlResultsLabel: 'Результаты:',
rowsLabel: 'строк',
columnsLabel: 'столбцов',
noDatabaseRecords: 'Совпадающих записей не найдено',
nullValuePlaceholder: '<NULL>',
documentTitleLabel: 'Название документа:',
chunkCountLabel: 'Количество фрагментов:',
chunkCountValue: '{count} фрагментов',
documentDescriptionLabel: 'Описание:',
documentStatusLabel: 'Статус:',
documentSourceLabel: 'Источник:',
documentFileLabel: 'Файл:',
documentMetadataLabel: 'Метаданные',
documentInfoSummaryLabel: 'Информация о документах',
documentInfoCount: '{count} из {requested} документов получено',
documentInfoErrors: 'Ошибки',
documentInfoEmpty: 'Нет данных о документах',
statusDescription: 'Информация о статусе',
statusIndexed: 'Документ проиндексирован и доступен для поиска',
statusSearchable: 'Можно искать содержимое документа с помощью инструментов',
statusChunkDetailAvailable: 'Используйте get_chunk_detail для просмотра фрагментов',
positionLabel: 'Позиция:',
chunkPositionValue: 'Фрагмент №{index}',
contentLengthLabelSimple: 'Длина содержимого:',
fullContentLabel: 'Полный текст',
copyContent: 'Скопировать содержимое',
knowledgeBaseCount: '{count} баз знаний',
noKnowledgeBases: 'Нет доступных баз знаний',
rawOutputLabel: 'Исходный вывод',
wikiWritePageTitle: 'Запись страницы Wiki',
wikiReplaceTextTitle: 'Замена текста Wiki',
wikiRenamePageTitle: 'Переименование страницы Wiki',
wikiDeletePageTitle: 'Удаление страницы Wiki',
wikiActionCreated: 'Создано',
wikiActionUpdated: 'Обновлено',
wikiActionRenamed: 'Переименовано',
wikiActionDeleted: 'Удалено',
wikiFieldSlug: 'Путь страницы',
wikiFieldTitle: 'Заголовок',
wikiFieldPageType: 'Тип',
wikiFieldSummary: 'Резюме',
wikiFieldOldText: 'Исходный текст',
wikiFieldNewText: 'Новый текст',
wikiFieldOldSlug: 'Исходный путь',
wikiFieldNewSlug: 'Новый путь',
wikiFieldAffectedPages: 'Затронутые страницы',
wikiAffectedCount: 'Ссылки на {count} страницах обновлены',
selectKnowledgeBaseWarning: 'Пожалуйста, выберите хотя бы одну базу знаний',
processError: 'Ошибка обработки',
sessionExcerpt: 'Выдержка из сессии',
noAnswerContent: '(Нет содержимого ответа)',
noMatchFound: 'Совпадений не найдено',
deleteSessionFailed: 'Ошибка удаления, попробуйте позже!',
imageTooMany: 'Максимум 5 изображений',
imageTypeSizeError: 'Поддерживаются только JPG/PNG/GIF/WEBP до 10 МБ',
imageUploadTooltip: 'Загрузить изображение (вставка/перетаскивание)',
attachmentUploadTooltip: 'Загрузить вложение (документы, аудио и т.д.)',
attachmentWithCount: 'Загружено файлов: {count}',
attachmentTooMany: 'Максимум {max} файлов',
attachmentTooLarge: 'Файл {name} превышает лимит {max} МБ',
attachmentTypeNotSupported: 'Неподдерживаемый тип файла: {name}',
thinkingAlt: 'Обдумывание...',
deepThoughtCompleted: 'Глубокий анализ завершён',
deepThoughtAlt: 'Глубокий анализ'
},
language: {
zhCN: '简体中文',
enUS: 'English',
ruRU: 'Русский',
koKR: '한국어',
selectLanguage: 'Выбрать язык',
language: 'Язык',
languageDescription: 'Выберите язык отображения интерфейса',
languageSaved: 'Настройки языка сохранены'
},
general: {
title: 'Общие настройки',
allSettings: 'Все настройки',
description: 'Настройка языка, внешнего вида и других базовых параметров',
settings: 'Настройки',
close: 'Закрыть настройки'
},
theme: {
theme: 'Тема',
themeDescription: 'Выберите тему оформления интерфейса, поддерживается автоматическое переключение в зависимости от системных настроек',
light: 'Светлая',
dark: 'Тёмная',
system: 'Системная',
selectTheme: 'Выбрать тему'
},
font: {
uiFont: 'Шрифт интерфейса',
uiFontDescription: 'Шрифт для меню, основного текста, кнопок и большинства элементов интерфейса',
monoFont: 'Шрифт для кода',
monoFontDescription: 'Используется для блоков кода, команд терминала, API-ключей, путей к файлам и других технических текстов. Все символы одной ширины, чтобы 0 не путался с O, а 1 — с l.',
selectFont: 'Выбрать шрифт',
sansPreview: 'Образец Sample Шрифт — Aa Gg Oo 0123',
monoPreview: "const msg = 'Hello'; // 0O1l",
sans: {
system: 'Системный по умолчанию',
// macOS
pingfang: 'PingFang SC',
georgia: 'Georgia (с засечками)',
// Windows
yahei: 'Microsoft YaHei',
times: 'Times New Roman (с засечками)',
// Linux
'noto-cjk': 'Noto Sans CJK',
'dejavu-serif': 'DejaVu Serif (с засечками)',
// cross-platform
'sans-serif': 'Стандартный без засечек',
},
mono: {
system: 'Системный по умолчанию',
// macOS
menlo: 'Menlo',
monaco: 'Monaco',
// Windows
consolas: 'Consolas',
cascadia: 'Cascadia Code',
// Linux
'dejavu-mono': 'DejaVu Sans Mono',
'liberation-mono': 'Liberation Mono',
// cross-platform
monospace: 'Стандартный моноширинный',
},
fontSize: 'Размер шрифта',
fontSizeDescription: 'Масштабирует весь интерфейс (текст, иконки, отступы) и применяется немедленно',
size: {
small: 'Маленький',
normal: 'Обычный',
large: 'Крупный',
},
},
platform: {
subtitle: 'Корпоративная платформа знаний на базе больших языковых моделей',
description: 'RAG-поиск, агентные рассуждения и Wiki-базы знаний — чтобы документы действительно понимались и приносили пользу',
rag: 'RAG расширенная генерация',
agent: 'ReAct агент',
wiki: 'Wiki-база знаний',
hybridSearch: 'Гибридный поиск',
localDeploy: 'Локальное развертывание',
multimodalParsing: 'Мультимодальный анализ документов',
hybridSearchEngine: 'Гибридный поиск + граф знаний',
ragQandA: 'Вопрос-ответ с ReAct агентом',
independentTenant: 'Независимое пространство арендатора',
fullApiAccess: 'Полный доступ к API',
knowledgeBaseManagement: 'Управление базой знаний',
carousel: {
agenticRagTitle: 'Agentic RAG',
agenticRagDesc: 'ReAct-рассуждения + вызов инструментов + многошаговое мышление',
hybridSearchTitle: 'Гибридная стратегия поиска',
hybridSearchDesc: 'BM25 + Вектор + Граф знаний',
wikiTitle: 'Wiki-база знаний',
wikiDesc: 'Дистилляция документов в структурированные связанные знания',
smartDocRetrievalTitle: 'Интеллектуальный поиск документов',
smartDocRetrievalDesc: 'Многоформатный разбор PDF/Word/изображений'
}
},
time: {
today: 'Сегодня',
yesterday: 'Вчера',
last7Days: 'Последние 7 дней',
last30Days: 'Последние 30 дней',
lastYear: 'Последний год',
earlier: 'Ранее',
pinned: 'Закреплено',
},
upload: {
uploadDocument: 'Загрузить документ',
uploadFolder: 'Загрузить папку',
onlineEdit: 'Онлайн редактирование',
deleteRecord: 'Удалить запись'
},
agentSettings: {
title: 'Настройки Agent',
description: 'Настройте поведение и параметры AI Agent. Эти параметры применяются ко всем чатам с включённым режимом Agent.',
globalConfigNotice: 'Это глобальные настройки по умолчанию. Новые агенты унаследуют эти настройки. Вы также можете настроить каждого агента индивидуально в списке агентов.',
loadConfigFailed: 'Не удалось загрузить конфигурацию Agent',
loadModelsFailed: 'Не удалось загрузить список моделей',
status: {
label: 'Статус Agent',
ready: 'Готов',
notReady: 'Не готов',
hint: 'После завершения конфигурации статус автоматически изменится на «Готов». Затем можно включить режим Agent в диалоге.',
missingThinkingModel: 'модель мышления',
missingRerankModel: 'модель ранжирования',
missingAllowedTools: 'разрешённые инструменты',
pleaseConfigure: 'Пожалуйста, настройте: {items}',
goConfigureModels: 'Перейти к настройке моделей →',
missingSummaryModel: 'Chat Model (Summary Model)',
goToConfig: 'Go to configure chat model'
},
maxIterations: {
label: 'Макс. число итераций',
desc: 'Максимальное число шагов рассуждений при выполнении задач'
},
thinkingModel: {
label: 'Модель мышления',
desc: 'LLM для рассуждений и планирования',
hint: 'Требуется модель с поддержкой function call'
},
rerankModel: {
label: 'Модель Rerank',
desc: 'Повторная ранжировка результатов поиска и нормализация релевантности'
},
model: {
placeholder: 'Поиск моделей...',
addChat: 'Добавить новую модель диалога',
addRerank: 'Добавить новую модель Rerank'
},
temperature: {
label: 'Температура',
desc: 'Контролирует случайность ответа. 0 — детерминированно, 1 — максимально случайно'
},
allowedTools: {
label: 'Разрешённые инструменты',
desc: 'Список инструментов, доступных Agent',
placeholder: 'Выберите инструменты...',
empty: 'Инструменты не настроены'
},
systemPrompt: {
label: 'Системный промпт',
desc: 'Настройте системный промпт Agent. Подстановки будут заменены во время выполнения.',
availablePlaceholders: 'Доступные подстановки:',
hintPrefix: 'Подсказка: при вводе',
hintSuffix: 'откроется список доступных подстановок',
custom: 'Пользовательский промпт',
disabledHint: 'Сейчас используется промпт по умолчанию. Включите пользовательский, чтобы применить содержимое ниже.',
placeholder: 'Введите системный промпт или оставьте пустым для значения по умолчанию...',
tabHintDetail: "Единый системный промпт (оставьте пустым для значения по умолчанию, используйте {'{{'}web_search_status{'}}'} для динамического управления веб-поиском)",
tabHint: 'Настройте разные промпты для режимов с включённым и отключённым веб-поиском.'
},
reset: {
header: 'Сбросить к промпту по умолчанию',
body: 'Сбросить к значению по умолчанию? Текущий пользовательский промпт будет перезаписан.'
},
errors: {
selectThinkingModel: 'Выберите модель мышления перед включением режима Agent',
selectAtLeastOneTool: 'Выберите хотя бы один инструмент',
iterationsRange: 'Макс. число итераций должно быть от 1 до 20',
temperatureRange: 'Температура должна быть от 0 до 2',
validationFailed: 'Ошибка проверки конфигурации'
},
toasts: {
iterationsSaved: 'Макс. число итераций сохранено',
thinkingModelSaved: 'Модель мышления сохранена',
rerankModelSaved: 'Модель Rerank сохранена',
temperatureSaved: 'Температура сохранена',
toolsUpdated: 'Инструменты обновлены',
customPromptEnabled: 'Пользовательский промпт включён',
defaultPromptEnabled: 'Включён промпт по умолчанию',
resetToDefault: 'Восстановлено значение по умолчанию',
systemPromptSaved: 'Системный промпт сохранён',
autoDisabled: 'Конфигурация Agent неполная. Режим Agent автоматически выключен'
},
modelRecommendation: {
title: 'Model Recommendation',
content: 'For better Agent experience, we recommend using large language models with FunctionCalling support and long context windows, such as deepseek-v3.1-terminus'
}
},
conversationSettings: {
enableQueryExpansion: {
label: 'Включить расширение запросов',
desc: 'При низкой выдаче обращаться к LLM для генерации дополнительных запросов (дороже и медленнее)'
},
toasts: {
enableQueryExpansionSaved: 'Настройка расширения запросов сохранена',
chatModelSaved: 'LLM model saved',
rerankModelSaved: 'ReRank model saved',
contextTemplateSaved: 'Retrieval result summary prompt saved',
systemPromptSaved: 'System prompt saved',
temperatureSaved: 'Temperature saved',
maxTokensSaved: 'Max tokens saved',
maxRoundsSaved: 'History rounds saved',
embeddingSaved: 'Embedding TopK saved',
keywordThresholdSaved: 'Keyword threshold saved',
vectorThresholdSaved: 'Vector threshold saved',
rerankTopKSaved: 'ReRank TopK saved',
rerankThresholdSaved: 'ReRank threshold saved',
enableRewriteSaved: 'Query rewrite preference saved',
fallbackStrategySaved: 'Fallback strategy saved',
fallbackResponseSaved: 'Fallback response saved',
fallbackPromptSaved: 'Fallback prompt saved',
rewritePromptSystemSaved: 'Rewrite system prompt saved',
rewritePromptUserSaved: 'Rewrite user prompt saved',
customPromptEnabled: 'Custom prompt enabled',
defaultPromptEnabled: 'Using default prompt',
customContextTemplateEnabled: 'Custom summary prompt enabled',
defaultContextTemplateEnabled: 'Using default summary prompt',
resetSystemPromptSuccess: 'Reset to default system prompt',
resetContextTemplateSuccess: 'Reset to default summary prompt'
},
contextTemplate: {
label: 'Шаблон контекста',
desc: 'Шаблон промпта для генерации ответов на основе результатов поиска в обычном режиме',
descWithDefault: 'Шаблон промпта для генерации ответов на основе результатов поиска в обычном режиме (оставьте пустым для значения по умолчанию)',
placeholder: 'Введите шаблон промпта для суммирования результатов поиска...',
custom: 'Пользовательский шаблон',
disabledHint: 'Сейчас используется промпт по умолчанию. Включите пользовательский для редактирования.'
},
systemPrompt: {
label: 'Системный промпт',
desc: 'Системный промпт для обычного режима диалога',
descWithDefault: 'Системный промпт для обычного режима диалога (оставьте пустым для значения по умолчанию)',
placeholder: 'Введите системный промпт...',
custom: 'Пользовательский промпт',
disabledHint: 'Сейчас используется промпт по умолчанию. Включите пользовательский для редактирования.'
},
description: 'Configure default behavior and parameters for conversation modes, including prompts for Agent and normal modes',
agentMode: 'Agent Mode',
normalMode: 'Normal Mode',
menus: {
modes: 'Mode Settings',
models: 'Model Mapping',
thresholds: 'Retrieval Thresholds',
advanced: 'Advanced Settings'
},
models: {
description: 'Manage thinking/chat models and re-rank models for both Agent and normal modes',
chatGroupLabel: 'Thinking / Chat Models',
chatGroupDesc: 'Includes Agent reasoning/planning model and the default chat/summary model for normal mode',
chatModel: {
label: 'Default chat model (normal mode)',
desc: 'Used when a conversation does not specify its own model',
placeholder: 'Select default chat model'
},
rerankModel: {
label: 'Default ReRank model (normal mode)',
desc: 'Used for re-ranking when a session does not override it',
placeholder: 'Select default rerank model'
},
rerankGroupLabel: 'ReRank Models',
rerankGroupDesc: 'Includes Agent rerank model and the default rerank model for normal mode'
},
thresholds: {
description: 'Tune retrieval and re-ranking thresholds to balance accuracy and performance'
},
maxRounds: {
label: 'History Rounds',
desc: 'Number of rounds kept for context and query rewrite'
},
embeddingTopK: {
label: 'Embedding TopK',
desc: 'Number of documents kept after vector retrieval'
},
keywordThreshold: {
label: 'Keyword Threshold',
desc: 'Minimum score for keyword retrieval'
},
vectorThreshold: {
label: 'Vector Threshold',
desc: 'Minimum similarity for vector retrieval'
},
rerankTopK: {
label: 'ReRank TopK',
desc: 'Documents kept after re-ranking'
},
rerankThreshold: {
label: 'ReRank Threshold',
desc: 'Minimum score required after re-ranking'
},
enableRewrite: {
label: 'Enable Query Rewrite',
desc: 'Automatically rewrite multi-turn queries for better recall'
},
fallbackStrategy: {
label: 'Fallback Strategy',
desc: 'How to respond when no relevant documents are found',
fixed: 'Fixed response',
model: 'Let the model continue answering'
},
fallbackResponse: {
label: 'Fixed fallback response',
desc: 'Text returned when using the fixed fallback strategy'
},
fallbackPrompt: {
label: 'Fallback Prompt',
desc: 'Prompt used when fallback strategy is "model"'
},
advanced: {
description: 'Configure query rewrite, fallback strategy and other advanced settings'
},
rewritePrompt: {
system: 'Rewrite System Prompt',
user: 'Rewrite User Prompt',
desc: 'System prompt used during query rewrite',
userDesc: 'User prompt used during query rewrite'
},
chatModel: {
label: 'LLM Model',
desc: 'Large language model used for summarization and abstract generation'
},
rerankModel: {
label: 'ReRank Model',
desc: 'Model for re-ranking search results (optional)'
},
temperature: {
label: 'Temperature',
desc: 'Controls randomness in outputs. 0 is most deterministic; 1 is most random'
},
maxTokens: {
label: 'Max Tokens',
desc: 'Maximum number of tokens to generate in the response'
},
resetSystemPrompt: {
header: 'Reset to Default System Prompt',
body: 'Are you sure you want to reset to the default system prompt?'
},
resetContextTemplate: {
header: 'Reset to Default Summary Prompt',
body: 'Are you sure you want to reset to the default summary prompt?'
}
},
mcpSettings: {
title: 'Сервисы MCP',
description: 'Управление внешними сервисами MCP (Model Context Protocol) для использования инструментов и ресурсов в режиме Agent',
// Drawer subtitle chip
enabled: 'Включён',
disabled: 'Отключён',
configuredServices: 'Настроенные сервисы',
manageAndTest: 'Управляйте и тестируйте подключения MCP',
addService: 'Добавить сервис',
empty: 'Сервисы MCP отсутствуют',
addFirst: 'Добавить первый сервис MCP',
actions: {
test: 'Тест соединения'
},
toasts: {
loadFailed: 'Не удалось загрузить список MCP сервисов',
enabled: 'Сервис MCP включён',
disabled: 'Сервис MCP выключен',
updateStateFailed: 'Не удалось обновить статус сервиса MCP',
testing: 'Тестируем {name}...',
noResponse: 'Тест не удался: нет ответа от сервера',
testFailed: 'Не удалось протестировать сервис MCP',
deleted: 'Сервис MCP удалён',
deleteFailed: 'Не удалось удалить сервис MCP'
},
deleteConfirmBody: 'Удалить сервис MCP «{name}»? Действие необратимо.',
unnamed: 'Без названия',
builtin: 'Встроенный'
},
modelSettings: {
title: 'Настройки моделей',
description: 'Управление типами AI‑моделей: локальные (Ollama) и удалённые API',
typeShort: {
chat: 'Чат',
embedding: 'Embedding',
rerank: 'ReRank',
vllm: 'Зрение',
asr: 'Речь',
},
actions: {
addModel: 'Добавить модель',
debugModel: 'Тест модели',
setDefault: 'Сделать по умолчанию'
},
chat: {
title: 'Модели диалога',
desc: 'Модели для диалога',
empty: 'Нет моделей диалога'
},
source: {
remote: 'Удалённая',
openaiCompatible: 'Совместимо с OpenAI',
custom: 'Своё',
},
rawModelName: 'Имя модели',
embedding: {
title: 'Модели встраивания',
desc: 'Модели для векторизации текста',
empty: 'Нет моделей встраивания'
},
rerank: {
title: 'Модели ReRank',
desc: 'Модели для повторной ранжировки результатов',
empty: 'Нет моделей ReRank'
},
vllm: {
title: 'VLLM модели зрения',
desc: 'Визуально-языковые модели для мультимодального понимания',
empty: 'Нет VLLM моделей'
},
asr: {
title: 'ASR модели речи',
desc: 'Модели распознавания речи для транскрибации аудио (например, OpenAI Whisper)',
empty: 'Нет ASR моделей'
},
toasts: {
nameRequired: 'Название модели не может быть пустым',
nameTooLong: 'Название модели не может превышать 100 символов',
displayNameTooLong: 'Отображаемое имя не может превышать 100 символов',
baseUrlRequired: 'Для удалённых API требуется Base URL',
baseUrlInvalid: 'Некорректный Base URL, укажите правильный адрес',
dimensionInvalid: 'Размерность встраивания должна быть 128–4096',
updated: 'Модель обновлена',
added: 'Модель добавлена',
saveFailed: 'Не удалось сохранить модель',
deleted: 'Модель удалена',
deleteFailed: 'Не удалось удалить модель',
setDefault: 'Установлено по умолчанию',
setDefaultFailed: 'Не удалось установить по умолчанию',
builtinCannotEdit: 'Встроенные модели нельзя редактировать',
builtinCannotDelete: 'Встроенные модели нельзя удалить',
builtinCannotCopy: 'Встроенные модели нельзя копировать',
copied: 'Модель скопирована',
copyFailed: 'Не удалось скопировать модель'
},
copySuffix: ' копия',
builtinModels: {
title: 'Встроенные модели',
description: 'Встроенные модели видны всем тенантам. Конфиденциальная информация скрыта, их нельзя редактировать или удалять.',
viewGuide: 'Посмотреть руководство по управлению встроенными моделями'
},
builtinTag: 'Встроенная',
confirmDelete: 'Удалить модель «{name}»?',
debug: {
title: 'Тест модели',
description: 'Отправьте реальный запрос к настроенной модели и проверьте ответ и время выполнения',
groupModel: 'Выбор модели',
groupInput: 'Тестовый ввод',
groupResult: 'Результат',
modelType: 'Тип модели',
model: 'Модель',
modelPlaceholder: 'Выберите модель для теста',
noModelsForType: 'Нет сохранённых моделей этого типа',
query: 'Ввод',
queryPlaceholder: 'Введите текст для отправки модели',
embeddingInput: 'Текст для векторизации',
embeddingPlaceholder: 'Введите текст для создания embedding',
vlmPrompt: 'Промпт для изображения',
vlmPromptPlaceholder: 'Например: подробно опишите это изображение',
documents: 'Кандидаты документов',
documentsPlaceholder: 'Введите один документ на строку',
documentsHint: 'Каждая непустая строка отправляется в модель ReRank как отдельный документ',
imageFile: 'Файл изображения',
audioFile: 'Аудиофайл',
chooseFile: 'Выбрать файл',
parameters: 'Параметры запроса',
thinking: 'Режим размышления',
thinkingDesc: 'Применяется только к моделям с поддержкой размышления',
systemPrompt: 'System Prompt',
systemPromptPlaceholder: 'Необязательно: системный промпт',
run: 'Запустить тест',
copyResult: 'Копировать результат',
history: 'История',
thinkOn: 'Размышление вкл.',
thinkOff: 'Размышление выкл.',
runLabel: 'Запуск №{n}',
success: 'Запрос выполнен',
failed: 'Запрос не выполнен',
rawResponse: 'Ответ',
requestPreview: 'Просмотр запроса',
requestFailed: 'Не удалось выполнить тест модели',
metrics: {
dimension: 'Размерность вектора',
resultCount: 'Количество результатов',
answerChars: 'Символов в ответе',
reasoningChars: 'Символов рассуждения',
reasoningReturned: 'Рассуждение возвращено',
textChars: 'Символов транскрипции',
segmentCount: 'Количество сегментов',
},
},
},
ollamaSettings: {
title: 'Настройки Ollama',
description: 'Управление локальным сервисом Ollama и моделями',
status: {
label: 'Статус Ollama',
desc: 'Автоматическая проверка доступности локального сервиса Ollama. При ошибке адреса или остановке сервиса статус будет «Недоступно».',
testing: 'Проверка',
available: 'Доступно',
unavailable: 'Недоступно',
untested: 'Не проверено',
retest: 'Проверить снова'
},
address: {
label: 'Адрес сервиса',
desc: 'API‑адрес локального сервиса Ollama, определяется автоматически. Чтобы изменить, задайте значение в .env',
placeholder: 'http://localhost:11434',
failed: 'Ошибка подключения. Проверьте, запущен ли Ollama и корректен ли адрес'
},
download: {
title: 'Загрузка моделей',
descPrefix: 'Введите имя модели для загрузки,',
browse: 'Открыть каталог моделей Ollama',
placeholder: 'например: qwen2.5:0.5b',
download: 'Скачать',
downloading: 'Загрузка: {name}'
},
installed: {
title: 'Установленные модели',
desc: 'Список моделей, установленных в Ollama',
empty: 'Установленные модели отсутствуют'
},
toasts: {
connected: 'Соединение установлено',
connectFailed: 'Не удалось подключиться. Проверьте, запущен ли Ollama',
listFailed: 'Не удалось получить список моделей',
downloadFailed: 'Не удалось загрузить. Попробуйте позже',
downloadStarted: 'Начата загрузка модели {name}',
downloadCompleted: 'Модель {name} загружена',
progressFailed: 'Не удалось получить прогресс загрузки'
},
unknown: 'Неизвестно',
today: 'Сегодня',
yesterday: 'Вчера',
daysAgo: '{days} дней назад'
},
mcpServiceDialog: {
addTitle: 'Добавить сервис MCP',
editTitle: 'Редактировать сервис MCP',
// Section + drawer-only keys
basicSection: 'Основное',
connectionSection: 'Подключение',
enableServiceDesc: 'При выключении сервис не будет вызываться',
testAfterSaveHint: 'Сохраните, чтобы протестировать подключение',
unitSecond: 'с',
unitTimes: '×',
name: 'Название сервиса',
namePlaceholder: 'Введите название сервиса',
description: 'Описание',
descriptionPlaceholder: 'Введите описание сервиса',
transportType: 'Тип транспорта',
transport: {
sse: 'SSE (Server-Sent Events)',
httpStreamable: 'HTTP Streamable',
stdio: 'Stdio'
},
serviceUrl: 'URL сервиса',
serviceUrlPlaceholder: 'https://example.com/mcp',
command: 'Команда',
args: 'Аргументы',
argPlaceholder: 'Аргумент {index}',
addArg: 'Добавить аргумент',
envVars: 'Переменные окружения',
envKeyPlaceholder: 'Имя переменной',
envValuePlaceholder: 'Значение',
addEnvVar: 'Добавить переменную',
enableService: 'Включить сервис',
authConfig: 'Аутентификация',
authType: 'Способ аутентификации',
authTypeNone: 'Нет / Свой заголовок',
authTypeApiKey: 'API Key / Token',
authTypeOAuth: 'OAuth 2.0 (авторизация при первом подключении)',
oauthAuthorizeHint: 'Нажатие «Авторизоваться» сначала сохранит текущую конфигурацию, затем запустит авторизацию (каждый пользователь авторизуется отдельно).',
apiKeyHeader: 'Имя заголовка',
apiKeyHeaderDesc: 'По умолчанию X-API-Key. Для Bearer укажите Authorization и впишите "Bearer <token>" в значение ниже; для «сырого» токена используйте Authorization и сам токен.',
credentialValue: 'Секрет / Токен',
apiKey: 'API Key',
bearerToken: 'Bearer Token',
optional: 'Необязательно',
advancedConfig: 'Дополнительно',
timeoutSec: 'Таймаут (с)',
retryCount: 'Число попыток',
retryDelaySec: 'Задержка (с)',
rules: {
nameRequired: 'Введите название сервиса',
transportRequired: 'Выберите тип транспорта',
urlRequired: 'Введите URL сервиса',
urlInvalid: 'Введите корректный URL',
commandRequired: 'Выберите команду (uvx или npx)',
argsRequired: 'Введите хотя бы один аргумент'
},
toasts: {
created: 'Сервис MCP создан',
updated: 'Сервис MCP обновлён',
createFailed: 'Не удалось создать сервис MCP',
updateFailed: 'Не удалось обновить сервис MCP',
oauthRequired: 'Сервис требует OAuth. Переключено на OAuth 2.0 — сохраните и нажмите «Авторизоваться».'
},
customHeaders: {
label: 'Пользовательские заголовки (необязательно)',
desc: 'HTTP-заголовки, добавляемые к каждому запросу MCP; обычно используются для аутентификации на корпоративном шлюзе, трассировки и т. п.',
add: 'Добавить заголовок',
keyPlaceholder: 'Имя заголовка',
valuePlaceholder: 'Значение заголовка'
},
codeImport: {
toggle: 'Импорт из кода',
hint: 'Вставьте стандартную JSON-конфигурацию mcpServers для автозаполнения формы',
placeholder:
'{\n "mcpServers": {\n "my-server": {\n "url": "https://example.com/sse"\n }\n }\n}',
parse: 'Разобрать и заполнить',
editOverwriteHint: 'Импорт перезапишет текущую форму (сохранённые учётные данные не затрагиваются; нажмите «Сохранить», чтобы применить)',
errors: {
empty: 'Сначала вставьте конфигурацию',
invalidJson: 'Не удалось разобрать, проверьте формат JSON',
noServer: 'Конфигурация сервиса MCP не найдена',
missingUrl: 'В конфигурации отсутствует url',
stdioUnsupported: 'Конфигурации stdio (command/args) не поддерживаются; используйте удалённую конфигурацию с url'
},
toasts: {
filled: 'Форма заполнена, проверьте и сохраните',
multipleServers: 'Обнаружено несколько сервисов, импортирован первый: {name}'
}
}
},
manualEditor: {
placeholders: {
heading: 'Заголовок {level}',
listItem: 'Элемент списка',
taskItem: 'Задача',
quote: 'Текст цитаты',
code: 'Содержимое кода',
linkText: 'Текст ссылки',
imageAlt: 'Описание',
bold: 'Жирный текст',
italic: 'Курсив',
strike: 'Зачеркнутый текст',
inlineCode: 'code'
},
table: {
column1: 'Колонка 1',
column2: 'Колонка 2',
cell: 'Содержимое'
},
toolbar: {
bold: 'Жирный',
italic: 'Курсив',
strike: 'Зачёркнутый',
inlineCode: 'Встроенный код',
heading1: 'Заголовок 1',
heading2: 'Заголовок 2',
heading3: 'Заголовок 3',
bulletList: 'Маркированный список',
orderedList: 'Нумерованный список',
taskList: 'Список задач',
blockquote: 'Цитата',
codeBlock: 'Блок кода',
link: 'Вставить ссылку',
image: 'Вставить изображение',
table: 'Вставить таблицу',
horizontalRule: 'Горизонтальная линия'
},
view: {
toggleToEdit: 'Переключить в режим редактирования',
toggleToPreview: 'Переключить в режим предпросмотра',
editLabel: 'Вернуться к редактированию',
previewLabel: 'Предпросмотр'
},
preview: {
empty: 'Пока нет содержимого'
},
title: {
edit: 'Редактировать Markdown-знание',
create: 'Создать Markdown-знание'
},
description: 'Пишите знания в Markdown с предпросмотром в реальном времени',
section: {
basic: 'Основная информация',
content: 'Содержимое'
},
labels: {
currentKnowledgeBase: 'Текущая база знаний'
},
defaultTitlePrefix: 'Новый документ',
error: {
fetchDetailFailed: 'Не удалось получить сведения о знании',
saveFailed: 'Не удалось сохранить, попробуйте позже'
},
warning: {
selectKnowledgeBase: 'Пожалуйста, выберите целевую базу знаний',
enterTitle: 'Введите заголовок знания',
enterContent: 'Введите содержимое знания',
contentTooShort: 'Контент слишком короткий. Добавьте больше информации перед публикацией'
},
success: {
draftSaved: 'Черновик сохранён',
published: 'Знание опубликовано и начата индексация'
},
form: {
knowledgeBaseLabel: 'Целевая база знаний',
knowledgeBasePlaceholder: 'Выберите базу знаний',
titleLabel: 'Заголовок знания',
titlePlaceholder: 'Введите заголовок',
contentPlaceholder: 'Поддерживается Markdown. Используйте # заголовки, списки, блоки кода и т.д.'
},
noDocumentKnowledgeBases: 'Нет доступных баз знаний типа "документ". Пожалуйста, создайте одну сначала',
status: {
draftTag: 'Статус: Черновик',
publishedTag: 'Статус: Опубликовано',
lastUpdated: 'Последнее обновление: {time}'
},
loading: {
content: 'Загрузка содержимого...',
preparing: 'Подготовка редактора...'
},
actions: {
cancel: 'Отмена',
saveDraft: 'Сохранить черновик',
publish: 'Опубликовать'
}
},
input: {
addModel: 'Добавить модель',
placeholder: 'Задайте вопрос напрямую модели',
placeholderWithContext: 'Введите вопрос, ответ будет основан на выбранных выше базах знаний/файлах',
placeholderWebOnly: 'Введите вопрос, ответ будет основан на веб-поиске',
placeholderKbAndWeb: 'Введите вопрос, ответ будет основан на базе знаний и веб-поиске',
placeholderAgent: 'Спросить {name}',
agentMode: 'Умный анализ',
normalMode: 'Быстрый ответ',
normalModeDesc: 'RAG-вопросы и ответы по базе знаний',
agentModeDesc: 'Многошаговое мышление, глубокий анализ',
agentNotReadyTooltip: 'Agent не готов. Пожалуйста, завершите настройку.',
agentNotReadyDetail: 'Agent не готов. Пожалуйста, настройте следующее: {reasons}',
sharedAgentNotReadyDetail: 'Общий agent «{agentName}» не готов (отсутствует: {reasons}). Обратитесь к администратору организации, которая поделилась agent.',
agentMissingAllowedTools: 'Разрешённые инструменты',
agentMissingSummaryModel: 'Модель беседы',
agentMissingRerankModel: 'Модель переранжирования',
goToSettings: 'Перейти к настройкам →',
webSearch: {
toggleOn: 'Включить веб-поиск',
toggleOff: 'Выключить веб-поиск',
notConfigured: 'Веб-поиск не настроен'
},
knowledgeBase: 'База знаний',
knowledgeBaseWithCount: 'База знаний ({count})',
notConfigured: 'Не настроено',
sharedAgentModelLabel: 'Модель из общего агента',
model: 'Модель',
remote: 'Удалённая',
noModel: 'Нет доступных моделей',
stopGeneration: 'Остановить генерацию',
send: 'Отправить',
thinkingLabel: 'Thinking:',
messages: {
enterContent: 'Сначала введите содержимое!',
selectKnowledge: 'Пожалуйста, выберите базу знаний!',
replying: 'Ответ формируется, попробуйте позже!',
agentSwitchedOn: 'Переключено в Agent режим',
agentSwitchedOff: 'Переключено в обычный режим',
agentEnabled: 'Agent режим включён',
agentDisabled: 'Agent режим отключён',
agentNotReadyDetail: 'Agent не готов. Пожалуйста, настройте следующее: {reasons}',
webSearchNotConfigured: 'Веб-поиск не настроен. Сначала выберите провайдера и настройте ключи в разделе настроек.',
webSearchEnabled: 'Веб-поиск включён',
webSearchDisabled: 'Веб-поиск выключен',
sessionMissing: 'ID сессии не существует',
messageMissing: 'Не удалось получить ID сообщения. Обновите страницу и попробуйте снова.',
stopSuccess: 'Генерация остановлена',
stopFailed: 'Не удалось остановить. Попробуйте ещё раз.',
agentSelected: 'Selected agent "{name}"'
},
customAgentNotReadyTooltip: 'Agent is not ready. Please finish configuration first.',
customAgentNotReadyDetail: 'Agent is not ready. Please configure the following: {reasons}',
customAgentMissingSummaryModel: 'Модель беседы',
customAgentMissingRerankModel: 'Модель переранжирования',
goToAgentEditor: 'Go to configure →',
builtinAgentNotReadyDetail: 'Built-in agent "{agentName}" is not ready. Please configure: {reasons}',
builtinAgentSettingName: 'Intelligent Reasoning',
builtinNormalSettingName: 'Quick Q&A',
webSearchDisabledByAgent: 'Web search is disabled by the current agent',
webSearchForcedByAgent: 'Web search is enabled by the current agent and cannot be turned off',
kbLockedByAgent: 'Knowledge base configuration is locked by the current agent',
kbDisabledByAgent: 'Knowledge base is disabled by the current agent',
cannotRemoveAgentKb: 'Cannot remove knowledge base configured by agent',
agentConfiguredKb: 'Configured by agent, cannot be removed',
modelLockedByAgent: 'Model selection is locked by the current agent',
imageUploadDisabledByAgent: 'Image upload is not enabled for this agent',
goToAgentSettings: 'Go to agent settings'
},
preview: {
tab: 'Предпросмотр',
loading: 'Загрузка предпросмотра документа...',
loadFailed: 'Не удалось загрузить предпросмотр документа',
retry: 'Повторить',
unsupported: 'Этот тип файла не поддерживает онлайн-просмотр',
unsupportedHint: 'Скачайте файл и откройте локально',
fullscreen: 'Полноэкранный режим',
exitFullscreen: 'Выйти из полноэкранного режима',
audioLoading: 'Загрузка аудио…',
audioNotSupported: 'Ваш браузер не поддерживает воспроизведение аудио',
},
commandPalette: {
placeholder: 'Поиск по базам знаний, файлам, диалогам…',
searching: 'Поиск…',
clearRecent: 'Очистить',
retrieval: 'Параметры поиска',
untitledSession: 'Безымянный диалог',
scope: {
placeholder: 'Поиск в этой базе знаний…',
remove: 'Убрать область (Backspace)',
},
group: {
chunks: 'Файлы базы знаний',
messages: 'Сообщения',
kbs: 'Базы знаний',
agents: 'Агенты',
sessionsByTitle: 'Диалоги (по названию)',
commands: 'Команды',
recent: 'Недавние',
quickActions: 'Быстрые действия',
},
match: {
vector: 'Вектор',
keyword: 'Ключ.',
},
quick: {
newChat: 'Новый диалог',
knowledgeBases: 'Открыть базы знаний',
agents: 'Открыть агенты',
organizations: 'Открыть общие пространства',
settings: 'Открыть настройки',
productTour: 'Обучение',
},
empty: {
noResults: 'Совпадений не найдено',
askAi: 'Спросить ИИ',
adjustRetrieval: 'Настроить поиск',
},
hotkey: {
select: 'Навигация',
enter: 'Открыть',
cmdNumber: 'Быстрый переход',
cmdEnter: 'Начать диалог',
esc: 'Закрыть',
},
},
knowledgeSearch: {
title: 'Поиск',
subtitle: 'Семантический поиск по базам знаний и истории сообщений для быстрого нахождения релевантного контента',
tabKnowledge: 'Поиск по знаниям',
tabMessages: 'Поиск по сообщениям',
placeholder: 'Введите поисковый запрос...',
messagePlaceholder: 'Поиск по истории сообщений...',
searchBtn: 'Поиск',
selectKb: 'Выбрать базу знаний',
allKb: 'Все базы знаний',
noResults: 'Результаты не найдены',
resultCount: 'Найдено {count} результатов',
score: 'Релевантность',
matchType: 'Тип совпадения',
matchTypeVector: 'Векторное совпадение',
matchTypeKeyword: 'Совпадение по ключевым словам',
untitledSession: 'Без названия',
matchCount: 'совпадений',
emptyHint: 'Введите ключевые слова для поиска релевантного контента в базах знаний',
messageEmptyHint: 'Введите ключевые слова для поиска по истории сообщений',
searching: 'Поиск...',
source: 'Источник',
chunk: 'фрагм.',
expand: 'Развернуть',
collapse: 'Свернуть',
fileCount: 'файлов',
viewDetail: 'Подробнее',
startChat: 'Начать чат',
chatWithFile: 'Чат',
newChatTitle: 'Поиск: {query}'
},
tools: {
multiKbSearch: 'Кросс-КБ поиск',
knowledgeSearch: 'Поиск по базе знаний',
grepChunks: 'Поиск по текстовому шаблону',
getChunkDetail: 'Получить детали фрагмента',
listKnowledgeChunks: 'Список фрагментов знаний',
listKnowledgeBases: 'Список баз знаний',
getDocumentInfo: 'Получить информацию о документе',
queryKnowledgeGraph: 'Запрос к графу знаний',
think: 'Глубокое размышление',
todoWrite: 'Составить план'
},
vectorStoreBadge: {
systemDefault: 'System default',
sharedFromOrg: 'Shared from another organization',
unknownStore: 'Unknown store',
unavailable: 'Unavailable',
},
kbSettings: {
vectorStore: {
title: 'Vector Store',
description:
'Choose which vector store this knowledge base writes to. The binding is permanent — to move an existing KB to a different store, create a new KB and re-index.',
loading: 'Loading vector stores...',
engineLabel: 'Vector store',
engineDesc:
'Pick a store from the global Vector Stores configuration, or leave as System default to use the tenant-wide RETRIEVE_DRIVER engine.',
boundLabel: 'Bound vector store',
systemDefault: 'System default',
immutableHint:
'Cannot be changed after creation. To migrate later, create a new KB bound to the desired store and re-index.',
immutableEdit: 'Vector store binding cannot be changed after creation.',
unavailableHint:
'The bound vector store is currently unavailable; check its connection configuration in Settings → Vector Stores.',
goGlobalSettings: 'Go to Vector Store Settings',
},
storage: {
title: 'Хранилище',
description: 'Выберите хранилище файлов. Это влияет на способ хранения загруженных документов и изображений в документах. Параметры настраиваются в глобальных настройках.',
loading: 'Загрузка...',
engineLabel: 'Хранилище',
engineDesc: 'Выберите хранилище для этой базы знаний. Соответствующее хранилище должно быть настроено в глобальных настройках.',
selectPlaceholder: 'Выберите хранилище',
notConfigured: 'Не настроено',
unavailable: 'Недоступно',
lockedHint: 'В базе знаний уже есть файлы. Невозможно сменить хранилище. Для смены сначала удалите все файлы.',
changeWarning: 'Смена хранилища влияет только на новые загружаемые файлы. Существующие файлы по-прежнему будут читаться из прежнего хранилища, но некоторые старые файлы могут стать недоступными.',
goGlobalSettings: 'Перейти в глобальные настройки',
engineLocal: 'Локальное хранилище',
engineLocalDesc: 'Для однонодового развёртывания, простое и лёгкое',
engineMinioDesc: 'S3-совместимое, для внутренних сетей или частного облака',
engineCos: 'Tencent Cloud COS',
engineCosDesc: 'Публичное облако, поддержка CDN-ускорения',
engineTos: 'Volcengine TOS',
engineTosDesc: 'Объектное хранилище Volcengine, для публичного облака',
engineS3: 'AWS S3',
engineS3Desc: 'AWS S3 и совместимые хранилища, для публичного облака',
engineOss: 'Alibaba Cloud OSS',
engineOssDesc: 'Объектное хранилище Alibaba Cloud, для публичного облака',
engineKs3: 'Kingsoft Cloud KS3',
engineKs3Desc: 'Объектное хранилище Kingsoft Cloud, для публичного облака',
engineObs: 'Huawei Cloud OBS',
engineObsDesc: 'Объектное хранилище Huawei Cloud, для публичного облака',
},
parser: {
title: 'Парсер',
description: 'Выберите парсеры для разных типов файлов. Для ненастроенных типов будет использован встроенный парсер.',
loading: 'Загрузка...',
noEngineAvailable: 'Нет доступных парсеров или сервис парсинга не настроен.',
default: 'По умолчанию',
unavailable: 'Недоступен',
goSettings: 'Перейти в настройки →',
goConfig: 'Перейти к настройке →',
noEngine: 'Нет доступных парсеров',
fileTypePdf: 'Документы PDF',
fileTypeWord: 'Документы Word',
fileTypePpt: 'Презентации',
fileTypeExcel: 'Таблицы Excel',
fileTypeEbook: 'Электронные книги',
fileTypeWebArchive: 'Веб-архивы',
fileTypeCsv: 'Файлы CSV',
fileTypeText: 'Текстовые файлы',
fileTypeJson: 'Файлы JSON',
fileTypeImage: 'Изображения',
fileTypeAudiovisual: 'Аудио',
engines: {
builtin: {
name: 'Встроенный',
desc: 'Встроенный парсер DocReader (docx/pdf/xlsx и другие сложные форматы)',
},
simple: {
name: 'Simple',
desc: 'Простой формат и анализ изображений (внешний сервис не требуется)',
},
mineru: {
name: 'MinerU',
desc: 'Самостоятельно развёрнутый сервис MinerU',
},
mineru_cloud: {
name: 'MinerU Cloud',
desc: 'MinerU Cloud API',
},
paddleocr_vl: {
name: 'PaddleOCR-VL',
desc: 'Самостоятельно развёрнутый сервис PaddleOCR-VL',
},
paddleocr_vl_cloud: {
name: 'PaddleOCR-VL Cloud',
desc: 'PaddleOCR-VL Cloud API',
},
weknoracloud: {
name: 'WeKnora Cloud',
desc: 'Парсинг документов через WeKnora Cloud',
},
markitdown: {
name: 'MarkItDown',
desc: 'Конвертер Microsoft MarkItDown (PDF/Office/HTML и др.)',
},
opendataloader: {
name: 'OpenDataLoader',
desc: 'Парсер OpenDataLoader PDF (анализ вёрстки; требуются Java 11+ и opendataloader-pdf)',
},
},
},
supportedFormats: 'Поддерживаемые форматы'
},
agentStream: {
toolApproval: {
banner: 'Этот инструмент MCP требует подтверждения. Проверьте параметры.',
waiting: 'Ожидание проверки · {target}',
targetWithTool: '{service} › {tool}',
titleWithTarget: 'Проверка · {service} › {tool}',
resolvedApproved: 'Подтверждено · {target}',
resolvedRejected: 'Отклонено · {target}',
service: 'Сервис',
tool: 'Инструмент',
argsLabel: 'Аргументы',
argsModified: 'Изменено',
countdown: 'Осталось около {seconds} с',
countdownShort: '{seconds} с',
approve: 'Подтвердить и выполнить',
reject: 'Отклонить',
approvedTag: 'Подтверждено',
rejectedTag: 'Отклонено',
invalidJson: 'Некорректный JSON',
submitted: 'Отправлено',
submitFailed: 'Ошибка отправки',
userRejected: 'Отклонено пользователем',
},
mcpOAuth: {
banner: 'Этот MCP-сервис требует авторизации OAuth перед использованием',
waiting: 'Ожидание авторизации · {target}',
targetWithTool: '{service} › {tool}',
titleWithService: 'OAuth · {service}',
titleWithTool: 'OAuth · {service} › {tool}',
resolvedAuthorized: 'Авторизовано · {target}',
resolvedTimedOut: 'Тайм-аут · {target}',
resolvedCanceled: 'Пропущено · {target}',
desc: 'Авторизация откроет новое окно для входа. После успешной авторизации вызов инструмента продолжится автоматически.',
authorize: 'Авторизовать',
skip: 'Пропустить',
countdown: 'Осталось примерно {seconds}с',
countdownShort: '{seconds} с',
authorizedTag: 'Авторизовано',
timedOutTag: 'Время авторизации истекло',
canceledTag: 'Отменено',
authorizedToast: 'Авторизация успешна, продолжаем',
startFailed: 'Не удалось начать авторизацию',
resumeFailed: 'Не удалось возобновить выполнение, повторите попытку',
skipFailed: 'Не удалось пропустить, повторите попытку',
},
tools: {
searchKnowledge: 'Поиск по базе знаний',
grepChunks: 'Поиск по текстовому шаблону',
webSearch: 'Веб-поиск',
webFetch: 'Загрузка веб-страницы',
getDocumentInfo: 'Получение информации о документе',
listKnowledgeChunks: 'Список фрагментов знаний',
getRelatedDocuments: 'Поиск связанных документов',
getDocumentContent: 'Получение содержимого документа',
wikiReadSourceDoc: 'Читать исходный документ',
todoWrite: 'Управление планами',
knowledgeGraphExtract: 'Извлечение графа знаний',
thinking: 'Размышление',
imageAnalysis: 'Анализ изображения',
queryUnderstand: 'Понимание запроса',
queryKnowledgeGraph: 'Запрос графа знаний',
readSkill: 'Чтение навыка',
executeSkillScript: 'Выполнение скрипта навыка',
dataAnalysis: 'Анализ данных',
dataSchema: 'Структура данных',
databaseQuery: 'Запрос к базе данных'
},
summary: {
searchKb: 'Поиск по базе знаний <strong>{count}</strong> раз(а)',
thinking: 'Размышление <strong>{count}</strong> раз(а)',
callTool: 'Вызов {name}',
callTools: 'Вызов инструментов {names}',
intermediateSteps: '<strong>{count}</strong> промежуточных шагов',
separator: ', ',
comma: ', '
},
citation: {
loading: 'Загрузка...',
notFound: 'Содержимое не найдено',
loadFailed: 'Ошибка загрузки',
chunkId: 'ID фрагмента',
noKbForWiki: 'Не удалось определить связанную базу знаний, Wiki не может быть открыта',
},
toolSummary: {
getDocument: 'Получить документ: {title}',
document: 'Документ',
listChunks: 'Просмотр {title}',
deepThinking: 'Глубокое размышление'
},
plan: {
inProgress: 'В процессе',
pending: 'Ожидание',
completed: 'Завершено'
},
search: {
noResults: 'Совпадения не найдены',
foundResultsFromFiles: 'Найдено {count} результат(ов) из {files} файл(ов)',
foundResults: 'Найдено {count} результат(ов)',
webResults: 'Найдено {count} результат(ов) веб-поиска',
grepSummary: 'Найдено фрагментов: {chunks}, в документах: {docs}',
},
grepResults: {
chunkHits: '{count} фрагм.',
keywordHits: '{count} вх.',
titleMatch: 'заголовок',
},
knowledgeChunksList: {
chunkRange: 'Загружено {fetched} / {total} фрагментов',
page: 'Стр. {page}, по {pageSize} на странице',
},
ragPipeline: {
understanding: 'Анализ запроса...',
understandDone: 'Запрос понят',
searching: 'Поиск в базе знаний...',
searchingWithQuery: 'Поиск в базе знаний: «{query}»',
searchDone: 'Поиск завершён',
searchDoneWithQuery: 'Поиск в базе знаний: «{query}»',
},
toolStatus: {
calling: 'Вызов {name}...',
searchKb: 'Поиск по базе знаний',
searchKbFailed: 'Ошибка поиска по базе знаний',
webSearch: 'Веб-поиск',
webSearchFailed: 'Ошибка веб-поиска',
grepSearch: 'Поиск по ключевым словам',
grepSearchFailed: 'Ошибка поиска по ключевым словам',
getDocInfo: 'Получение информации о документе',
getDocInfoFailed: 'Ошибка получения информации о документе',
thinkingDone: 'Размышление завершено',
thinkingFailed: 'Ошибка размышления',
updateTodos: 'Обновление списка задач',
updateTodosFailed: 'Ошибка обновления списка задач',
imageAnalyzing: 'Анализ изображения...',
imageAnalysisDone: 'Анализ изображения завершён',
imageAnalysisFailed: 'Ошибка анализа изображения',
queryUnderstanding: 'Анализ запроса...',
queryUnderstandDone: 'Запрос понят',
called: 'Вызван {name}',
calledFailed: 'Ошибка вызова {name}'
},
copy: {
emptyContent: 'Текущий ответ пуст, копирование невозможно',
success: 'Скопировано в буфер обмена',
failed: 'Ошибка копирования, скопируйте вручную'
},
saveToKb: {
emptyContent: 'Текущий ответ пуст, сохранение в базу знаний невозможно',
editorOpened: 'Редактор открыт, выберите базу знаний и сохраните'
}
},
agentEditor: {
builtinHint: 'Это встроенный агент. Имя и описание нельзя изменить, но можно настроить параметры конфигурации.',
navGroups: {
basic: 'Основное',
knowledge: 'Знания и поиск',
capability: 'Расширения',
integration: 'Публикация и интеграция',
},
placeholders: {
available: 'Доступные переменные: ',
clickToInsert: '(нажмите для вставки)',
hint: "(нажмите для вставки или введите {'{{'} для списка)"
},
intentPrompts: {
title: 'Промпты намерений',
sectionDesc: 'Настройте системные промпты для разных намерений запроса; по умолчанию используются шаблоны системы',
intentLabel: 'Намерение',
intentDescription: 'Выберите системный промпт для редактирования',
promptPlaceholder: 'Введите пользовательский системный промпт...',
customized: 'Настроено',
empty: 'Нет доступных шаблонов намерений',
},
promptNav: {
ariaLabel: 'Оглавление промптов',
itemCount: '{n} разделов',
groupCore: 'Основные промпты',
groupConversation: 'Понимание диалога',
groupFallback: 'Запасной ответ при поиске',
system: 'Системный промпт',
context: 'Шаблон контекста',
intent: 'Промпты намерений',
rewriteSystem: 'Перефраз · Система',
rewriteUser: 'Перефраз · Пользователь',
fallback: 'Запасной ответ',
},
selection: {
all: 'Все',
selected: 'Выбранные',
disabled: 'Отключено'
},
desc: {
name: 'Задайте легко узнаваемое имя для агента',
description: 'Кратко опишите назначение и особенности агента',
systemPrompt: 'Пользовательский системный промпт для определения поведения и роли агента',
leaveEmptyDefault: '(оставьте пустым для системного значения по умолчанию)',
contextTemplate: 'Определите формат передачи найденного контента модели',
model: 'Выберите LLM, используемую агентом',
temperature: 'Контроль случайности выхода: 0 — наиболее детерминированный, 1 — наиболее случайный',
maxTokens: 'Максимальное количество токенов в ответе модели',
thinking: 'Включить расширенное мышление модели (требуется поддержка модели)',
conversationSection: 'Настройка параметров многооборотного диалога и перефразирования вопросов',
multiTurn: 'При включении сохраняется контекст истории диалога',
historyRounds: 'Количество последних раундов диалога для сохранения в контексте',
rewrite: 'Автоматическое перефразирование вопросов в многооборотном диалоге для разрешения ссылок и дополнения',
queryUnderstandModel: 'Модель для понимания запроса (перефразирование и распознавание намерения). Пустое значение — использовать основную модель чата.',
rewriteSystemPrompt: 'Системный промпт для перефразирования вопросов (пустое = по умолчанию)',
rewriteUserPrompt: 'Шаблон пользовательского промпта для перефразирования (пустое = по умолчанию)',
selectTools: 'Выберите инструменты, доступные агенту',
maxIterations: 'Максимальное количество шагов рассуждения при выполнении задач',
kbScope: 'Выберите область баз знаний, доступных агенту',
webSearch: 'При включении агент может искать информацию в интернете',
webSearchProvider: 'Укажите поисковый движок для этого агента. Если оставить пустым, будет использоваться движок по умолчанию',
webSearchMaxResults: 'Максимальное количество результатов на один поиск',
webFetchEnabled: 'Автоматически загружать полное содержимое лучших страниц после Rerank для повышения качества ответов',
webFetchTopN: 'Максимальное количество страниц для загрузки полного содержимого после Rerank',
retrievalSection: 'Настройка поиска, ранжирования и стратегии приоритета FAQ',
queryExpansion: 'Автоматическое расширение поисковых запросов для улучшения полноты',
embeddingTopK: 'Максимальное количество результатов векторного поиска',
keywordThreshold: 'Минимальная оценка релевантности для поиска по ключевым словам',
vectorThreshold: 'Минимальная оценка сходства для векторного поиска',
rerankTopK: 'Максимальное количество результатов после переранжирования',
rerankThreshold: 'Минимальная оценка релевантности для переранжирования',
fallbackStrategy: 'Действие при отсутствии релевантного контента в базе знаний',
fallbackResponse: 'Фиксированный текст при невозможности ответить',
fallbackPrompt: 'Промпт для генерации ответа модели, когда ответ не найден в базе знаний'
},
tools: {
thinking: 'Размышление',
thinkingDesc: 'Динамический инструмент рефлексивного решения проблем',
todoWrite: 'Планирование',
todoWriteDesc: 'Создание структурированных исследовательских планов',
grepChunks: 'Поиск по ключевым словам',
grepChunksDesc: 'Быстрый поиск документов и фрагментов с определёнными ключевыми словами',
knowledgeSearch: 'Семантический поиск',
knowledgeSearchDesc: 'Понимание вопросов и поиск семантически связанного контента',
listChunks: 'Просмотр фрагментов документа',
listChunksDesc: 'Получение полного содержимого фрагментов документа',
queryGraph: 'Запрос графа знаний',
queryGraphDesc: 'Запрос связей из графа знаний',
getDocInfo: 'Информация о документе',
getDocInfoDesc: 'Просмотр метаданных документа',
dbQuery: 'Запрос к базе данных',
dbQueryDesc: 'Запрос информации из базы данных',
dataAnalysis: 'Анализ данных',
dataAnalysisDesc: 'Понимание файлов данных и проведение анализа',
dataSchema: 'Схема данных',
dataSchemaDesc: 'Получение метаинформации табличных файлов',
requiresKb: '(требуется настройка базы знаний)',
requiresRagKb: '(требуется база знаний с включённым векторным/ключевым индексом)',
requiresWikiKb: '(требуется база знаний с включённой Wiki)',
// Wiki чтение
wikiSearch: 'Поиск по Wiki',
wikiSearchDesc: 'Поиск страниц Wiki по ключевым словам / семантике',
wikiReadPage: 'Читать страницу Wiki',
wikiReadPageDesc: 'Прочитать полное содержимое указанной Wiki-страницы',
wikiReadSourceDoc: 'Читать исходный документ',
wikiReadSourceDocDesc: 'Глубокое чтение исходных документов, на которых построена Wiki-страница',
wikiFlagIssue: 'Отметить проблему в Wiki',
wikiFlagIssueDesc: 'Отметить фактические ошибки или конфликты слияния',
// Wiki редактирование (разрушительное)
wikiWritePage: 'Создать/перезаписать Wiki',
wikiWritePageDesc: 'Создать новую или полностью перезаписать существующую страницу',
wikiReplaceText: 'Заменить текст в Wiki',
wikiReplaceTextDesc: 'Заменить конкретный текст на Wiki-странице',
wikiRenamePage: 'Переименовать Wiki',
wikiRenamePageDesc: 'Переименовать страницу Wiki и автоматически обновить перекрёстные ссылки',
wikiDeletePage: 'Удалить Wiki',
wikiDeletePageDesc: 'Удалить страницу Wiki и автоматически очистить битые ссылки',
// Wiki проверки
wikiReadIssue: 'Просмотр проблемы Wiki',
wikiReadIssueDesc: 'Просмотр деталей конкретной проблемы страницы Wiki',
wikiUpdateIssue: 'Обновить проблему Wiki',
wikiUpdateIssueDesc: 'Обновить статус проблемы страницы Wiki',
// Служебные (только предпросмотр)
webSearch: 'Поиск в сети',
webFetch: 'Загрузка веб-страницы',
// Группы
groupBase: 'Базовые',
groupRag: 'Поиск в базе знаний (RAG)',
groupWikiRead: 'Чтение Wiki',
groupWikiEdit: 'Редактирование Wiki',
groupWikiIssue: 'Проверка Wiki',
groupData: 'Анализ данных',
writeWarning: 'Изменяет содержимое Wiki',
dangerTag: 'Запись',
// Строка состояния
statusNoKb: 'База знаний не подключена',
statusKb: 'В области: {rag} RAG баз · {wiki} Wiki баз',
kbMetricRag: 'RAG баз',
kbMetricWiki: 'Wiki баз',
statusInactive: '{count} отмеченных инструментов не смогут работать при текущей конфигурации',
// Предпросмотр итоговых инструментов
effectiveLabel: 'Итоговые активные инструменты',
effectiveDesc: 'Рассчитано на основе текущей конфигурации — это набор инструментов, которые агент сможет вызывать после сохранения',
effectiveEmpty: 'Нет доступных инструментов — агент перейдёт к простому чату с моделью'
},
embed: {
title: 'Встраивание на веб-страницу',
description: 'Встройте агента на свою веб-страницу: посетители смогут общаться через встроенное окно чата или плавающую кнопку. Область баз знаний следует настройкам этого агента.',
},
im: {
title: 'Интеграция IM',
description: 'Подключите агента к платформам мгновенных сообщений, таким как Feishu, Slack, Telegram, DingTalk, Mattermost и QQBot',
wecom: 'WeCom',
feishu: 'Feishu',
slack: 'Slack',
telegram: 'Telegram',
dingtalk: 'DingTalk',
mattermost: 'Mattermost',
wechat: 'WeChat',
qqbot: 'QQBot',
addChannel: 'Добавить канал',
channelsTitle: 'IM-каналы',
disabled: 'Отключено',
editChannel: 'Редактировать канал',
deleteConfirm: 'Вы уверены, что хотите удалить этот канал? Это действие не может быть отменено.',
channelName: 'Имя канала',
channelNamePlaceholder: 'Введите имя для легкой идентификации',
channelNameDefaultHint: 'По умолчанию используется название платформы; можно изменить. Если оставить пустым, при сохранении подставится название платформы',
platform: 'Платформа',
mode: 'Режим подключения',
outputMode: 'Режим вывода',
outputStream: 'Стриминг',
outputFull: 'Полное выходное значение',
callbackUrl: 'URL обратного вызова',
empty: 'Нет IM-каналов',
unnamed: 'Неименованный канал',
docLink: 'Руководство по интеграции',
wecomConsole: 'Консоль WeCom',
feishuConsole: 'Платформа Feishu',
slackConsole: 'Консоль Slack API',
telegramConsole: 'Telegram BotFather',
dingtalkConsole: 'Платформа DingTalk',
dingtalkCardTemplateId: 'ID шаблона карточки (необязательно)',
dingtalkCardTemplateIdHint: 'Создайте шаблон AI-карточки на open-dev.dingtalk.com/fe/card для потоковой передачи с эффектом печатной машинки',
mattermostConsole: 'Интеграции Mattermost',
qqbotConsole: 'QQ Open Platform',
qqbotAPIBaseURLHint: 'Необязательно. Оставьте пустым, чтобы использовать стандартный production API endpoint.',
qqbotGatewayURLHint: 'Необязательно. Оставьте пустым, чтобы автоматически получить общий WebSocket gateway.',
mattermostModeHint: 'Mattermost поддерживает только режим Webhook (исходящий вебхук + токен бота).',
mattermostPostToMain: 'Ответы в основной ленте канала',
mattermostPostToMainHint:
'Включено — ответы бота как новые сообщения в канале. Выключено (по умолчанию) — ответы в ветке, в основном окне только «N ответов».',
modeHint: 'Рекомендуется WebSocket — проще настроить',
consoleTip: 'для получения учётных данных',
wecomWSEndpointHint: 'Необязательно. Для приватного развёртывания WeCom укажите пользовательский адрес WebSocket. Оставьте пустым для публичного облака. Для адресов внутренней сети добавьте имя хоста в переменную SSRF_WHITELIST.',
wecomAPIBaseURLHint: 'Необязательно. Для приватного развёртывания WeCom укажите пользовательский базовый URL API. Оставьте пустым для публичного облака. Для адресов внутренней сети добавьте имя хоста в переменную SSRF_WHITELIST.',
fileKnowledgeBase: 'База знаний для файлов',
fileKnowledgeBasePlaceholder: 'Выберите базу знаний (необязательно)',
fileKnowledgeBaseHint: 'При настройке файлы, отправленные пользователями, автоматически сохраняются в эту базу знаний',
sessionMode: 'Режим сессии',
sessionModeUser: 'По пользователю (по умолчанию)',
sessionModeThread: 'По потоку',
sessionModeHint: 'Режим пользователя: отдельный диалог для каждого пользователя. /clear для нового диалога. Режим потока: отдельный диалог для каждого потока. Несколько человек могут общаться в одном потоке.',
wechatScanBind: 'Сканировать QR-код для привязки WeChat',
wechatScanning: 'Отсканируйте QR-код в WeChat',
wechatBindSuccess: 'WeChat успешно привязан',
wechatRebind: 'Перепривязать',
wechatHint: 'Требуется iOS WeChat 8.0.70+, поддерживаются только сообщения 1:1',
wechatQRExpired: 'Срок действия QR-кода истёк, получите новый',
wechatBinding: 'Привязка...',
sectionChannel: 'Информация о канале',
sectionConnection: 'Подключение',
sectionCredentials: 'Учётные данные платформы',
selectPlatform: 'Выберите платформу',
selectPlatformDesc: 'Выберите платформу обмена сообщениями для подключения',
enabled: 'Включить канал',
stepBasic: 'Основное',
stepConnection: 'Подключение',
stepKnowledge: 'Хранение файлов',
stepCredentials: 'Учётные данные',
sectionAccess: 'Доступ и вывод',
sectionSession: 'Сессии',
sectionCallback: 'URL обратного вызова',
sectionKnowledge: 'Хранение файлов',
sectionStatus: 'Статус',
},
agentType: {
label: 'Тип агента',
desc: 'Выбор пресета автоматически заполняет системный промпт, список инструментов и рекомендуемую область баз знаний.',
defaultNamePattern: 'Мой {label}',
kbMismatch: {
ragQa: 'RAG-поиск отключён',
wikiQa: 'Wiki отключён',
hybridRagWiki: 'Поиск не включён',
dataAnalysis: 'Требуется RAG (не FAQ)',
quickAnswer: 'Быстрый ответ требует RAG-поиск',
generic: 'Несовместимо с типом',
},
kbIncompatibleWarn: 'Выбранные базы знаний ({count}) несовместимы с текущим типом. Настройте вручную.'
},
mcp: {
label: 'MCP-сервисы',
desc: 'Выберите MCP-сервисы, доступные агенту',
selectLabel: 'Выбор MCP-сервисов',
selectDesc: 'Выберите MCP-сервисы для включения',
selectPlaceholder: 'Выберите MCP-сервисы'
},
llmCallTimeout: {
label: 'Таймаут вызова LLM',
desc: 'Максимальное время ожидания одного вызова LLM (в секундах). По истечении этого времени вызов прерывается',
hint: 'Оставьте пустым или 0, чтобы использовать значение по умолчанию (120 секунд)',
placeholder: 'Введите количество секунд, рекомендуемый диапазон 60-1800',
},
imageUpload: {
navLabel: 'Мультимодальность',
sectionTitle: 'Настройка мультимодальности',
sectionDesc: 'Настройте загрузку изображений/аудио и соответствующие модели VLM и ASR',
label: 'Загрузка изображений',
desc: 'Разрешить пользователям загружать изображения для мультимодальных вопросов и ответов',
vlmModel: 'Модель VLM',
vlmModelDesc: 'Визуально-языковая модель для анализа изображений',
vlmModelPlaceholder: 'Выберите модель VLM',
vlmModelRequired: 'Модель VLM обязательна при включённой загрузке изображений',
storageProvider: 'Хранилище изображений',
storageProviderDesc: 'Хранилище для загруженных изображений. Оставьте пустым для системного значения по умолчанию',
storageProviderPlaceholder: 'Выберите хранилище',
storageDefault: 'Системное значение',
notConfigured: 'Не настроено',
goStorageSettings: 'Перейти к настройкам хранилища'
},
audioUpload: {
label: 'Загрузка аудио',
desc: 'Позволяет пользователям загружать аудиофайлы в чате. Система автоматически транскрибирует их с помощью ASR-модели.',
asrModel: 'ASR-модель',
asrModelDesc: 'Модель распознавания речи. Если не настроена, аудиофайлы передаются как заглушки.',
asrModelPlaceholder: 'Выберите ASR-модель',
},
faq: {
title: 'Стратегия приоритета FAQ',
tooltip: 'Если база знаний содержит FAQ (пары вопрос-ответ), включите эту стратегию для приоритета ответов FAQ над обычными документами',
enableLabel: 'Включить приоритет FAQ',
enableDesc: 'Ответы FAQ будут приоритетнее обычных документов, повышая точность ответов',
thresholdLabel: 'Порог прямого ответа',
thresholdDesc: 'Если сходство вопроса с FAQ превышает это значение, ответ FAQ используется напрямую',
boostLabel: 'Коэффициент FAQ',
boostDesc: 'Умножение оценки релевантности FAQ на этот коэффициент для повышения ранга'
},
dataAnalysis: {
enableLabel: 'Включить анализ табличных данных',
enableDesc: 'Если извлечённые фрагменты относятся к файлу CSV/Excel, перед ответом LLM сгенерирует SQL-запрос DuckDB. Это добавляет ещё один вызов LLM и несколько секунд задержки, поэтому включайте только при действительной необходимости SQL-анализа.'
},
fallback: {
fixed: 'Фиксированный ответ',
model: 'Генерация моделью'
},
fileTypes: {
label: 'Поддерживаемые типы файлов',
desc: 'Ограничение выбираемых типов файлов. Пустое поле — все типы поддерживаются.',
allTypes: 'Все типы',
pdf: 'PDF-документы',
word: 'Документы Word (.docx/.doc)',
textLabel: 'Текст',
text: 'Текстовые файлы (.txt)',
markdown: 'Документы Markdown',
csv: 'Файлы CSV',
excel: 'Таблицы Excel (.xlsx/.xls)',
imageLabel: 'Изображения',
image: 'Изображения (.jpg/.jpeg/.png)'
}
},
faqManager: {
import: {
recentResult: 'Последние результаты импорта',
totalData: 'Данные импорта',
success: 'Успешно',
failed: 'Ошибка',
skipped: 'Пропущено',
unit: 'запись(ей)',
downloadReasons: 'Скачать причины',
appendMode: 'Режим добавления',
replaceMode: 'Режим замены',
importing: 'Импорт...',
importDone: 'Импорт завершён',
importFailed: 'Ошибка импорта',
waiting: 'Ожидание...',
importInProgress: 'Импорт выполняется, дождитесь завершения',
noFailedRecords: 'Нет записей с ошибками для скачивания'
},
retry: 'Повторить'
},
mermaid: {
diagram: 'Диаграмма',
expand: 'На весь экран',
zoomIn: 'Увеличить',
zoomOut: 'Уменьшить',
reset: 'Сброс',
download: 'Скачать изображение',
close: 'Закрыть',
downloading: 'Загрузка...'
},
ollama: {
unknown: 'Неизвестно',
today: 'Сегодня',
yesterday: 'Вчера',
daysAgo: '{days} дней назад'
},
listSpaceSidebar: {
title: 'Фильтр',
all: 'Все',
workspace: 'Рабочая область',
mine: 'Мои',
spaces: 'Доступно мне',
favorites: 'Избранное',
recents: 'Недавние'
},
listFilter: {
creator: 'Автор',
allCreators: 'Все',
createdByMe: 'Созданные мной',
createdByOthers: 'Созданные другими'
},
resourceOrigin: {
mine: 'Мои',
mineTooltip: 'Создано вами',
tenant: 'Рабочая область',
tenantTooltip: 'Создано другим участником рабочей области',
tenantTooltipWithCreator: 'Создано {creator}',
space: 'Пространство',
spaceTooltip: 'Через пространство "{space}"',
spaceTooltipWithTenant: 'Через пространство "{space}" · от {tenant}',
shared: 'Внешнее',
sharedTooltip: 'Доступ из внешнего арендатора через общее пространство'
},
promptTemplate: {
noTemplates: 'No templates available',
selectTemplate: 'Select Template',
useTemplate: 'Use Template',
resetDefault: 'Reset Default',
default: 'Default',
withKnowledgeBase: 'KB',
withWebSearch: 'Web Search',
},
organization: {
title: 'Shared Spaces',
subtitle: 'Create or join shared spaces so multiple workspaces can collaborate and share knowledge bases and agents',
createOrg: 'Create Space',
createOrgShort: 'New',
joinOrg: 'Join Space',
joinOrgShort: 'Join',
name: 'Space Name',
namePlaceholder: 'Enter space name',
nameRequired: 'Please enter space name',
avatar: 'Space Avatar',
avatarClear: 'Clear',
avatarPickerHint: 'Choose an emoji as space avatar',
description: 'Description',
descriptionPlaceholder: 'Enter space description (optional)',
noDescription: 'No description',
members: 'members',
memberCount: 'Member count',
owner: 'Creator',
inviteCode: 'Invite Code',
inviteCodePlaceholder: 'Enter invite code',
inviteCodeRequired: 'Please enter invite code',
inviteCodeTip: 'Share this invite code with others to let them join your space',
refreshInviteCode: 'Refresh Invite Code',
inviteCodeRefreshed: 'Invite code refreshed',
inviteCodeRefreshFailed: 'Failed to refresh invite code',
rbac: {
needTenantAdmin: 'Требуется роль администратора тенанта',
needTenantAdminTip: 'Для этого действия требуется роль admin или выше в текущем тенанте. Обратитесь к владельцу тенанта.',
cannotCreate: 'Недостаточно прав в текущем тенанте для создания общего пространства',
cannotJoin: 'Недостаточно прав в текущем тенанте для присоединения к общему пространству',
cannotManage: 'Недостаточно прав в текущем тенанте для управления общим пространством',
},
join: {
title: 'Join Space',
joining: 'Joining space...',
success: 'Successfully joined space!',
failed: 'Failed to join space',
noCode: 'Invite code not found',
goToOrganizations: 'Go to Spaces',
confirmTitle: 'Confirm Join Space',
confirm: 'Confirm Join',
preview: 'Preview & Join',
memberCount: '{count} members',
shareCount: '{count} shared knowledge bases',
agentShareCount: '{count} agents',
alreadyMember: 'You are already a member of this space',
invalidCode: 'Invalid invite code',
byInviteCode: 'Enter invite code',
searchSpaces: 'Search spaces',
searchSpacesDesc: 'Browse or search spaces that are open for discovery; join without an invite code',
searchSpacesPlaceholder: 'Search by space name, description or space ID',
spaceId: 'Space ID',
noSearchResult: 'No matching spaces',
noSearchableSpaces: 'No discoverable spaces yet, or try a search',
membersWithLimit: '{current}/{limit} members',
memberLimitReached: 'Full',
backToSearch: 'Back to search'
},
invite: {
loading: 'Loading...',
previewTitle: 'Join Space',
previewInfo: 'Space Overview',
inputDesc: 'Enter the invite code (or paste from an invite link) to view the space and join',
previewAction: 'View',
primaryJoin: 'Join',
invalidTitle: 'Invalid Invitation',
invalidCode: 'Invite code is invalid or expired',
previewFailed: 'Preview failed, please try again',
members: 'Members',
knowledgeBases: 'Knowledge Bases',
agents: 'Agents',
alreadyMember: 'You are already a member of this space',
confirmJoin: 'Confirm Join',
submitRequest: 'Request to Join',
requireApprovalTip: 'This space requires admin approval to join',
approvalLabel: 'Join method',
needApproval: 'Requires approval',
noApproval: 'No approval required',
defaultRoleAfterJoin: 'Default role after joining: {role}',
requestRole: 'Requested role',
selectRole: 'Select role',
messagePlaceholder: 'Optional: message (e.g. intro or reason to join)',
applicationNote: 'Application note (optional)',
joinSuccess: 'Successfully joined space!',
joinFailed: 'Failed to join, please try again',
requestSubmitted: 'Request submitted, please wait for admin approval',
requestFailed: 'Failed to submit request, please try again',
viewOrganization: 'View Space'
},
leave: 'Leave Space',
leaveConfirm: 'Are you sure you want to leave this space?',
leaveConfirmTitle: 'Leave Space',
leaveConfirmMessage: 'Are you sure you want to leave "{name}"? You will lose access to shared knowledge bases.',
leaveSuccess: 'Left space successfully',
leaveFailed: 'Failed to leave space',
deleteConfirm: 'Are you sure you want to delete this space? This action cannot be undone.',
deleteConfirmTitle: 'Delete Space',
deleteConfirmMessage: 'Are you sure you want to delete "{name}"? All members will be removed. This action cannot be undone.',
deleteSuccess: 'Space deleted',
deleteFailed: 'Failed to delete space',
createSuccess: 'Space created successfully',
createFailed: 'Failed to create space',
joinSuccess: 'Joined space successfully',
joinFailed: 'Failed to join space',
manageMembers: 'Manage Members',
noMembers: 'No members',
roleUpdated: 'Role updated',
roleUpdateFailed: 'Failed to update role',
memberRemoved: 'Member removed',
memberRemoveFailed: 'Failed to remove member',
empty: 'You have not joined any shared space yet',
emptyDesc: 'Create a space or join an existing one with an invite code',
all: 'All',
createdByMe: 'Created by me',
joinedByMe: 'Joined',
createdTag: 'Created',
joinedTag: 'Joined',
joinedLabel: 'Joined',
emptyCreated: 'You have not created any space yet',
emptyCreatedDesc: 'Click "Create Space" to create one',
emptyJoined: 'You have not joined any space yet',
emptyJoinedDesc: 'Join an existing space with an invite code',
role: {
admin: 'Admin',
editor: 'Editor',
viewer: 'Viewer'
},
detail: {
myRole: 'My Role',
removeMemberTitle: 'Remove Member',
removeMemberConfirm: 'Are you sure you want to remove "{name}"?',
removeMember: 'Remove Member',
shareKBTip: 'Go to knowledge base list, select a knowledge base and click share to share it to this space'
},
settings: {
editTitle: 'Space Settings',
detailTitle: 'Space Details',
myRoleDesc: 'Your role in this space determines your permissions',
membersDesc: 'Просмотр и управление участниками пространства и их ролями. Каждый участник — это один тенант: все пользователи внутри тенанта получают одинаковый доступ к пространству.',
sharedDesc: 'View all knowledge bases shared to this space',
noSharedKB: 'No shared knowledge bases yet',
noSharedKBTip: 'Knowledge base owners can share their knowledge bases to this space in KB settings',
sharedAgents: 'Shared Agents',
noSharedAgents: 'No shared agents yet',
sharedAgentsDesc: 'Agents shared to this space; members can use them in chat',
sharedAgentsKbHint: "Knowledge bases linked to an agent are only available (read-only) when members use that agent in a conversation (via {'@'}). They do not appear in the Knowledge Base list. To let members see or edit a knowledge base in the list, share that knowledge base to this space separately.",
sharedAgentsKbHintShort: 'Agent-linked knowledge is read-only in chat; share the KB to this space if members should see or edit it in the list.',
noSharedAgentsTip: 'Admins can share agents to this space from agent settings',
sharePermissionLabel: 'Space permission',
myPermissionLabel: 'My actual permission',
permissionCalcFormula: 'Space permission is what was set when the KB was shared to this space; my actual permission = min(space permission, my role in this space)',
permissionCalcTip: 'My actual permission = min(space permission, my role in this space). As a viewer in the space, I have at most read-only on this KB; as editor or admin, my permission is capped by the space permission.',
inviteMembers: 'Invite Members',
inviteMembersDesc: 'Invite others to join the space via code or link',
inviteLink: 'Invite Link',
inviteLinkValidity: 'Invite link validity',
inviteLinkValidityDesc: 'Validity period for newly generated invite links',
validity1Day: '1 day',
validity7Days: '7 days',
validity30Days: '30 days',
validityNever: 'Never expire',
remainingValidity: 'Expires in {n} days',
remainingValidityNever: 'Never expire',
remainingValidityExpired: 'Expired',
removeShareFromOrg: 'Remove from space',
removeShareConfirm: 'Remove "{name}" from this space? Members will no longer have access to this knowledge base.',
removeAgentShareConfirm: 'Remove "{name}" from this space? Members will no longer have access to this agent.',
removeShareSuccess: 'Removed from space',
removeShareFailed: 'Failed to remove, please try again',
requireApproval: 'Require Approval',
requireApprovalDesc: 'When enabled, new members need admin approval to join',
searchable: 'Open for search',
searchableDesc: 'When enabled, this space appears in the "Join Space" search list; others can search and request to join without an invite code',
memberLimit: 'Member limit',
memberLimitDesc: 'No new members can be added when the limit is reached; 0 means unlimited',
memberLimitPlaceholder: '0 = unlimited',
memberLimitHint: 'Current members: {count}',
joinRequests: 'Join Requests',
joinRequestsDesc: 'Review pending requests to join the space',
noPendingRequests: 'No pending requests',
pendingJoinRequestsBadge: 'Pending join requests to review',
pendingReview: 'Pending',
assignRole: 'Assign role',
approve: 'Approve',
reject: 'Reject',
approveSuccess: 'Request approved',
rejectSuccess: 'Request rejected',
reviewFailed: 'Operation failed, please try again'
},
editor: {
navBasic: 'Basic Info',
navPermissions: 'Permissions',
navJoin: 'Join Space',
basicTitle: 'Basic Information',
basicDesc: 'Set the space name and description for easy identification',
nameTip: 'Use your team or project name for easy identification',
descriptionTip: 'Describe the purpose and goals of the space',
permissionsTitle: 'Member Permissions',
permissionsDesc: 'Understand the permission scope of different roles for knowledge bases and agents in the space',
permissionFeature: 'Permission Feature',
fullAccess: 'Full Access',
editAccess: 'Edit Access',
viewAccess: 'View Only',
adminPerm1: 'Manage space settings, members, and knowledge base & agent sharing',
adminPerm2: 'Share and manage knowledge bases and agents',
adminPerm3: 'Edit shared knowledge base content',
adminPerm4: 'View and search knowledge bases',
useSharedAgentsPerm: 'Use shared agents',
shareKBPerm: 'Share knowledge bases to space',
editorPerm1: 'Edit shared knowledge base content',
editorPerm2: 'View and search knowledge bases',
editorPerm3: 'Manage space settings and members',
viewerPerm1: 'View and search knowledge bases',
viewerPerm2: 'Edit knowledge base content',
viewerPerm3: 'Manage space settings',
ownerNote: 'As the space creator, you will automatically become an admin with full permissions.',
joinTitle: 'Join Space',
joinDesc: 'Join an existing space with an invite code to access shared knowledge bases and agents',
joinIllustration: 'Enter the invite code provided by the space admin to join',
inviteCodeTip: 'The invite code is generated by space admins, please ask them for it',
howToGetCode: 'How to get an invite code?',
step1: 'Contact the admin of the space you want to join',
step2: 'Ask them to share the space invite code',
step3: 'Paste the invite code in the input field above'
},
upgrade: {
requestUpgrade: 'Request Permission Upgrade',
pending: 'Request Submitted',
dialogTitle: 'Request Permission Upgrade',
currentRole: 'Current Role',
selectRole: 'Request Role',
reason: 'Reason (Optional)',
reasonPlaceholder: 'Please briefly explain why you need higher permissions...',
submitSuccess: 'Upgrade request submitted, waiting for admin approval',
submitFailed: 'Failed to submit request',
upgradeRequest: 'Permission Upgrade'
},
addMember: {
button: 'Add Member',
dialogTitle: 'Add Member',
tip: 'Added users will immediately become space members and can access shared knowledge bases.',
tipTenant: 'Членство задаётся на уровне тенанта: после присоединения тенанта все его пользователи получают доступ к этому пространству. Результаты ниже сгруппированы по тенанту.',
searchUser: 'Select User',
searchTenant: 'Выбрать тенант',
searchPlaceholder: 'Search by username or email...',
searchTenantPlaceholder: 'Поиск по имени тенанта, пользователя или email...',
searchHint: 'Type at least 2 characters to search',
searchTenantHint: 'Введите не менее 2 символов; результаты сгруппированы по тенанту и не включают уже добавленных.',
selectRole: 'Assign Role',
confirmBtn: 'Add',
success: 'Member added successfully',
failed: 'Failed to add member',
roleHint: {
viewer: 'Can view and search',
editor: 'Can edit content',
admin: 'Full management access'
}
},
share: {
title: 'Share Knowledge Base',
shareToSpace: 'Share to space',
shareModelToSpace: 'Share "{name}" to space',
shareAgentToSpace: 'Share "{name}" to space',
modelShareDesc: 'Share this model to a space so members can use it',
agentShareDesc: 'Share this agent to a space so members can use it',
spaceAgentShareCountTip: 'Number of agents shared to this space',
selectOrg: 'Select Space',
selectOrgPlaceholder: 'Select a space to share with',
permission: 'Permission',
permissionTip: 'Editable permission allows members to modify knowledge base content, Read-only permission only allows search and Q&A',
shareSuccess: 'Knowledge base shared',
shareFailed: 'Failed to share',
unshareSuccess: 'Share cancelled',
unshareFailed: 'Failed to cancel share',
sharedTo: 'Shared to',
noShares: 'Not shared to any space yet',
sharedKnowledgeBase: 'Shared Knowledge Base',
sharedFrom: 'From',
sharedBadge: 'Shared',
permissionReadonly: 'Read-only',
permissionEditable: 'Editable',
sharedKBs: ' knowledge bases',
sharedAgents: ' agents'
}
},
datasource: {
title: 'Источники данных',
description: 'Настройте внешние источники данных для автоматической синхронизации контента',
channelsTitle: 'Источники данных',
add: 'Добавить источник',
addFirst: 'Добавить первый источник данных',
empty: 'Источники данных не настроены',
edit: 'Редактировать',
delete: 'Удалить',
deleteConfirm: 'Удалить этот источник данных? Синхронизированные знания не будут удалены.',
deleteSuccess: 'Источник данных удалён',
deleteFailed: 'Не удалось удалить',
syncNow: 'Синхронизировать',
syncTriggered: 'Задача синхронизации отправлена',
syncFailed: 'Не удалось запустить синхронизацию',
pause: 'Пауза',
resume: 'Возобновить',
paused: 'Приостановлено',
resumed: 'Возобновлено',
pauseFailed: 'Не удалось приостановить',
logs: 'Журнал',
moreActions: 'Дополнительные действия',
lastSync: 'Последняя синхронизация',
lastStatus: 'Результат',
schedule: 'Расписание',
syncModeLabel: 'Режим синхронизации',
syncMode: {
incremental: 'Инкрементная',
full: 'Полная',
},
status: {
active: 'Подключено',
paused: 'Приостановлено',
error: 'Ошибка',
},
createTitle: 'Добавить источник данных',
editTitle: 'Редактировать источник данных',
nameLabel: 'Название',
namePlaceholder: 'Введите название источника данных',
sectionBasic: 'Основная информация',
testConnection: 'Проверить подключение',
testSuccess: 'Подключение успешно',
testFailed: 'Подключение не удалось',
connected: 'Подключено',
connectionFailed: 'Подключение не удалось',
isRequired: 'обязательно для заполнения',
credentialsLabel: 'учётные данные',
resourceHint: 'Выберите пространства или папки для синхронизации',
untitled: 'Без названия',
resourceLoadFailed: 'Не удалось загрузить список ресурсов',
noResources: 'Пространства вики не найдены',
noResourcesDesc: 'Приложению требуется доступ к вики через групповой чат для получения контента',
noResourcesDesc_notion: 'Приложению требуются права доступа к странице Notion для получения контента',
retryLoadResources: 'Повторить',
guideStep1: 'Создайте групповой чат в Feishu, затем добавьте ваше приложение как бота в настройках группы',
guideStep2: 'Откройте вики "Настройки" > "Управление участниками" > "Добавить участника", найдите групповой чат и добавьте его',
guideStep3: 'Убедитесь, что роль группового чата как минимум "Может читать", затем вернитесь и нажмите Повторить',
guideStep1_notion: 'Откройте страницу или базу данных, которую хотите синхронизировать в Notion',
guideStep2_notion: 'Нажмите меню «···» в правом верхнем углу, выберите «Connect to» или «Add connections»',
guideStep3_notion: 'Найдите и выберите ваше интеграционное приложение, затем вернитесь и нажмите Повторить',
permissionDocLink: 'Документация по настройке прав доступа',
syncScheduleLabel: 'Расписание синхронизации',
conflictLabel: 'Стратегия конфликтов',
conflict: {
overwrite: 'Перезаписать',
skip: 'Пропустить существующие',
},
syncDeletions: 'Синхронизировать удаления (удалять знания при удалении в источнике)',
createAndSync: 'Создать и синхронизировать',
createSuccess: 'Источник данных создан',
createAndSyncSuccess: 'Источник данных создан, задача синхронизации поставлена в очередь',
createButSyncFailed: 'Источник данных создан, но не удалось запустить синхронизацию',
updateSuccess: 'Источник данных обновлён',
updateSuccessSyncHint: 'Источник данных обновлён. Редактирование не запускает синхронизацию автоматически; нажмите «Синхронизировать», чтобы импортировать изменения.',
saveFailed: 'Не удалось сохранить',
step: {
selectType: 'Выберите тип',
credentials: 'Учётные данные',
resources: 'Ресурсы',
strategy: 'Стратегия',
},
syncHistory: 'История синхронизации',
refreshLogs: 'Обновить журнал',
noLogs: 'Нет записей синхронизации',
logStatus: {
running: 'Синхронизация',
success: 'Успешно',
partial: 'Частично',
failed: 'Ошибка',
canceled: 'Отменено',
},
logMetric: {
total: 'Всего',
created: 'Добавлено',
updated: 'Обновлено',
deleted: 'Удалено',
skipped: 'Пропущено',
failed: 'ошибок',
},
logSummary: {
total: 'Всего запусков',
success: 'Успешно',
failed: 'Ошибки',
items: 'Элементов синхронизации',
},
logLatest: 'Последняя',
logDetail: {
startTime: 'Время начала',
endTime: 'Время окончания',
duration: 'Длительность',
},
connector: {
feishu: 'Feishu (Фэйшу)',
notion: 'Notion',
yuque: 'Yuque (Юйцюэ)',
rss: 'RSS / Atom лента',
},
connectorDesc: {
feishu: 'Синхронизация документов, таблиц и файлов из Feishu Wiki',
notion: 'Синхронизация страниц и баз данных из Notion',
yuque: 'Синхронизация документов из баз знаний Yuque',
rss: 'Синхронизация статей из лент RSS / Atom',
},
field: {
appId: 'App ID',
appSecret: 'App Secret',
integrationToken: 'Integration Token',
baseUrl: 'Base URL',
apiToken: 'API Token',
baseUrlHint: 'Оставьте пустым, чтобы использовать публичное облако Yuque https://www.yuque.com. Если вы используете Yuque Enterprise или приватное развёртывание, укажите корпоративный домен (например, https://your-company.yuque.com)',
feedUrls: 'Адреса лент',
feedUrlsHint: 'По одному адресу ленты RSS / Atom в строке; можно указать несколько.',
authHeaders: 'Пользовательские заголовки (необязательно)',
authHeadersHint: 'Для приватных лент. По одному в строке в формате «Имя: Значение», например Authorization: Bearer xxxx',
},
comingSoon: 'Скоро',
docHint: 'Получить учётные данные можно здесь:',
openDoc: 'Открыть документацию',
copyUrl: 'Копировать URL',
copied: 'Скопировано',
pleaseTestFirst: 'Сначала проверьте подключение',
prereqTitle: 'Перед использованием выполните все следующие настройки (обязательно)',
prereqBarText: 'Используете впервые? Нажмите, чтобы открыть руководство по настройке приложения Feishu',
prereqBarText_yuque: 'Используете впервые? Нажмите, чтобы открыть руководство по настройке Yuque Token',
prereqStep1Brief_yuque: 'Создайте персональный Yuque Token',
prereqStep1Desc_yuque: 'Войдите в Yuque → значок профиля → Настройки → Token → Создать новый Token',
prereqStep2Brief_yuque: 'Назначьте Token необходимые права',
prereqStep2Desc_yuque: 'Выберите как минимум repo:read и doc:read (чтение баз знаний и содержимого документов)',
prereqStep3Brief_yuque: '(Опционально) Для Enterprise укажите Base URL',
prereqStep3Desc_yuque: 'Пользователям публичного облака указывать не нужно. Для Yuque Enterprise или приватного развёртывания укажите корпоративный домен',
prereqOpenConsole_yuque: 'Перейти к настройкам Yuque Token',
prereqBotBrief: 'Добавьте приложению возможность «Бот»',
prereqBotDesc: 'Открытая платформа → Добавить возможность приложения → Бот → Создать версию и опубликовать',
prereqBotLabel: '1. Добавьте приложению возможность «Бот» (иначе приложение не будет найдено в базе знаний):',
prereqBotStep1: 'Откройте ваше приложение в Feishu Open Platform и нажмите «Добавить возможность приложения» слева',
prereqBotStep2: 'Выберите «Бот» и подтвердите добавление',
prereqBotStep3: 'Создайте новую версию и опубликуйте (или выполняйте отладку в тестовой компании)',
prereqPermBrief: 'Включите права API',
prereqPermLabel: '2. Включите для приложения следующие права API:',
prereqOpenConsole: 'Открыть настройки Feishu Open Platform',
prereqMemberBrief: 'Добавьте через групповой чат как участника базы знаний',
prereqMemberDesc: 'Создайте групповой чат → добавьте приложение как группового бота → добавьте групповой чат как участника базы знаний',
prereqMemberLabel: '3. Добавьте приложение как участника базы знаний через групповой чат (приложение нельзя найти в базе знаний напрямую):',
back: 'Назад',
next: 'Далее',
save: 'Сохранить',
schedule30min: 'Каждые 30 мин',
schedule1h: 'Каждый час',
schedule6h: 'Каждые 6 часов',
schedule12h: 'Каждые 12 часов',
schedule24h: 'Ежедневно',
scheduleHuman: {
'30min': 'Каждые 30 мин',
'1h': 'Каждый час',
'6h': 'Каждые 6 часов',
'12h': 'Каждые 12 часов',
'24h': 'Ежедневно',
},
addCard: 'Добавить источник данных',
wikiSpace: 'Пространство вики',
resourceType: {
wikiSpace: 'Пространство вики',
docCategory: 'Тег документа',
book: 'База знаний Yuque',
},
neverSynced: 'Не синхронизировано',
justNow: 'Только что',
minutesAgo: '{n} мин назад',
hoursAgo: '{n} ч назад',
daysAgo: '{n} д назад',
syncResultCreated: '+{n}',
syncResultUpdated: '~{n}',
syncResultDeleted: '-{n}',
},
integrations: {
title: 'Публикация и интеграция',
subtitle: 'Публикуйте агентов в IM, на сайтах, в браузере и AI-ассистентах',
tabs: {
im: 'IM-интеграция',
embed: 'Веб-встраивание',
chrome: 'Расширение Chrome',
claw: 'Claw Skill',
},
manageSectionTitle: 'Настройка каналов',
manageSectionDesc: 'Выберите агента, чтобы создать или изменить каналы интеграции для него',
selectAgent: 'Выберите агента',
selectAgentDesc: 'Каждый канал интеграции привязан к одному агенту. Выберите агента для настройки.',
selectAgentPlaceholder: 'Выберите агента',
selectAgentHint: 'Сначала выберите агента',
boundAgent: 'Привязанный агент',
filterByAgent: 'Фильтр по агенту',
filterByAgentWithName: 'Фильтр по агенту: {name}',
filterAllAgents: 'Все агенты',
manageChannel: 'Управлять каналом',
goToCenter: 'Открыть интеграции',
imOverview: {
title: 'Подключённые IM-каналы',
subtitle: 'Все IM-каналы агентов в этом пространстве. Быстро включайте/выключайте или настраивайте ниже.',
},
embedOverview: {
title: 'Каналы веб-встраивания',
subtitle: 'Все каналы веб-встраивания агентов в этом пространстве. Быстро включайте/выключайте или настраивайте ниже.',
empty: 'Каналы веб-встраивания ещё не настроены',
loadFailed: 'Не удалось загрузить каналы веб-встраивания',
},
agentEditor: {
label: 'Каналы публикации',
desc: 'Публикуйте агента в IM или на сайт. Управление — в разделе «Интеграции».',
manage: 'Управлять',
},
chrome: {
title: 'Помощник по знаниям',
subtitle:
'Для self-hosted WeKnora: вопросы в боковой панели, клиппинг страниц и Markdown-заметки в базы знаний прямо при просмотре.',
capabilitiesTitle: 'Возможности',
capabilities: {
qa: {
title: 'Q&A по базе знаний',
desc: 'Боковая панель, несколько БЗ, режимы быстрый/глубокий/точный — без смены вкладки.',
},
clip: {
title: 'Сбор веб-контента',
desc: 'Сохранение URL, AI-извлечение текста или выбор области на странице.',
},
notes: {
title: 'Markdown-заметки',
desc: 'Встроенный редактор Markdown с сохранением в базу знаний в один клик.',
},
shortcuts: {
title: 'Горячие клавиши',
desc: 'Настраиваемые сочетания для вопросов, панели и ускорения работы.',
},
},
scenariosTitle: 'Сценарии',
scenarios: {
research: 'Исследования',
learning: 'Учёба',
tech: 'Техдокументация',
work: 'Рабочие знания',
},
stepsTitle: 'Шаги настройки',
steps: {
api: {
title: 'Получите API-учётные данные',
desc: 'Скопируйте API Key и базовый URL в «Настройки → API-информация».',
},
port: {
title: 'Десктоп: фиксированный порт',
desc: 'В WeKnora Desktop задайте фиксированный порт API (например 37841) в API-информации.',
},
install: {
title: 'Установите расширение',
desc: 'Установите «Помощник по знаниям» из Chrome Web Store.',
},
connect: {
title: 'Подключите в расширении',
desc: 'В настройках расширения выберите режим enterprise/developer и введите API URL и API Key. Ниже — текущий URL сервиса.',
},
},
openApiSettings: 'Открыть API-информацию',
copy: 'Копировать',
copySuccess: 'URL API скопирован',
installCta: 'Chrome Web Store',
installCtaHint: 'Официальное расширение · откроется в новой вкладке',
storeMeta: 'Chrome Web Store · v1.0.0',
},
claw: {
title: 'WeKnora Skill',
subtitle:
'Импорт документов и гибридный поиск (вектор + ключевые слова) через REST API WeKnora — загрузки, URL, Markdown и поиск.',
capabilitiesTitle: 'Возможности Skill',
capabilities: {
upload: { title: 'Загрузка файлов', desc: 'PDF, Word, Excel и др. с автоматическим разбором.' },
url: { title: 'Импорт URL', desc: 'Загрузка веб-страниц по URL с отслеживанием parse_status.' },
manual: { title: 'Markdown', desc: 'Создание и правка записей в формате Markdown.' },
search: { title: 'Гибридный поиск', desc: 'hybrid-search по одной БЗ и knowledge-search по нескольким.' },
browse: { title: 'Просмотр знаний', desc: 'Списки БЗ и записей, детали и управление контентом.' },
},
stepsTitle: 'Шаги настройки',
steps: {
api: { title: 'API-учётные данные', desc: 'Скопируйте API Key и URL в «Настройки → API-информация».' },
env: {
title: 'Переменные окружения',
desc: 'Задайте WEKNORA_BASE_URL и WEKNORA_API_KEY в shell или ~/.zshrc / ~/.bashrc. Пример ниже использует текущий API URL — замените API Key на фактическое значение.',
},
install: {
title: 'Установка Skill',
desc: 'Выполните команду ниже в среде с OpenClaw CLI или следуйте инструкциям на ClawHub.',
},
verify: { title: 'Проверка', desc: 'Попросите агента вывести список БЗ или выполнить поиск.' },
},
openApiSettings: 'Открыть API-информацию',
copy: 'Копировать',
copyEnvSuccess: 'Пример переменных скопирован',
copyCmdSuccess: 'Команда установки скопирована',
ecosystemNote:
'Skill размещён на ClawHub ({\'@\'}lyingbug/weknora). Полная документация API — на странице ClawHub.',
installCta: 'Открыть ClawHub',
installCtaHint: 'Установка WeKnora Skill · откроется в новой вкладке',
hubMeta: 'ClawHub · {\'@\'}lyingbug/weknora · MIT-0',
},
},
imOverview: {
menuTitle: 'Подключённые IM',
pageTitle: 'Подключённые IM',
subtitle: 'Все IM-каналы агентов этого арендатора — переключение состояния или переход к владеющему агенту',
totalCount: 'Всего: {count}',
empty: 'В этом арендаторе пока не настроены IM-боты',
loadFailed: 'Не удалось загрузить список IM-ботов',
builtinAgent: 'Встроенный агент',
liveIndicator: 'IM-каналы работают',
detailsTitle: 'Детали IM-бота',
gotoAgentEditor: 'Открыть в редакторе агента',
outputMode: 'Режим вывода',
sessionMode: 'Режим сессии',
updatedAt: 'Обновлено',
channelId: 'ID канала',
columns: {
platform: 'Платформа',
name: 'Имя',
agent: 'Агент',
mode: 'Режим',
enabled: 'Включено',
botIdentity: 'Идентификатор бота',
createdAt: 'Создано',
},
},
credential: {
configured: 'Настроено',
unconfigured: 'Не настроено',
configure: 'Настроить',
update: 'Заменить',
remove: 'Удалить',
inputPlaceholder: 'Введите значение',
savedToast: 'Учётные данные сохранены',
saveFailed: 'Не удалось сохранить учётные данные',
removedToast: 'Учётные данные удалены',
removeFailed: 'Не удалось удалить учётные данные',
confirmRemovePrompt: 'Удалить учётные данные? Действие необратимо.',
confirmRemove: 'Подтвердить удаление',
confirmRemoveTitle: 'Удалить {field}?',
confirmRemoveBody:
'Сохранённые учётные данные будут безвозвратно удалены. Интеграции, использующие их, перестанут работать до настройки нового значения.',
},
userProfile: {
title: 'Информация о пользователе',
description: 'Просмотр базовых данных аккаунта (ID пользователя, имя, email, дата регистрации).',
},
tenantMember: {
title: 'Участники',
sectionDescription: 'Приглашайте коллег в тенант и управляйте их ролями. Добавлять и удалять участников может только Владелец.',
learnRbacGuide: 'Подробнее о RBAC',
totalCount: 'Участников: {n}',
listTitle: 'Участники пространства',
filterMatched: 'найдено: {n}',
loading: 'Загрузка участников…',
retry: 'Повторить',
empty: 'Участников пока нет. Пригласите коллегу, чтобы начать.',
emptySearch: 'Нет участников по запросу "{q}".',
searchPlaceholder: 'Поиск по имени или email',
permissions: {
title: 'Права ролей',
desc: 'Что может делать каждая роль внутри этого тенанта. Контролируется сервером; элементы UI лишь отражают правила.',
iconHint: 'Наведите курсор, чтобы открыть описание прав ролей',
manageMembers: 'Управление участниками',
manageTenantConfig: 'Изменение настроек тенанта',
manageInfra: 'Настройка моделей / векторных хранилищ / IM-каналов',
createOwnKB: 'Создание и редактирование своих БЗ и агентов',
readAll: 'Чтение содержимого тенанта',
},
columns: {
member: 'Имя и email',
username: 'Имя',
email: 'Email',
role: 'Роль',
joinedAt: 'Дата вступления',
operations: 'Действия',
},
role: {
owner: 'Владелец',
admin: 'Администратор',
contributor: 'Участник',
viewer: 'Наблюдатель',
},
add: {
button: 'Пригласить',
dialogTitle: 'Пригласить участника',
emailLabel: 'Email',
emailPlaceholder: "invitee{'@'}example.com",
roleLabel: 'Роль',
submit: 'Пригласить',
success: 'Участник добавлен',
},
remove: {
button: 'Удалить',
confirmTitle: 'Удалить участника?',
confirmBody: 'Вы уверены, что хотите удалить {name} из этого тенанта? Доступ будет отозван немедленно.',
confirm: 'Удалить',
success: 'Участник удалён',
},
leave: {
button: 'Покинуть тенант',
confirmTitle: 'Покинуть этот тенант?',
confirmBody: 'Вы потеряете доступ ко всем базам знаний и агентам в этом тенанте. Позже вас можно будет пригласить снова.',
confirm: 'Покинуть',
success: 'Вы покинули тенант',
},
roleChange: {
success: 'Роль обновлена',
},
errors: {
emailRequired: 'Укажите email',
emailFormat: 'Неверный формат email',
roleRequired: 'Выберите роль',
userNotFound: 'Пользователь с таким email не зарегистрирован. Попросите его зарегистрироваться.',
alreadyMember: 'Этот пользователь уже участник тенанта.',
lastOwner: 'Нельзя понизить, удалить или покинуть как последний Владелец. Сначала повысьте кого-то ещё до Владельца.',
notFound: 'Участник не найден.',
noTenant: 'Нет активного тенанта.',
invalidRole: 'Роль должна быть owner / admin / contributor / viewer.',
generic: 'Что-то пошло не так. Попробуйте ещё раз.',
},
tabs: {
members: 'Участники',
audit: 'Журнал аудита',
},
audit: {
tabLabel: 'Журнал аудита',
description:
'Регистрирует все изменения участников и отказы в доступе в этом тенанте, в обратном хронологическом порядке. Повторные отказы в течение минуты дедуплицируются.',
refresh: 'Обновить',
loadMore: 'Показать ещё',
end: 'Конец журнала.',
empty: 'Событий аудита пока нет.',
forbidden: 'Нет прав для просмотра журнала аудита.',
systemActor: 'Система',
requiredRole: 'Требуемая роль: {role}',
columns: {
time: 'Время',
actor: 'Инициатор',
action: 'Событие',
target: 'Цель',
path: 'Запрос',
outcome: 'Результат',
},
action: {
'rbac.member_added': 'Добавлен участник',
'rbac.member_removed': 'Удалён участник',
'rbac.member_role_changed': 'Изменение роли',
'rbac.member_left': 'Участник вышел',
'rbac.access_denied': 'Доступ запрещён',
},
outcome: {
success: 'Успех',
denied: 'Отказ',
},
expanded: {
actorId: 'ID инициатора',
targetUserId: 'ID целевого пользователя',
targetType: 'Тип цели',
targetId: 'ID цели',
details: 'Сырые детали',
},
},
},
}