Backend: - Notification model + Alembic migration - Notification service: CRUD, mark read, unread count, pending scheduled - WebSocket manager singleton for real-time push - WebSocket endpoint /ws/notifications with JWT auth via query param - APScheduler integration: periodic notification sender (every 60s), daily proactive health review job (8 AM) - AI tool: schedule_notification (immediate or scheduled) - Health review worker: analyzes user memory via Claude, creates ai_generated notifications with WebSocket push Frontend: - Notification API client + Zustand store - WebSocket hook with auto-reconnect (exponential backoff) - Notification bell in header with unread count badge + dropdown - Notifications page with type badges, mark read, mark all read - WebSocket initialized in AppLayout for app-wide real-time updates - Enabled notifications nav in sidebar - English + Russian translations Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
168 lines
7.2 KiB
JSON
168 lines
7.2 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": "Это поле обязательно"
|
||
}
|
||
},
|
||
"layout": {
|
||
"dashboard": "Главная",
|
||
"chats": "Чаты",
|
||
"documents": "Документы",
|
||
"memory": "Память",
|
||
"notifications": "Уведомления",
|
||
"profile": "Профиль",
|
||
"logout": "Выйти",
|
||
"settings": "Настройки",
|
||
"admin": "Администрирование",
|
||
"users": "Пользователи",
|
||
"context": "Контекст",
|
||
"skills": "Навыки",
|
||
"personal_context": "Мой контекст"
|
||
},
|
||
"dashboard": {
|
||
"welcome": "Добро пожаловать, {{name}}",
|
||
"subtitle": "Ваш персональный ИИ-ассистент по здоровью"
|
||
},
|
||
"chat": {
|
||
"new_chat": "Новый чат",
|
||
"no_chats": "Пока нет чатов. Создайте первый.",
|
||
"no_messages": "Начните разговор...",
|
||
"select_chat": "Выберите чат для начала общения",
|
||
"type_message": "Введите сообщение...",
|
||
"send": "Отправить",
|
||
"archive": "Архивировать",
|
||
"unarchive": "Разархивировать",
|
||
"delete_confirm": "Вы уверены, что хотите удалить этот чат?",
|
||
"limit_reached": "Достигнут лимит чатов",
|
||
"streaming": "ИИ думает..."
|
||
},
|
||
"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": "Другое",
|
||
"lab_result": "Анализы",
|
||
"consultation": "Консультация",
|
||
"prescription": "Рецепт",
|
||
"imaging": "Снимки"
|
||
},
|
||
"status": {
|
||
"pending": "Ожидание",
|
||
"processing": "Обработка",
|
||
"completed": "Готово",
|
||
"failed": "Ошибка"
|
||
}
|
||
},
|
||
"memory": {
|
||
"create": "Добавить запись",
|
||
"edit": "Редактировать запись",
|
||
"no_entries": "Записей пока нет. ИИ будет сохранять важную информацию о здоровье здесь.",
|
||
"category": "Категория",
|
||
"importance": "Важность",
|
||
"title_field": "Заголовок",
|
||
"title_placeholder": "напр. Диабет 2 типа",
|
||
"content_field": "Содержание",
|
||
"content_placeholder": "Подробная информация...",
|
||
"categories": {
|
||
"condition": "Заболевание",
|
||
"medication": "Лекарство",
|
||
"allergy": "Аллергия",
|
||
"vital": "Показатели",
|
||
"document_summary": "Сводка документа",
|
||
"other": "Другое"
|
||
},
|
||
"importance_levels": {
|
||
"critical": "Критическая",
|
||
"high": "Высокая",
|
||
"medium": "Средняя",
|
||
"low": "Низкая"
|
||
}
|
||
},
|
||
"common": {
|
||
"loading": "Загрузка...",
|
||
"error": "Произошла ошибка",
|
||
"notFound": "Страница не найдена",
|
||
"goHome": "На главную",
|
||
"save": "Сохранить",
|
||
"cancel": "Отмена",
|
||
"delete": "Удалить",
|
||
"edit": "Редактировать",
|
||
"create": "Создать",
|
||
"search": "Поиск"
|
||
}
|
||
}
|