switch ru/en

This commit is contained in:
vrubelroman 2025-11-20 12:43:00 +03:00
parent c16a11cf63
commit 123749415a
4 changed files with 241 additions and 81 deletions

View file

@ -1,11 +1,11 @@
"""
Internationalization module for the Lichess Telegram Bot
English language only
Supports English and Russian languages
"""
from typing import Optional
# Translation dictionary (English only)
# Translation dictionary (English and Russian)
TRANSLATIONS = {
'en': {
# Start command
@ -37,6 +37,7 @@ TRANSLATIONS = {
"/lastYear_or_1000games - Statistics for the last year or last 1000 rated games (whichever comes first)\n"
"/setperiod - Set up periodic notifications for the active player\n"
"(active player changes in the /getgamers menu)\n"
"/set_lang - Select bot language (English / Russian)\n"
"/support - Contact the developer for support and feedback"
),
@ -117,30 +118,153 @@ TRANSLATIONS = {
# Common
'period_minutes_suffix': "m",
# Language selection
'select_language': "🌐 <b>Select language / Выберите язык:</b>",
'language_set_en': "✅ Language set to English",
'language_set_ru': "✅ Язык установлен: Русский",
},
'ru': {
# Start command
'start_message': (
"Бот отслеживает одного или нескольких игроков на Lichess.\n"
"Показывает рейтинги, активность за сегодня, вчера и за неделю.\n"
"При указании user_token (с разрешением на чтение пазлов) можно также получать данные по пазлам.\n"
"Бот поддерживает автоматические проверки с заданными интервалами и отправляет отчет, если была активность за это время.\n\n"
"Пример за неделю:\n"
"🧩 Пазлы: 114 (✅ 81 - ❌ 33)\n\n"
"🔥 Блиц — 5 игр • 🔴 -10\n"
"Рейтинг: 2245\n"
"✅ Побед: 1\n"
"❌ Поражений: 3\n"
"🤝 Ничьих: 1\n\n"
"🐇 Рапид — 19 игр • 🟢 +20\n"
"Рейтинг: 2248\n"
"✅ Побед: 8\n"
"❌ Поражений: 4\n"
"🤝 Ничьих: 7\n\n"
"📋 Доступные команды:\n"
"/addgamer - Добавить игрока Lichess для отслеживания (только username)\n"
"/addtoken - Добавить игрока с токеном для получения данных по пазлам\n"
"/getgamers - Выбрать активного игрока (для которого будут работать /today и другие команды)\n"
"/delgamer - Удалить игрока из списка отслеживаемых\n"
"/today - Статистика за сегодня\n"
"/yesterday - Статистика за вчера\n"
"/week - Статистика за неделю\n"
"/lastYear_or_1000games - Статистика за последний год или последние 1000 рейтинговых игр (что наступит раньше)\n"
"/setperiod - Настроить периодические уведомления для активного игрока\n"
"(активный игрок меняется в меню /getgamers)\n"
"/set_lang - Выбрать язык бота\n"
"/support - Связаться с разработчиком для поддержки и обратной связи"
),
# Add gamer commands
'addgamer_prompt': "👤 Введите username игрока Lichess для отслеживания:",
'addtoken_prompt': (
"🔑 Введите токен API Lichess для получения данных по пазлам.\n"
"Токен создается в настройках профиля — дайте ему только разрешение puzzle:read.\n"
"После этого будет добавлен игрок, соответствующий этому токену."
),
'token_added': "✅ Токен добавлен для игрока {username}!",
'gamer_added_with_token': "✅ Игрок {username} добавлен с токеном!",
'gamer_added': "✅ Игрок {username} успешно добавлен!\n\nДля добавления следующего игрока воспользуйтесь /addgamer",
'invalid_token': "❌ Неверный токен. Попробуйте еще раз.",
'token_username_error': "Не удалось получить username из токена. Попробуйте еще раз.",
'empty_username': "❌ Username не может быть пустым. Попробуйте еще раз.",
'user_not_found': "❌ Игрок {username} не найден на Lichess. Проверьте правильность написания имени.",
# Get gamers
'no_gamers': "📭 Нет игроков в базе данных. Используйте /addgamer для добавления.",
'loading_ratings': "🔄 Загрузка рейтингов игроков...",
'select_active_gamer': "👥 <b>Выберите активного игрока:</b>\n\n",
'active_gamer_set': "✅ Активный игрок: {username}",
'gamer_not_found': "❌ Игрок не найден",
# Delete gamer
'no_gamers_to_delete': "📭 У вас нет отслеживаемых игроков.",
'loading_gamers': "🔄 Загрузка списка игроков...",
'select_gamer_to_delete': "🗑️ <b>Выберите игрока для удаления:</b>\n\n",
'gamer_deleted': "✅ Игрок <b>{username}</b> удален из списка отслеживаемых.",
'active_gamer_deleted': "✅ Игрок <b>{username}</b> удален из списка отслеживаемых.\n\n⚠️ Вы удалили активного игрока. Используйте команду /getgamers для выбора игрока, для которого будут работать команды /today, /yesterday, /week.",
'last_gamer_deleted': "✅ Игрок <b>{username}</b> удален из списка отслеживаемых.\n\n⚠️ Вы удалили последнего игрока. Используйте команду /addgamer для добавления нового отслеживаемого игрока.",
'delete_failed': "Не удалось удалить игрока",
# Stats commands
'no_active_gamer': "❌ Нет активного игрока. Используйте /getgamers для выбора.",
'unknown_period': "❌ Неизвестный период",
'no_data': "📭 Нет данных",
'stats_title': "📊 Статистика {username}{date_range}\n\n",
'puzzles_section': "🧩 Пазлы: {total} (✅ {solved} - ❌ {unsolved})\n\n",
'games_section': "{emoji} {game_type}{games_count} игр • {rating_change}\nРейтинг: {rating}\n✅ Побед: {wins}\n❌ Поражений: {losses}\n🤝 Ничьих: {draws}\n\n",
# Set period
'select_gamer_for_period': "⏱️ <b>Выберите игрока для установки периода уведомлений:</b>\n\n",
'select_period': "⏱️ Выберите период для игрока {username}:\n📱 Уведомления будут отправляться в личные сообщения",
'notifications_disabled': "✅ Уведомления отключены для {username}",
'period_set': "✅ Период {period} минут установлен для {username}\n📱 Уведомления будут отправляться в личные сообщения",
'disable_notifications': "❌ Отключить уведомления",
'period_minutes': "{period} минут",
# Period notification
'period_1_minute': "за 1 минуту",
'period_2_3_4_minutes': "за {period} минуты",
'period_minutes_text': "за {period} минут",
'period_notification_title': "📊 Статистика {username}{period_text}\n\n",
'period_puzzles_section': "🧩 Пазлы: {total} (✅ {solved} - ❌ {failed})\n\n",
'period_games_section': "{emoji} {game_type}{games_count} игр • {rating_change}\nРейтинг: {rating}\n✅ Побед: {wins}\n❌ Поражений: {losses}\n🤝 Ничьих: {draws}\n\n",
'no_activity': "📭 Нет активности за этот период",
# Last year or 1000 games
'last_year_1000_processing': "⏳ Обработка запроса... Это может занять некоторое время, так как запросы очень медленные.",
'last_year_1000_player_processing': "🔄 Запрос данных для игрока <b>{username}</b>...",
# Stats commands (today/yesterday/week)
'stats_processing': "⏳ Обработка запроса...",
'stats_player_processing': "🔄 Запрос данных для игрока <b>{username}</b>...",
'stats_all_done': "✅ Это всё",
# Support
'support_message': (
"💬 <b>Поддержка и обратная связь</b>\n\n"
"Вы можете написать разработчику сервиса напрямую и сообщить о проблеме, предложить новые функции или задать вопрос.\n\n"
"Я буду рад рассмотреть каждое сообщение и ответить на него.\n\n"
"Разработчик принимает сообщения на <b>английском</b> и <b>русском</b> языках.\n\n"
"📧 Контакт: <a href=\"https://t.me/vrubelr\">@vrubelr</a>\n\n"
"📦 Версия бота: <b>{version}</b>"
),
# Common
'period_minutes_suffix': "м",
# Language selection
'select_language': "🌐 <b>Выберите язык / Select language:</b>",
'language_set_en': "✅ Language set to English",
'language_set_ru': "✅ Язык установлен: Русский",
}
}
def get_user_language(update) -> str:
"""
Always return English language.
"""
return 'en'
def t(key: str, lang: str = 'en', **kwargs) -> str:
"""
Translate a key (always English).
Translate a key to the specified language.
Args:
key: Translation key
lang: Language code (ignored, always uses English)
lang: Language code ('en' or 'ru')
**kwargs: Format arguments for the translation string
Returns:
Translated string with formatted arguments
"""
translation = TRANSLATIONS['en'].get(key, key)
# Default to English if language not supported
if lang not in TRANSLATIONS:
lang = 'en'
translation = TRANSLATIONS[lang].get(key)
# Fallback to English if translation not found
if translation is None:
translation = TRANSLATIONS['en'].get(key, key)
# Format the string if kwargs provided
if kwargs:
@ -151,10 +275,3 @@ def t(key: str, lang: str = 'en', **kwargs) -> str:
return translation
return translation
def get_lang_from_update(update) -> str:
"""
Always return English.
"""
return 'en'