Backend: - OAuth service with pluggable provider architecture (Google + Authentik) - Generic authorize/callback endpoints for any provider - Authentik OIDC integration (configurable base URL) - hashed_password made nullable for OAuth-only users - Migration 009: nullable password column - /auth/switch endpoint returns full AuthResponse for account switching - OAuth-only users get clear error on password login attempt - UserResponse includes oauth_provider + avatar_url Frontend: - OAuth buttons on login form (Google + Authentik) - OAuth callback handler (/auth/callback route) - Multi-account auth store (accounts array, addAccount, switchTo, removeAccount) - Account switcher dropdown in header (hover to see other accounts) - "Add another account" option - English + Russian translations Config: - GOOGLE_CLIENT_ID/SECRET/REDIRECT_URI - AUTHENTIK_CLIENT_ID/SECRET/BASE_URL/REDIRECT_URI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
228 lines
10 KiB
JSON
228 lines
10 KiB
JSON
{
|
||
"auth": {
|
||
"login": "Войти",
|
||
"register": "Регистрация",
|
||
"email": "Email",
|
||
"password": "Пароль",
|
||
"confirmPassword": "Подтвердите пароль",
|
||
"username": "Имя пользователя",
|
||
"fullName": "Полное имя",
|
||
"rememberMe": "Запомнить меня",
|
||
"submit": "Отправить",
|
||
"noAccount": "Нет аккаунта?",
|
||
"hasAccount": "Уже есть аккаунт?",
|
||
"loginTitle": "С возвращением",
|
||
"loginSubtitle": "Войдите в свой аккаунт",
|
||
"registerTitle": "Создать аккаунт",
|
||
"registerSubtitle": "Начните работу с персональным ИИ-ассистентом",
|
||
"errors": {
|
||
"invalidCredentials": "Неверный email или пароль",
|
||
"emailExists": "Пользователь с таким email или именем уже существует",
|
||
"passwordMismatch": "Пароли не совпадают",
|
||
"passwordMinLength": "Пароль должен содержать минимум 8 символов",
|
||
"usernameFormat": "Имя пользователя: 3-50 символов (буквы, цифры, _ или -)",
|
||
"required": "Это поле обязательно"
|
||
},
|
||
"orDivider": "или войти через",
|
||
"oauthGoogle": "Войти через Google",
|
||
"oauthAuthentik": "Войти через Authentik",
|
||
"addAccount": "Добавить аккаунт",
|
||
"switchAccount": "Сменить аккаунт"
|
||
},
|
||
"layout": {
|
||
"dashboard": "Главная",
|
||
"chats": "Чаты",
|
||
"documents": "Документы",
|
||
"memory": "Память",
|
||
"notifications": "Уведомления",
|
||
"profile": "Профиль",
|
||
"logout": "Выйти",
|
||
"settings": "Настройки",
|
||
"admin": "Администрирование",
|
||
"users": "Пользователи",
|
||
"context": "Контекст",
|
||
"skills": "Навыки",
|
||
"personal_context": "Мой контекст",
|
||
"pdf": "PDF отчёты",
|
||
"pdf_templates": "Шаблоны",
|
||
"usage": "Использование"
|
||
},
|
||
"dashboard": {
|
||
"welcome": "Добро пожаловать, {{name}}",
|
||
"subtitle": "Ваш персональный ИИ-ассистент"
|
||
},
|
||
"chat": {
|
||
"new_chat": "Новый чат",
|
||
"no_chats": "Пока нет чатов. Создайте первый.",
|
||
"no_messages": "Начните разговор...",
|
||
"select_chat": "Выберите чат для начала общения",
|
||
"type_message": "Введите сообщение...",
|
||
"send": "Отправить",
|
||
"archive": "Архивировать",
|
||
"unarchive": "Разархивировать",
|
||
"delete_confirm": "Вы уверены, что хотите удалить этот чат?",
|
||
"limit_reached": "Достигнут лимит чатов",
|
||
"streaming": "ИИ думает...",
|
||
"quota_messages": "{{used}}/{{limit}} сообщений",
|
||
"quota_tokens": "{{used}}K/{{limit}}K токенов"
|
||
},
|
||
"admin": {
|
||
"context_editor": "Редактор основного контекста",
|
||
"context_placeholder": "Введите системный промпт для ИИ-ассистента...",
|
||
"save": "Сохранить",
|
||
"saved": "Сохранено",
|
||
"unsaved_changes": "Несохранённые изменения",
|
||
"version": "Версия",
|
||
"characters": "символов"
|
||
},
|
||
"skills": {
|
||
"my_skills": "Мои навыки",
|
||
"general_skills": "Общие навыки",
|
||
"no_skills": "Навыков пока нет.",
|
||
"no_personal_skills": "Вы ещё не создали персональных навыков.",
|
||
"create_personal": "Создать персональный навык",
|
||
"edit_personal": "Редактировать навык",
|
||
"create_general": "Создать общий навык",
|
||
"edit_general": "Редактировать общий навык",
|
||
"name": "Название",
|
||
"name_placeholder": "напр. Кардиолог",
|
||
"description": "Описание",
|
||
"description_placeholder": "Краткое описание специалиста",
|
||
"system_prompt": "Системный промпт",
|
||
"prompt_placeholder": "Инструкции для ИИ при использовании этого навыка...",
|
||
"icon": "Иконка",
|
||
"no_skill": "Без специалиста",
|
||
"general": "Общие",
|
||
"personal": "Персональные"
|
||
},
|
||
"personal_context": {
|
||
"title": "Персональный контекст",
|
||
"subtitle": "Этот контекст добавляется ко всем вашим разговорам с ИИ",
|
||
"placeholder": "Добавьте личную информацию, которую ИИ должен знать о вас..."
|
||
},
|
||
"notifications": {
|
||
"title": "Уведомления",
|
||
"no_notifications": "Уведомлений пока нет.",
|
||
"mark_all_read": "Отметить все как прочитанные",
|
||
"mark_read": "Отметить как прочитанное",
|
||
"view_all": "Все уведомления",
|
||
"types": {
|
||
"reminder": "Напоминание",
|
||
"alert": "Оповещение",
|
||
"info": "Информация",
|
||
"ai_generated": "От ИИ"
|
||
}
|
||
},
|
||
"documents": {
|
||
"upload": "Загрузить",
|
||
"drop_or_click": "Перетащите файл или нажмите для выбора",
|
||
"doc_type": "Тип документа",
|
||
"no_documents": "Документы ещё не загружены.",
|
||
"download": "Скачать",
|
||
"reindex": "Извлечь текст заново",
|
||
"extracted_text": "Извлечённый текст",
|
||
"search_placeholder": "Поиск по документам...",
|
||
"clear_search": "Очистить",
|
||
"types": {
|
||
"other": "Другое",
|
||
"report": "Отчёт",
|
||
"contract": "Договор",
|
||
"receipt": "Квитанция",
|
||
"certificate": "Сертификат"
|
||
},
|
||
"status": {
|
||
"pending": "Ожидание",
|
||
"processing": "Обработка",
|
||
"completed": "Готово",
|
||
"failed": "Ошибка"
|
||
}
|
||
},
|
||
"memory": {
|
||
"create": "Добавить запись",
|
||
"edit": "Редактировать запись",
|
||
"no_entries": "Записей пока нет. ИИ будет сохранять важную информацию здесь.",
|
||
"category": "Категория",
|
||
"importance": "Важность",
|
||
"title_field": "Заголовок",
|
||
"title_placeholder": "напр. Диабет 2 типа",
|
||
"content_field": "Содержание",
|
||
"content_placeholder": "Подробная информация...",
|
||
"categories": {
|
||
"health": "Здоровье",
|
||
"finance": "Финансы",
|
||
"personal": "Личное",
|
||
"work": "Работа",
|
||
"document_summary": "Сводка документа",
|
||
"other": "Другое"
|
||
},
|
||
"importance_levels": {
|
||
"critical": "Критическая",
|
||
"high": "Высокая",
|
||
"medium": "Средняя",
|
||
"low": "Низкая"
|
||
}
|
||
},
|
||
"pdf": {
|
||
"title": "PDF отчёты",
|
||
"generate": "Сгенерировать PDF",
|
||
"title_placeholder": "Название отчёта...",
|
||
"no_pdfs": "PDF отчёты ещё не создавались.",
|
||
"template": "Шаблон",
|
||
"default_template": "Шаблон по умолчанию"
|
||
},
|
||
"pdf_templates": {
|
||
"title": "Шаблоны PDF",
|
||
"create": "Создать шаблон",
|
||
"edit": "Редактировать шаблон",
|
||
"no_templates": "Шаблонов пока нет.",
|
||
"default": "По умолчанию",
|
||
"inactive": "Неактивен",
|
||
"name": "Название",
|
||
"locale": "Язык",
|
||
"description": "Описание",
|
||
"html_content": "HTML шаблон",
|
||
"preview": "Предпросмотр",
|
||
"variables_ref": "Справка по переменным шаблона",
|
||
"var_title": "Заголовок отчёта",
|
||
"var_user_name": "Полное имя пользователя",
|
||
"var_generated_at": "Дата и время генерации",
|
||
"var_memories": "Список записей памяти (category, title, content, importance)",
|
||
"var_documents": "Список документов (original_filename, doc_type, excerpt)",
|
||
"var_ai_summary": "Резюме от ИИ (необязательно)"
|
||
},
|
||
"admin_users": {
|
||
"title": "Управление пользователями",
|
||
"create": "Создать пользователя",
|
||
"edit": "Редактировать пользователя",
|
||
"max_chats": "Макс. чатов",
|
||
"deactivate": "Деактивировать",
|
||
"activate": "Активировать"
|
||
},
|
||
"admin_settings": {
|
||
"title": "Настройки приложения",
|
||
"self_registration": "Самостоятельная регистрация",
|
||
"self_registration_desc": "Разрешить пользователям самим создавать аккаунты",
|
||
"default_max_chats": "Лимит чатов по умолчанию",
|
||
"default_max_chats_desc": "Лимит чатов для новых пользователей"
|
||
},
|
||
"admin_usage": {
|
||
"title": "Статистика использования",
|
||
"user": "Пользователь",
|
||
"messages": "Сообщения сегодня",
|
||
"tokens": "Токены сегодня",
|
||
"no_data": "Данных пока нет."
|
||
},
|
||
"common": {
|
||
"loading": "Загрузка...",
|
||
"error": "Произошла ошибка",
|
||
"notFound": "Страница не найдена",
|
||
"goHome": "На главную",
|
||
"save": "Сохранить",
|
||
"cancel": "Отмена",
|
||
"delete": "Удалить",
|
||
"edit": "Редактировать",
|
||
"create": "Создать",
|
||
"search": "Поиск"
|
||
}
|
||
}
|