Для решения проблемы с переводом текста сообщений в вашем боте Telegram, вам нужно убедиться, что вы корректно обрабатываете и сохраняете выбранный пользователем язык. Также нужно использовать этот язык в функциях формирования текста ответов. Далее я предложу улучшенную версию кода с улучшенной читаемостью и структурой.
Вот пример оптимизированного кода:
```python
import telebot
from telebot import types
import requests
TELEGRAM_BOT_TOKEN = ''
WEATHER_API_KEY = ''
bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN)
user_languages = {}
def get_weather(city, lang='ru'):
url = (f"http://api.openweathermap.org/data/2.5/weather"
f"?q={city}&appid={WEATHER_API_KEY}&units=metric&lang={lang}")
try:
response = requests.get(url)
data = response.json()
if data.get("cod") != "404":
main = data["main"]
wind = data["wind"]
weather_desc = data["weather"][0]["description"]
weather_report = (f"Погода в {city}:\n"
f"Температура: {main['temp']}°C\n"
f"Ощущается как: {main['feels_like']}°C\n"
f"Влажность: {main['humidity']}%\n"
f"Скорость ветра: {wind['speed']} м/с\n"
f"Описание: {weather_desc}")
return weather_report
else:
return "Город не найден. Попробуйте ещё раз."
except Exception:
return "Ошибка при получении данных о погоде."
def get_language(user_id):
return user_languages.get(user_id, 'ru') # по умолчанию - русский
@bot.message_handler(commands=['start'])
def start_message(message):
bot.send_message(
message.chat.id,
"Привет! Напишите название города, чтобы получить текущую погоду.\n"
"Напишите 'поменять язык', чтобы сменить язык."
)
@bot.message_handler(func=lambda message: "поменять язык" in message.text.lower())
def change_language(message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_ru = types.KeyboardButton("Русский")
button_en = types.KeyboardButton("Английский")
keyboard.add(button_ru, button_en)
bot.send_message(
message.chat.id,
"Выберите язык:",
reply_markup=keyboard
)
@bot.message_handler(func=lambda message: message.text in ["Русский", "Английский"])
def set_language(message):
user_languages[message.from_user.id] = 'ru' if message.text == "Русский" else 'en'
bot.send_message(message.chat.id, "Язык изменен. Теперь вы можете получить погоду на выбранном языке.")
@bot.message_handler(func=lambda message: True)
def handle_weather_request(message):
user_id = message.from_user.id
city = message.text.strip()
lang = get_language(user_id)
weather_report = get_weather(city, lang)
bot.send_message(message.chat.id, weather_report)
if __name__ == "__main__":
bot.polling(none_stop=True)
```
### Что изменено и улучшено:
1. **Логика выбора языка**: добавлена функция `get_language`, которая возвращает язык для текущего пользователя по умолчанию.
2. **Обработка исключений**: упрощена обработка ошибок в функции `get_weather`.
3. **Упрощение кода**: Переработаны функции для более четкой структуры и читаемости.
4. **Минимизация магических строк**: вместо использования строковых констант для обработки языков можно использовать отдельные функции и структуры данных.
5. **Добавлен обработчик для других сообщений**: добавлен обработчик для запросов погоды, чтобы упростить логику получения погоды.
Теперь ваш бот сможет обрабатывать запросы на разных языках более эффективно, и структура кода стала более понятной.