@insendiofx

Python Telebot, Как реализовать многоязычного бота?

Приветствую, пишу бот для telegram на языке Python с использованием telebot.
Хотелось бы добавить ему несколько языков помимо русского. Пытался сам обдумать логику бота, но пока у меня не получается.
Создал файл конфигурации cons.py:

token = "427778629:-oWX9DXZgTX5TXi0I8e0N3s4"
lang = 'ru'
start_msg = 'Здравствуйте, уважаемый клиент!\nВас приветствует бот компании!\nПожалуйста, выберите из меню то что вас интересует.'
order_menu = 'Заказать такси'
info_menu = 'Информация'
exit_menu = 'Покинуть бота'


И main.py:
...
import telebot
import cons
...
bot = telebot.TeleBot(cons.token)
@bot.message_handler(commands=['start'])
def request_contact(message):
    keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
    button_contact = types.KeyboardButton(text="START", request_contact=True)
    keyboard.add(button_contact)
    msg = bot.send_message(message.chat.id, "Ув.пользовател, для начало работы с ботом нажмите на кнопку 'START'  ", reply_markup=keyboard)
    bot.register_next_step_handler(msg, start)

def start(message):
    #Переводы
    if cons.lang == 'ru':
      start_msg = 'Здравствуйте, уважаемый клиент!\nВас приветствует бот компании!\nПожалуйста, выберите из меню то что вас интересует.'
      order_menu = 'Заказать такси'
      info_menu = 'Информация'
      exit_menu = 'Покинуть бота'
    elif cons.lang == 'en':
      start_msg = 'Grettings.'
      order_menu = 'Order Taxi'
      info_menu = 'Information'
      exit_menu = 'Leave bot'

  # Главное меню
    start_markup = types.ReplyKeyboardMarkup(True, False)
    start_markup.row(' '+cons.order_menu+' ', )
    start_markup.row('ℹ️ '+cons.info_menu+' ℹ️')
    start_markup.row('English', 'Русский язык')
    start_markup.row(' '+cons.exit_menu+' ')
    bot.send_message(message.chat.id, cons.start_msg, reply_markup=start_markup)

@bot.message_handler(content_types=["text"])
def main(message): 
    if message.text == 'English':
        cons.lang = 'en'
        msg = bot.send_message(message.chat.id, 'Your language is -'+cons.lang+' -', reply_markup=start_markup)
        bot.register_next_step_handler(msg, start)
    elif message.text == 'Русский язык':
        cons.lang = 'ru'
        msg = bot.send_message(message.chat.id, 'Вы выбрали русский язык-'+cons.lang+' -', reply_markup=start_markup)
        bot.register_next_step_handler(msg, start)


В моем случаи данный код работает, ну как работает :D приходится нажимать кнопку на "English" 2 раза и язык бота меняется, но ни только для одного пользователя как должен, и для всех остальных тоже меняется...
Надеюсь на вашу помощь, благодарю за ранее.
  • Вопрос задан
  • 5014 просмотров
Решения вопроса 2
flygrounder
@flygrounder
Python/Django
Модули, призванные решить проблемы интернационализации типа gettext рассчитаны на локальное исполнение у пользователя. Т.е. в вашем случае, это будем 1 язык - 1 бот.
Поэтому я бы сделал так:
0)Создать словарь типа
languages = {
    'russian': {
       'Hello': 'Привет',
    },
}

1)Сначала спрашивать у пользователя его язык, потом заносить в БД, а выдавать ему данные типа languages[language]["Hello"], где language - значение языка из базы для данного чата
Ответ написан
Комментировать
t0rr
@t0rr
PM
Вот рабочий пример использования gettext для одного многоязычного бота:
https://github.com/jh0ker/mau_mau_bot

Не всё так страшно, как Артём описал.
_("Привет") выглядит куда локаничнее, чем languages[language]["Привет"]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы