feat: add translation language setting & onboarding flow

- Add separate translation_language setting (independent from interface language)
- Implement 3-step onboarding for new users:
  1. Choose interface language
  2. Choose learning language
  3. Choose translation language
- Fix localization issues when using callback.message (user_id from state)
- Add UserService.get_user_by_id() method
- Add get_user_translation_lang() helper in i18n
- Update all handlers to use correct translation language
- Add localization keys for onboarding (ru/en/ja)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-07 16:35:08 +03:00
parent d937b37a3b
commit 3e5c1be464
14 changed files with 360 additions and 81 deletions

View File

@@ -9,7 +9,7 @@ from database.models import WordSource
from services.user_service import UserService
from services.vocabulary_service import VocabularyService
from services.ai_service import ai_service
from utils.i18n import t, get_user_lang
from utils.i18n import t, get_user_lang, get_user_translation_lang
router = Router()
@@ -73,9 +73,9 @@ async def process_word_addition(message: Message, state: FSMContext, word: str):
async with async_session_maker() as session:
user = await UserService.get_user_by_telegram_id(session, message.from_user.id)
source_lang = user.learning_language if user else 'en'
ui_lang = user.language_interface if user else 'ru'
translation_lang = get_user_translation_lang(user)
word_data = await ai_service.translate_word_with_contexts(
word, source_lang=source_lang, translation_lang=ui_lang, max_translations=3
word, source_lang=source_lang, translation_lang=translation_lang, max_translations=3
)
# Удаляем сообщение о загрузке
@@ -141,7 +141,8 @@ async def confirm_add_word(callback: CallbackQuery, state: FSMContext):
# Получаем пользователя для языков
user = await UserService.get_user_by_telegram_id(session, callback.from_user.id)
source_lang = user.learning_language if user else 'en'
ui_lang = user.language_interface if user else 'ru'
translation_lang = get_user_translation_lang(user)
ui_lang = get_user_lang(user)
# Добавляем слово в базу
new_word = await VocabularyService.add_word(
@@ -150,7 +151,7 @@ async def confirm_add_word(callback: CallbackQuery, state: FSMContext):
word_original=word_data["word"],
word_translation=word_data["translation"],
source_lang=source_lang,
translation_lang=ui_lang,
translation_lang=translation_lang,
transcription=word_data.get("transcription"),
category=word_data.get("category"),
difficulty_level=word_data.get("difficulty"),
@@ -168,7 +169,7 @@ async def confirm_add_word(callback: CallbackQuery, state: FSMContext):
# Получаем общее количество слов
words_count = await VocabularyService.get_words_count(session, user_id, learning_lang=user.learning_language)
lang = ui_lang or 'ru'
lang = ui_lang
await callback.message.edit_text(
t(lang, 'add.added_success', word=word_data['word'], count=words_count)