diff --git a/bot/handlers/admin/broadcast.py b/bot/handlers/admin/broadcast.py
index b2da070..ce3821d 100644
--- a/bot/handlers/admin/broadcast.py
+++ b/bot/handlers/admin/broadcast.py
@@ -337,15 +337,24 @@ async def confirm_broadcast_callback_handler(
# Get queue stats for detailed report
queue_stats = queue_manager.get_queue_stats()
- result_message = f"""🚀 Рассылка поставлена в очередь!
-📤 В очередь добавлено: {sent_count}
-❌ Ошибок: {failed_count}
-
-📊 Статус очередей:
-👥 Очередь пользователей: {queue_stats['user_queue_size']} сообщений
-📢 Очередь групп: {queue_stats['group_queue_size']} сообщений
-
-ℹ️ Сообщения будут отправлены автоматически с соблюдением лимитов Telegram."""
+ result_message = (
+ _(
+ "broadcast_queue_result",
+ default=(
+ "🚀 Рассылка поставлена в очередь!\n"
+ "📤 В очередь добавлено: {sent_count}\n"
+ "❌ Ошибок: {failed_count}\n\n"
+ "📊 Статус очередей:\n"
+ "👥 Очередь пользователей: {user_queue_size} сообщений\n"
+ "📢 Очередь групп: {group_queue_size} сообщений\n\n"
+ "ℹ️ Сообщения будут отправлены автоматически с соблюдением лимитов Telegram."
+ ),
+ sent_count=sent_count,
+ failed_count=failed_count,
+ user_queue_size=queue_stats["user_queue_size"],
+ group_queue_size=queue_stats["group_queue_size"],
+ )
+ )
await callback.message.answer(
result_message,
reply_markup=get_back_to_admin_panel_keyboard(current_lang, i18n),
diff --git a/bot/handlers/admin/user_management.py b/bot/handlers/admin/user_management.py
index 24de068..2cbcadb 100644
--- a/bot/handlers/admin/user_management.py
+++ b/bot/handlers/admin/user_management.py
@@ -420,7 +420,9 @@ async def handle_view_user_logs(callback: types.CallbackQuery, user: User,
), show_alert=True)
return
- logs_text_parts = [f"📜 Последние действия пользователя {user.user_id}:\n"]
+ logs_text_parts = [
+ f"{_('admin_user_recent_actions_title', default='📜 Последние действия пользователя {user_id}:', user_id=user.user_id)}\n"
+ ]
for log in logs:
timestamp = log.timestamp.strftime('%Y-%m-%d %H:%M') if log.timestamp else 'N/A'
diff --git a/locales/en.json b/locales/en.json
index 41e5b5b..f29f418 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -14,7 +14,7 @@
"back_to_main_menu_button": "⬅️ Back",
- "choose_language": "Choose language / Выберите язык:",
+ "choose_language": "Choose language:",
"language_set_alert": "Language changed!",
"error_occurred_try_again": "An error occurred, please try again.",
@@ -58,6 +58,8 @@
"referral_share_message_button": "📩 Message for friend",
"referral_friend_message": "🚀 Hey! Try this VPN - it's fast, reliable and affordable!\n\n🎁 Use my link to get bonus days with your subscription!\n\n{referral_link}",
"friend_placeholder": "friend",
+ "referral_bonus_inviter_notification_extended": "🎉 Congrats! Your friend {referee_name} paid for a subscription. You received {days} bonus days! Your subscription is now active until {new_end_date}.",
+ "referral_bonus_inviter_notification_new_sub": "🎉 Congrats! Your friend {referee_name} paid for a subscription. You received a {days}-day bonus subscription! It is active until {new_end_date}.",
"user_is_banned": "🚫 Your account is banned. Please contact support.",
"admin_panel_title": "Admin Panel",
@@ -125,19 +127,20 @@
"admin_broadcast_cancelled": "Broadcast cancelled.",
"admin_broadcast_cancelled_alert": "Broadcast cancelled!",
"admin_broadcast_cancelled_nav_back": "Broadcast cancelled. You are returned to the admin panel.",
+ "broadcast_queue_result": "🚀 Broadcast queued!\n📤 Enqueued: {sent_count}\n❌ Errors: {failed_count}\n\n📊 Queue Status:\n👥 User queue: {user_queue_size} messages\n📢 Group queue: {group_queue_size} messages\n\nℹ️ Messages will be sent automatically within Telegram limits.",
"admin_promo_invalid_code_format": "Code must be 3–30 alphanumeric characters.",
"admin_promo_invalid_bonus_days": "Bonus days must be a positive number.",
"admin_promo_invalid_max_activations": "Max activations must be a positive number.",
"admin_promo_invalid_validity_days": "Validity period (in days) must be a positive number.",
"admin_promo_created_success": "✅ Promo code {code} created successfully!\nBonus: {bonus_days} days\nMax uses: {max_activations}\nValid until: {valid_until_str}.",
- "admin_promo_set_validity_days": "⏰ Установить срок (дни)",
- "admin_back_to_panel": "⬅️ В панель",
- "admin_promo_unlimited": "♾️ Неограниченно",
- "admin_bulk_promo_created_title": "📦 Массовое создание завершено",
- "admin_bulk_promo_created_stats": "📊 Создано: {created} из {total}",
- "admin_bulk_promo_settings": "🎁 Бонусные дни: {bonus_days}\n📊 Макс. активаций: {max_activations}\n⏰ Срок действия: {validity}",
+ "admin_promo_set_validity_days": "⏰ Set validity (days)",
+ "admin_back_to_panel": "⬅️ Back to panel",
+ "admin_promo_unlimited": "♾️ Unlimited",
+ "admin_bulk_promo_created_title": "📦 Bulk creation completed",
+ "admin_bulk_promo_created_stats": "📊 Created: {created} of {total}",
+ "admin_bulk_promo_settings": "🎁 Bonus days: {bonus_days}\n📊 Max activations: {max_activations}\n⏰ Validity: {validity}",
"admin_promo_list_page_info": "Page {current}/{total} ({count} promo codes)",
- "admin_queue_status_button": "📊 Статус очередей",
+ "admin_queue_status_button": "📊 Queue Status",
"admin_queue_status_title": "📊 Message Queue Status",
"admin_queue_status_info": "📤 Message Queues:\n\n👥 Users (25 msg/sec):\n 📋 In queue: {user_queue_size}\n 🔄 Processing: {user_processing}\n 📈 Sent per minute: {user_recent}\n\n📢 Groups/channels (15 msg/min):\n 📋 In queue: {group_queue_size}\n 🔄 Processing: {group_processing}\n 📈 Sent per minute: {group_recent}",
"admin_active_promos_list_header": "Active Promo Codes:",
@@ -240,7 +243,7 @@
"admin_user_logs_error": "❌ Error loading user actions",
"admin_direct_message_signature": "\n\n---\n💬 Message from administrator",
"inline_user_stats_message": "👥 User Statistics\n\n📊 Total: {total}\n📈 Active today: {active_today}\n💳 With paid subscription: {paid}\n🆓 On trial period: {trial}\n😴 Inactive: {inactive}\n🚫 Banned: {banned}\n🎁 Via referral program: {referral}",
- "inline_user_stats_description": "Всего: {total}, Платных: {active}",
+ "inline_user_stats_description": "Total: {total}, Paid: {active}",
"inline_admin_user_stats_title": "👥 User Statistics",
"inline_financial_stats_message": "💰 Financial Statistics\n\n📅 Today: {today:.2f} RUB\n ({today_count} payments)\n📅 Week: {week:.2f} RUB\n📅 Month: {month:.2f} RUB\n🏆 All time: {all_time:.2f} RUB",
"inline_admin_financial_stats_title": "💰 Financial Statistics",
@@ -255,6 +258,8 @@
"log_suspicious_promo": "⚠️ Suspicious Promo Code Attempt\n\n👤 User: {user_display}\n🆔 ID: {user_id}\n📝 Input:
{suspicious_input}\n🕐 Time: {timestamp}",
"admin_logs_csv_export_started": "📄 Starting log export to CSV...",
"admin_logs_csv_export_success": "✅ Logs exported! File attached above.",
+ "admin_user_logs_title": "Logs for {user_display} (page {current_page}/{total_pages}):",
+ "admin_all_logs_title": "All Logs (page {current_page}/{total_pages}):",
"admin_csv_header_log_id": "Log ID",
"admin_csv_header_timestamp": "Timestamp",
"admin_csv_header_user_id": "User ID",
diff --git a/locales/ru.json b/locales/ru.json
index e790e7e..a43cc03 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -58,6 +58,8 @@
"referral_share_message_button": "📩 Сообщение для друга",
"referral_friend_message": "🚀 Привет! Попробуй этот VPN - быстрый, надёжный и доступный!\n\n🎁 По моей ссылке тебе дадут бонусные дни к подписке!\n\n{referral_link}",
"friend_placeholder": "друг",
+ "referral_bonus_inviter_notification_extended": "🎉 Поздравляем! Ваш друг {referee_name} оплатил подписку. Вам начислено {days} бонусных дней! Ваша подписка теперь активна до {new_end_date}.",
+ "referral_bonus_inviter_notification_new_sub": "🎉 Поздравляем! Ваш друг {referee_name} оплатил подписку. Вам начислена бонусная подписка на {days} дней! Она активна до {new_end_date}.",
"user_is_banned": "🚫 Ваш аккаунт заблокирован. Пожалуйста, свяжитесь со службой поддержки.",
"admin_panel_title": "Панель администратора",
@@ -255,6 +257,8 @@
"log_suspicious_promo": "⚠️ Подозрительная попытка ввода промокода\n\n👤 Пользователь: {user_display}\n🆔 ID: {user_id}\n📝 Ввод: {suspicious_input}\n🕐 Время: {timestamp}",
"admin_logs_csv_export_started": "📄 Начинаю экспорт логов в CSV...",
"admin_logs_csv_export_success": "✅ Логи экспортированы! Файл прикреплен выше.",
+ "admin_user_logs_title": "Логи пользователя {user_display} (стр. {current_page}/{total_pages}):",
+ "admin_all_logs_title": "Все логи (стр. {current_page}/{total_pages}):",
"admin_csv_header_log_id": "ID Лога",
"admin_csv_header_timestamp": "Время",
"admin_csv_header_user_id": "ID Пользователя",