EN language only

This commit is contained in:
vrubelroman 2025-11-12 23:20:01 +03:00
parent 3ec1fe614d
commit 3362bf89e2
4 changed files with 353 additions and 94 deletions

View file

@ -1,5 +1,6 @@
from typing import Dict, Any, Optional
from datetime import datetime
from i18n import t
class StatsFormatter:
@staticmethod
@ -13,10 +14,10 @@ class StatsFormatter:
return f"0"
@staticmethod
def format_stats_response(data: Dict[str, Any], username: str, period: str) -> str:
def format_stats_response(data: Dict[str, Any], username: str, period: str, lang: str = 'en') -> str:
"""Format statistics response according to the template"""
if not data or data.get('data') is None:
message = data.get('message', 'Нет данных') if data else 'Нет данных'
message = data.get('message', t('no_data', lang)) if data else t('no_data', lang)
return f"📭 {message}"
# Extract data from API response
@ -25,7 +26,7 @@ class StatsFormatter:
games = api_data.get('games', {})
# Format date range
date_range = StatsFormatter._get_date_range(period)
date_range = StatsFormatter._get_date_range(period, lang)
# Format tasks section
task_text = ""
@ -33,7 +34,7 @@ class StatsFormatter:
total_tasks = tasks.get('total', 0)
solved = tasks.get('solved', 0)
unsolved = tasks.get('unsolved', 0)
task_text = f"🧩 Задачи: {total_tasks} (✅ {solved} - ❌ {unsolved})\n\n"
task_text = t('puzzles_section', lang, total=total_tasks, solved=solved, unsolved=unsolved)
# Format games section
games_text = ""
@ -55,21 +56,29 @@ class StatsFormatter:
# Format rating change
rating_change_str = StatsFormatter._format_rating_change(rating_change)
games_text += f"{emoji} {game_type.title()}{games_count} игр • {rating_change_str}\n"
games_text += f"Рейтинг: {rating}\n"
games_text += f"✅ Победы: {wins}\n"
games_text += f"❌ Поражения: {losses}\n"
games_text += f"🤝 Ничьи: {draws}\n\n"
# Get game type name (capitalize first letter)
game_type_name = game_type.title()
games_text += t('games_section', lang,
emoji=emoji,
game_type=game_type_name,
games_count=games_count,
rating_change=rating_change_str,
rating=rating,
wins=wins,
losses=losses,
draws=draws
)
# Combine all parts
result = f"📊 Статистика {username}{date_range}\n\n"
result = t('stats_title', lang, username=username, date_range=date_range)
result += task_text
result += games_text.rstrip()
return result
@staticmethod
def _get_date_range(period: str) -> str:
def _get_date_range(period: str, lang: str = 'en') -> str:
"""Get date range string for the period"""
from datetime import datetime, timedelta
@ -99,19 +108,19 @@ class StatsFormatter:
return emoji_map.get(game_type.lower(), '🎯')
@staticmethod
def format_period_notification(username: str, games_data: Optional[Dict], puzzles_data: Optional[Dict], period_minutes: int) -> str:
def format_period_notification(username: str, games_data: Optional[Dict], puzzles_data: Optional[Dict], period_minutes: int, lang: str = 'en') -> str:
"""Format notification for periodic checks"""
from datetime import datetime
# Format period text
if period_minutes == 1:
period_text = "за 1 минуту"
period_text = t('period_1_minute', lang)
elif period_minutes in [2, 3, 4]:
period_text = f"за {period_minutes} минуты"
period_text = t('period_2_3_4_minutes', lang, period=period_minutes)
else:
period_text = f"за {period_minutes} минут"
period_text = t('period_minutes_text', lang, period=period_minutes)
result = f"📊 Статистика {username}{period_text}\n\n"
result = t('period_notification_title', lang, username=username, period_text=period_text)
# Format puzzles first (if available and there's actual activity)
if puzzles_data and puzzles_data.get('data'):
@ -122,7 +131,7 @@ class StatsFormatter:
# Only show tasks section if there's actual activity (not all zeros)
if total_puzzles > 0 or solved > 0 or failed > 0:
result += f"🧩 Задачи: {total_puzzles} (✅ {solved} - ❌ {failed})\n\n"
result += t('period_puzzles_section', lang, total=total_puzzles, solved=solved, failed=failed)
# Format games
if games_data and games_data.get('data'):
@ -142,14 +151,21 @@ class StatsFormatter:
draws = game_data.get('draws', 0)
rating_change_str = StatsFormatter._format_rating_change(rating_change)
result += f"{emoji} {game_type.title()}{games_count} игр • {rating_change_str}\n"
result += f"Рейтинг: {rating}\n"
result += f"✅ Победы: {wins}\n"
result += f"❌ Поражения: {losses}\n"
result += f"🤝 Ничьи: {draws}\n\n"
game_type_name = game_type.title()
result += t('period_games_section', lang,
emoji=emoji,
game_type=game_type_name,
games_count=games_count,
rating_change=rating_change_str,
rating=rating,
wins=wins,
losses=losses,
draws=draws
)
# If no activity
if not (games_data and games_data.get('data')) and not (puzzles_data and puzzles_data.get('data')):
result += "📭 Нет активности за этот период"
result += t('no_activity', lang)
return result.rstrip()