78 lines
2.9 KiB
Python
78 lines
2.9 KiB
Python
from aiogram import Router, F
|
|
from aiogram.types import Message, CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup
|
|
from aiogram.fsm.context import FSMContext
|
|
from aiogram.utils.i18n import I18n
|
|
from logging import getLogger
|
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
|
|
|
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 ..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):
|
|
|
|
callback_data: ContextData = kwargs["callback_data"]
|
|
state: FSMContext = kwargs["state"]
|
|
state_data = await state.get_data()
|
|
kwargs["state_data"] = state_data
|
|
|
|
stack = save_navigation_context(callback_data = callback_data, state_data = state_data)
|
|
|
|
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())])
|
|
|
|
state: FSMContext = kwargs["state"]
|
|
state_data = kwargs["state_data"]
|
|
await state.set_data(state_data)
|
|
|
|
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, **kwargs):
|
|
|
|
user: UserBase = kwargs["user"]
|
|
callback_data: ContextData = kwargs["callback_data"]
|
|
db_session: AsyncSession = kwargs["db_session"]
|
|
state: FSMContext = kwargs["state"]
|
|
|
|
state_data = await state.get_data()
|
|
kwargs["state_data"] = state_data
|
|
|
|
user.lang = LanguageBase(callback_data.data)
|
|
await db_session.commit()
|
|
|
|
i18n: I18n = kwargs["i18n"]
|
|
with i18n.use_locale(user.lang):
|
|
await route_callback(message, **kwargs)
|
|
|
|
|
|
from ..navigation import pop_navigation_context, save_navigation_context |