feat: JLPT levels for Japanese, custom practice scenarios, UI improvements
- Add separate level systems: CEFR (A1-C2) for European languages, JLPT (N5-N1) for Japanese - Store levels per language in new `levels_by_language` JSON field - Add custom scenario option in AI practice mode - Show action buttons after practice ends (new dialogue, tasks, words) - Fix level display across all handlers to use correct level system - Add Alembic migration for levels_by_language field - Update all locale files (ru, en, ja) with new keys 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@ class Base(DeclarativeBase):
|
||||
|
||||
|
||||
class LanguageLevel(str, enum.Enum):
|
||||
"""Уровни владения языком"""
|
||||
"""Уровни владения языком (CEFR)"""
|
||||
A1 = "A1"
|
||||
A2 = "A2"
|
||||
B1 = "B1"
|
||||
@@ -21,6 +21,23 @@ class LanguageLevel(str, enum.Enum):
|
||||
C2 = "C2"
|
||||
|
||||
|
||||
class JLPTLevel(str, enum.Enum):
|
||||
"""Уровни JLPT для японского языка"""
|
||||
N5 = "N5" # Базовый
|
||||
N4 = "N4" # Начальный
|
||||
N3 = "N3" # Средний
|
||||
N2 = "N2" # Продвинутый
|
||||
N1 = "N1" # Свободный
|
||||
|
||||
|
||||
# Языки, использующие JLPT вместо CEFR
|
||||
JLPT_LANGUAGES = {"ja"}
|
||||
|
||||
# Дефолтные уровни для разных систем
|
||||
DEFAULT_CEFR_LEVEL = "A1"
|
||||
DEFAULT_JLPT_LEVEL = "N5"
|
||||
|
||||
|
||||
class WordSource(str, enum.Enum):
|
||||
"""Источник добавления слова"""
|
||||
MANUAL = "manual" # Ручное добавление
|
||||
@@ -40,6 +57,7 @@ class User(Base):
|
||||
language_interface: Mapped[str] = mapped_column(String(2), default="ru") # ru/en
|
||||
learning_language: Mapped[str] = mapped_column(String(2), default="en") # en
|
||||
level: Mapped[LanguageLevel] = mapped_column(SQLEnum(LanguageLevel), default=LanguageLevel.A1)
|
||||
levels_by_language: Mapped[Optional[dict]] = mapped_column(JSON, default=None) # {"en": "B1", "ja": "N4"}
|
||||
timezone: Mapped[str] = mapped_column(String(50), default="UTC")
|
||||
daily_task_time: Mapped[Optional[str]] = mapped_column(String(5)) # HH:MM
|
||||
reminders_enabled: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
|
||||
Reference in New Issue
Block a user