Files
personal-ai-assistant/frontend/public/locales/ru/translation.json
dolgolyov.alexei 5c651b7988 Phase 9: OAuth & Account Switching — Google + Authentik, multi-account
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>
2026-03-19 15:56:20 +03:00

228 lines
10 KiB
JSON
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.
{
"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": "Поиск"
}
}