在 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 决定调用哪个处理程序函数时,是否有某种方法可以重新调用处理程序中的函数?我马上说,不建议切换到内联按钮。
PS 我很乐意使用一个 handler @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))