Сравнить текст сообщения с результатом функции gettext в хендлере Aiogram
В коде Aiogram-бота у меня есть несколько хэндлеров, которые сверяют текст пользователя с текстом кнопок, переведенным модулем gettext
:
@router.message(F.text == gettext("Settings"))
async def view_settings(message: Message):
...
В начале кода для функции gettext
я установил значение по умолчанию:
import gettext as gt
gettext = gt.translation("ru", "translations", languages=["ru"]).gettext
что возвращает функцию gettext
для перевода текста кнопок на русский.
Все хэндлеры работают нормально, пока пользователь не выставляет свой язык на какой-то другой, например, английский или испанский:
gettext = gt.translation("en", "translations", languages=["en"]).gettext
Язык пользователя теперь не русский, но хэндлеры всё ещё сравнивают текст пользователя с текстом кнопок, переведённым на первый язык, указанный по дефолту — на русский.
Есть ли какой-то способ повторно вызывать функцию gettext
в хэндлерах каждый раз, когда Dispatcher
Aiogram'а решает, какую функцию-хэндлер вызвать? Сразу скажу, не предлагайте переходить на inline-кнопки.
P.S. Я был бы рад использовать один хэндлер @router.message(F.text)
, где я бы поочерёдно проверял текст через if-else, но из-за того, что я в аргументах хэндлера использую машину состояний (FSM), этот вариант мне не подойдёт.
Полный код с проблемой (некоторые незначительные куски кода были вырезаны для большей читаемости):
import gettext as gt
from aiogram import F, Router
from aiogram.types import Message
from aiogram.utils.keyboard import ReplyKeyboardBuilder
gettext = gt.translation("ru", "translations", languages=["ru"]).gettext
router = Router()
@router.message(F.text == "English")
async def change_to_english_language(message: Message):
global gettext
gettext = gt.translation("en", "translations", languages=["en"]).gettext
await message.answer(gettext("Now your language is English"))
@router.message(F.text == gettext("Settings"))
async def view_settings(message: Message):
builder = ReplyKeyboardBuilder()
builder.button(text=gettext("Language"))
builder.button(text=gettext("Preferred name"))
await message.answer(gettext("What do you want to set up?"),
reply_markup=builder.as_markup(resize_keyboard=True))
Ответы (1 шт):
Я всё-таки решил свою проблему, есть способ использовать lambda-функции:
@router.message(F.text, F.func(lambda msg: msg.text == gettext("Settings")))
async def view_settings(message: Message):
builder = ReplyKeyboardBuilder()
builder.button(text=gettext("Language"))
builder.button(text=gettext("Preferred name"))
await message.answer(gettext("What do you want to set up?"),
reply_markup=builder.as_markup(resize_keyboard=True))