Как передать переменную чтобы выводилось имя, а не сам текст Telegram Bot Aiogram
Есть телеграм бот. Я начал его переводить на три языка и создал новый файл со списком сообщений. Сообщение будто-бы выводится без f-строки. Как сделать чтобы выводилось нормально:
- ? Hello Ivan Ivanov. ? Welcome to our bot ?
А не как с переменной:
- ? Hello {message.from_user.first_name} {message.from_user.last_name}. ? Welcome to our bot ?
Если дописать f к строке в списке сообщений:
'hello_with_all_name_en': f'? Hello <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Welcome to our bot ?'
То выводится ошибка:NameError: name 'message' is not defined, так что, думаю это не вариант
Вот строчка кода:
await bot.send_message(message.from_user.id, locales.hello_user[f'hello_with_all_name_{BotDB.user_language(message.from_user.id)}'], parse_mode='html', reply_markup=kb.markup_start)
А вот список сообщений с файла locales.py:
hello_user = {
'hello_with_all_name_uk': '? Привіт, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Вітаємо у нашому боті ?',
'hello_with_all_name_ru': '? Привет, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Поздравляем в нашем сапоге ?',
'hello_with_all_name_en': '? Hello <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Welcome to our bot ?'
}
Ответы (1 шт):
Вы можете попробывать реализовать это в формате функции:
def hello(message):
hello_user = {
'hello_with_all_name_uk': '? Привіт, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Вітаємо у нашому боті ?',
'hello_with_all_name_ru': '? Привет, <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Поздравляем в нашем сапоге ?',
'hello_with_all_name_en': '? Hello <b><u>{message.from_user.first_name} {message.from_user.last_name}</u></b>. ? Welcome to our bot ?'
}
return hello_user["hello_with_all_name_uk"]
В эту функцию вы просто передаёте само сообщение в обрабработчике при отправке. Вот пример:
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply(hello(message))
P.S. - Не забудьте изменить данные в [] в return в функции hello, на свои с БД!!!
И также не большая правочка насчёт Вашего словаря, правильние украинский язык назвать hello_with_all_name_ua, потомучто uk - это United Kingdom(Великобритания) ;)
Вы можеет попробывать использывать .format для выполнения Вашей задачи. Пример использования:
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
hello_user = {
'hello_with_all_name_uk': '? Привіт, <b><u>{} {}</u></b>. ? Вітаємо у нашому боті ?',
'hello_with_all_name_ru': '? Привет, <b><u>{} {}</u></b>. ? Поздравляем в нашем сапоге ?',
'hello_with_all_name_en': '? Hello <b><u>{} {}</u></b>. ? Welcome to our bot ?'
}
await bot.send_message(message.from_user.id, hello_user["hellow_with_all_name_uk"].format(message.from_user.first_name, message.from_user.last_name))
Если этот пример Вам больше по душе и будет коректно работать в Вашей ситуации, то не забудьте изменить словарь hello_user на поданый в этом примере и использовать для дальнейшей локализации в подобном формате!