diff --git a/bot/handlers/practice.py b/bot/handlers/practice.py index 8c020ce..537a14f 100644 --- a/bot/handlers/practice.py +++ b/bot/handlers/practice.py @@ -98,10 +98,16 @@ async def start_scenario(callback: CallbackQuery, state: FSMContext): await state.set_state(PracticeStates.in_conversation) # Формируем сообщение (перевод скрыт, доступен по кнопке) + ai_msg = conversation_start.get('message', '') + if learn_lang.lower() == 'ja': + fg = conversation_start.get('furigana') + if fg: + ai_msg = f"{ai_msg} ({fg})" + text = ( f"{SCENARIOS[scenario].get(ui_lang, SCENARIOS[scenario]['ru'])}\n\n" f"📝 {conversation_start.get('context', '')}\n\n" - f"AI: {conversation_start.get('message', '')}\n\n" + f"AI: {ai_msg}\n\n" f"{t(ui_lang, 'practice.hints')}\n" ) @@ -181,8 +187,14 @@ async def handle_conversation(message: Message, state: FSMContext): level = data.get('level', 'B1') message_count = data.get('message_count', 0) + # Определяем языки пользователя для ответа (до показа индикатора) + async with async_session_maker() as session: + user2 = await UserService.get_user_by_telegram_id(session, message.from_user.id) + ui_lang2 = (user2.language_interface if user2 else 'ru') or 'ru' + learn_lang2 = (user2.learning_language if user2 else 'en') or 'en' + # Показываем индикатор - thinking_msg = await message.answer(t((user2.language_interface if user2 else 'ru') or 'ru', 'practice.thinking')) + thinking_msg = await message.answer(t(ui_lang2, 'practice.thinking')) # Добавляем сообщение пользователя в историю conversation_history.append({ @@ -190,12 +202,6 @@ async def handle_conversation(message: Message, state: FSMContext): "content": user_message }) - # Определяем языки пользователя для ответа - async with async_session_maker() as session: - user2 = await UserService.get_user_by_telegram_id(session, message.from_user.id) - ui_lang2 = (user2.language_interface if user2 else 'ru') or 'ru' - learn_lang2 = (user2.learning_language if user2 else 'en') or 'en' - # Получаем ответ от AI ai_response = await ai_service.continue_conversation( conversation_history=conversation_history, @@ -233,10 +239,13 @@ async def handle_conversation(message: Message, state: FSMContext): if feedback.get('comment'): text += f"💬 {feedback['comment']}\n\n" - # Ответ AI - text += ( - f"AI: {ai_response.get('response', '')}\n\n" - ) + # Ответ AI (с фуриганой для японского) + resp = ai_response.get('response', '') + if learn_lang2.lower() == 'ja': + fg = ai_response.get('furigana') + if fg: + resp = f"{resp} ({fg})" + text += f"AI: {resp}\n\n" # Подсказки suggestions = ai_response.get('suggestions', []) @@ -253,8 +262,8 @@ async def handle_conversation(message: Message, state: FSMContext): # Кнопки keyboard = InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text=t(lang2, 'practice.show_translation_btn'), callback_data=f"show_tr_{this_idx}")], - [InlineKeyboardButton(text=t(lang2, 'practice.stop_btn'), callback_data="stop_practice")] + [InlineKeyboardButton(text=t(ui_lang2, 'practice.show_translation_btn'), callback_data=f"show_tr_{this_idx}")], + [InlineKeyboardButton(text=t(ui_lang2, 'practice.stop_btn'), callback_data="stop_practice")] ]) await message.answer(text, reply_markup=keyboard) @@ -263,25 +272,26 @@ async def handle_conversation(message: Message, state: FSMContext): @router.callback_query(F.data.startswith("show_tr_"), PracticeStates.in_conversation) async def show_translation(callback: CallbackQuery, state: FSMContext): """Показать перевод для конкретного сообщения AI""" + # Определяем язык интерфейса пользователя + async with async_session_maker() as session: + user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) + lang = (user.language_interface if user else 'ru') or 'ru' try: idx = int(callback.data.split("_")[-1]) except Exception: - await callback.answer(t((user.language_interface if user else 'ru') or 'ru', 'practice.translation_unavailable'), show_alert=True) + await callback.answer(t(lang, 'practice.translation_unavailable'), show_alert=True) return data = await state.get_data() translations = data.get('translations', {}) or {} tr_text = translations.get(idx) if not tr_text: - await callback.answer(t((user.language_interface if user else 'ru') or 'ru', 'practice.translation_unavailable'), show_alert=True) + await callback.answer(t(lang, 'practice.translation_unavailable'), show_alert=True) return # Вставляем перевод в существующее сообщение orig = callback.message.text or "" - # Определяем язык - async with async_session_maker() as session: - user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) - lang = (user.language_interface if user else 'ru') or 'ru' + # Определяем язык (уже вычислен выше) marker = t(lang, 'common.translation') + ":" if marker in orig: await callback.answer(t(lang, 'practice.translation_already')) diff --git a/services/ai_service.py b/services/ai_service.py index 77170c0..70dc6d8 100644 --- a/services/ai_service.py +++ b/services/ai_service.py @@ -340,6 +340,10 @@ class AIService: scenario_desc = scenarios.get(scenario, "повседневный разговор") + extra_fields = '' + if learning_lang.lower() == 'ja': + extra_fields = ",\n \"furigana\": \"фуригана (кана над/после иероглифов для поля message)\"" + prompt = f"""Ты - собеседник для практики языка {learning_lang} уровня {level}. Начни диалог в сценарии: {scenario_desc} на {learning_lang}. @@ -348,7 +352,7 @@ class AIService: "message": "твоя первая реплика на {learning_lang}", "translation": "перевод на {translation_lang}", "context": "краткое описание ситуации на {translation_lang}", - "suggestions": ["подсказка 1", "подсказка 2", "подсказка 3"] + "suggestions": ["подсказка 1", "подсказка 2", "подсказка 3"]{extra_fields} }} Требования: @@ -408,6 +412,10 @@ class AIService: for msg in conversation_history[-6:] # Последние 6 сообщений ]) + extra_fields_resp = '' + if learning_lang.lower() == 'ja': + extra_fields_resp = ",\n \"furigana\": \"фуригана (кана над/после иероглифов для поля response)\"" + prompt = f"""Ты ведешь диалог на языке {learning_lang} уровня {level} в сценарии "{scenario}". История диалога: @@ -423,7 +431,7 @@ User: {user_message} "corrections": "исправления ошибок пользователя (если есть)", "comment": "краткий комментарий об ответе пользователя" }}, - "suggestions": ["подсказка 1 для следующего ответа", "подсказка 2"] + "suggestions": ["подсказка 1 для следующего ответа", "подсказка 2"]{extra_fields_resp} }} Требования: