fix(practice): guard lang variables; add furigana support for JA in prompts and UI; fix f-string JSON construction
This commit is contained in:
@@ -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"<b>{SCENARIOS[scenario].get(ui_lang, SCENARIOS[scenario]['ru'])}</b>\n\n"
|
||||
f"📝 <i>{conversation_start.get('context', '')}</i>\n\n"
|
||||
f"<b>AI:</b> {conversation_start.get('message', '')}\n\n"
|
||||
f"<b>AI:</b> {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"<b>AI:</b> {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"<b>AI:</b> {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'))
|
||||
|
||||
Reference in New Issue
Block a user