From 77d65b9d7372a34d3d2ffbf52786bf99b2bacf54 Mon Sep 17 00:00:00 2001 From: geekiot Date: Sat, 8 Nov 2025 18:56:31 +0500 Subject: [PATCH] Add [localization]: add menu to choose language --- .../handlers/unverified/callbacks/language.py | 58 +++++++++++++++++++ src/bot/utils/keyboards/__init__.py | 25 +++++++- src/bot/utils/registry/__init__.py | 2 +- 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/bot/handlers/unverified/callbacks/language.py diff --git a/src/bot/handlers/unverified/callbacks/language.py b/src/bot/handlers/unverified/callbacks/language.py new file mode 100644 index 0000000..8f2d2f4 --- /dev/null +++ b/src/bot/handlers/unverified/callbacks/language.py @@ -0,0 +1,58 @@ +from aiogram import F +from aiogram.types import CallbackQuery, Message +from aiogram.utils.i18n import gettext as _ +from sqlalchemy.ext.asyncio import AsyncSession + +from bot.handlers import unverified_registry +from bot.utils.keyboards import get_language_choose_markup +from bot.utils.types import ChatType +from database import TelegramUser + + +@unverified_registry.register( + triggers="choose_language", + description="Choose language callback menu", + chat_types=ChatType.PRIVATE, + is_callback=True, +) +async def call_choose_language( + call: CallbackQuery, +) -> None: + if not isinstance(call.message, Message): + return + + await call.message.edit_text( + text=_("unverified choose language menu"), + reply_markup=get_language_choose_markup(), + ) + + +@unverified_registry.register( + filters=F.data.startswith("choose_language_"), # pyrefly: ignore + description="Choose language callback menu", + chat_types=ChatType.PRIVATE, + is_callback=True, +) +async def call_choosed_language( + call: CallbackQuery, + telegram_user: TelegramUser, + session: AsyncSession, +) -> None: + if not isinstance(call.message, Message) or call.data is None: + return + + code = call.data.split("_")[-1] + + telegram_user.lang = code + + await session.commit() + + await call.message.edit_text( + text=_( + "unverified choose language successfully template", + locale=code, + ).format( + code, + ), + reply_markup=None, + ) diff --git a/src/bot/utils/keyboards/__init__.py b/src/bot/utils/keyboards/__init__.py index d1df109..ee2b341 100644 --- a/src/bot/utils/keyboards/__init__.py +++ b/src/bot/utils/keyboards/__init__.py @@ -1,5 +1,6 @@ __all__ = [ "get_start_verification_markup", + "get_language_choose_markup", "get_verification_role_markup", "get_verification_finish_markup", "get_menu_markup", @@ -23,8 +24,30 @@ def get_start_verification_markup() -> InlineKeyboardMarkup: InlineKeyboardButton( text=_("start verification button"), callback_data="verification_start", - ) + ), + InlineKeyboardButton( + text=_("choose language button"), + callback_data="choose_language", + ), ) + builder.adjust(1) + return builder.as_markup() + + +def get_language_choose_markup() -> InlineKeyboardMarkup: + builder = InlineKeyboardBuilder() + + builder.add( + InlineKeyboardButton( + text="en", callback_data="choose_language_en" + ), + InlineKeyboardButton( + text="ru", callback_data="choose_language_ru" + ), + ) + + builder.adjust(2) + return builder.as_markup() diff --git a/src/bot/utils/registry/__init__.py b/src/bot/utils/registry/__init__.py index fd2bef3..159ed4e 100644 --- a/src/bot/utils/registry/__init__.py +++ b/src/bot/utils/registry/__init__.py @@ -103,7 +103,7 @@ class RouterRegistry: if isinstance(chat_types, ChatType): chat_types = [chat_types] - if isinstance(filters, (Filter, State)): + if isinstance(filters, (Filter, State, MagicFilter)): filters = [filters] elif filters is None: filters = list()