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:
2025-12-05 14:30:24 +03:00
parent 8bf3504d8d
commit 99deaafcbf
17 changed files with 983 additions and 308 deletions

View File

@@ -10,6 +10,7 @@ from services.user_service import UserService
from services.vocabulary_service import VocabularyService
from services.ai_service import ai_service
from utils.i18n import t
from utils.levels import get_user_level_for_language
router = Router()
@@ -50,9 +51,10 @@ async def cmd_words(message: Message, state: FSMContext):
generating_msg = await message.answer(t(lang, 'words.generating', theme=theme))
# Генерируем слова через AI
current_level = get_user_level_for_language(user)
words = await ai_service.generate_thematic_words(
theme=theme,
level=user.level.value,
level=current_level,
count=10,
learning_lang=user.learning_language,
translation_lang=user.language_interface,
@@ -69,7 +71,7 @@ async def cmd_words(message: Message, state: FSMContext):
theme=theme,
words=words,
user_id=user.id,
level=user.level.name
level=current_level
)
await state.set_state(WordsStates.viewing_words)