Проблема с локализацией бот-телеграмм на aiogram
Я создал меню в боте для разных языков. Все работает нормально, но для "support" не работает, точнее, перевод берется с "ru", а не "en", но при этом перевод для остального работает нормально, кроме поддержки. bot.py:
@router.callback_query(F.data.startswith("lang_"))
async def on_language_selected(callback: types.CallbackQuery):
language_code = callback.data.split("_")[1]
set_user_language(callback.from_user.id, language_code)
logging.debug(f"Language set to {language_code} for user {callback.from_user.id}")
user_language_code = get_user_language(callback.from_user.id) or "en"
user_language = localization.get(user_language_code, localization.get("en"))
menu_kb = types.InlineKeyboardMarkup(inline_keyboard=[
[types.InlineKeyboardButton(text=user_language["send_photo"], callback_data="send_photo")],
[types.InlineKeyboardButton(text=user_language["support"], url="https://t.me/support")], #The translation does not work here
[types.InlineKeyboardButton(text=user_language["profile"], callback_data="profile")],
[types.InlineKeyboardButton(text=user_language["send_photo_free"], callback_data="send_photo_free")]
])
await callback.message.answer(user_language["menu"], reply_markup=menu_kb)
# middlewares.py
from aiogram.types import Message
from localization import localization
from utils import get_user_language
class LanguageMiddleware:
async def __call__(self, handler, event, data):
user_id = event.from_user.id
user_language_code = get_user_language(user_id) or "en"
data["user_language"] = localization.get(user_language_code, localization.get("en"))
return await handler(event, data)
async def on_pre_process_callback_query(self, callback_query, data: dict):
user_id = callback_query.from_user.id
user_language_code = get_user_language(user_id)
if not user_language_code:
user_language_code = "en" # Значение по умолчанию
data["user_language_code"] = user_language_code
data["user_language"] = localization.get(user_language_code, localization.get("en"))
localization.py:
localization = {
"en": {
"menu": "Welcome! Here's the menu.",
"send_photo": "Send Photo",
"profile": "Your personal profile is under development.",
"support": "Support",
"send_photo_free": "Send a Free Photo.",
"used_free_photo": "You have already used your free photo.",
"requirements_for_free_photo": "You must subscribe to the following channels to use the free plan:",
"send_your_free_photo": "Now you can send a free photo",
"no_photo_found": "Please send a photo.",
"subscription_or_limit_error": "You must subscribe to all the necessary channels or you have already reached the limit of free photos.",
},
"ru": {
"menu": "Вы выбрали язык. Вот меню.",
"send_photo": "Отправить фото",
"profile": "Профиль",
"support": "Поддержка",
"send_photo_free": "Отправить бесплатное фото",
"used_free_photo": "Вы уже использовали своё бесплатное фото.",
"requirements_for_free_photo": "Вы должны подписаться на следующие каналы для использования бесплатного тарифа:",
"send_your_free_photo": "Теперь вы можете отправить бесплатную фотографию.",
"no_photo_found": "Пожалуйста, отправьте фотографию.",
"subscription_or_limit_error": "Вы должны подписаться на все необходимые каналы или уже достигли лимита бесплатных фото.",
},
}
Может быть, я что-то делаю не так?
Я написал код локализации, он работает, но эта локализация не применяется для "support".
Ответы (1 шт):
Автор решения: Imas
→ Ссылка
Попробуйте так ;)
from localization import localization
@router.callback_query(F.data.startswith("lang_"))
async def on_language_selected(callback: types.CallbackQuery):
language_code = callback.data.split("_")[1]
set_user_language(callback.from_user.id, language_code)
logging.debug(f"Language set to {language_code} for user {callback.from_user.id}")
user_language_code = get_user_language(callback.from_user.id) or "en"
user_language = localization.get(user_language_code, localization.get("en"))
if user_language_code == "en":
user_language["support"] = localization["en"]["support"]
else:
user_language["support"] = localization["ru"]["support"]
menu_kb = types.InlineKeyboardMarkup(inline_keyboard=[
[types.InlineKeyboardButton(text=user_language["send_photo"], callback_data="send_photo")],
[types.InlineKeyboardButton(text=user_language["support"], url="https://t.me/support")],
[types.InlineKeyboardButton(text=user_language["profile"], callback_data="profile")],
[types.InlineKeyboardButton(text=user_language["send_photo_free"], callback_data="send_photo_free")]
])
await callback.message.answer(user_language["menu"], reply_markup=menu_kb)