from aiogram import Router, F from aiogram.fsm.context import FSMContext from aiogram.types import Message, CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup from aiogram.utils.keyboard import InlineKeyboardBuilder from logging import getLogger from sqlmodel.ext.asyncio.session import AsyncSession from ....main import QBotApp from ....model.language import LanguageBase from ....model.settings import Settings from ....model.user import UserBase from ..context import ContextData, CallbackCommand from ..navigation import route_callback from .settings import settings_menu from ..common import get_send_message logger = getLogger(__name__) router = Router() @router.callback_query(ContextData.filter(F.command == CallbackCommand.MENU_ENTRY_LANGUAGE)) async def menu_entry_language(message: CallbackQuery, **kwargs): stack = await save_navigation_context(callback_data = kwargs["callback_data"], state = kwargs["state"]) await language_menu(message, navigation_stack = stack, **kwargs) async def language_menu(message: Message | CallbackQuery, navigation_stack: list[ContextData], user: UserBase, **kwargs): send_message = get_send_message(message) inline_keyboard = [ [InlineKeyboardButton(text = locale.localized(user.lang), callback_data = ContextData(command = CallbackCommand.SET_LANGUAGE, data = str(locale)).pack())] for locale in LanguageBase.all_members.values()] context = pop_navigation_context(navigation_stack) if context: inline_keyboard.append([InlineKeyboardButton(text = (await Settings.get(Settings.APP_STRINGS_BACK_BTN)), callback_data = context.pack())]) await send_message(text = (await Settings.get(Settings.APP_STRINGS_LANGUAGE)), reply_markup = InlineKeyboardMarkup(inline_keyboard = inline_keyboard)) @router.callback_query(ContextData.filter(F.command == CallbackCommand.SET_LANGUAGE)) async def set_language(message: CallbackQuery, user: UserBase, callback_data: ContextData, db_session: AsyncSession, **kwargs): user.lang = callback_data.data await db_session.commit() await route_callback(message, callback_data = callback_data, user = user, db_session = db_session, **kwargs) from ..navigation import pop_navigation_context, save_navigation_context