diff --git a/handlers/keys/key_view.py b/handlers/keys/key_view.py
index 33751f28..8b3fe11b 100644
--- a/handlers/keys/key_view.py
+++ b/handlers/keys/key_view.py
@@ -52,6 +52,7 @@ from handlers.utils import (
format_days,
format_hours,
format_minutes,
+ get_russian_month,
handle_error,
is_full_remnawave_cluster,
)
@@ -231,7 +232,7 @@ async def process_callback_view_key(callback_query: CallbackQuery, session: Any)
f"Осталось: {format_days(days)}, {format_hours(hours)}, {format_minutes(minutes)}"
)
- formatted_expiry_date = expiry_date.strftime("%d %B %Y года")
+ formatted_expiry_date = f"{expiry_date.strftime('%d')} {get_russian_month(expiry_date)} {expiry_date.strftime('%Y')} года"
response_message = key_message(
final_link,
formatted_expiry_date,
diff --git a/handlers/utils.py b/handlers/utils.py
index 189bae49..7aeec6e9 100644
--- a/handlers/utils.py
+++ b/handlers/utils.py
@@ -10,6 +10,7 @@ import asyncpg
from aiogram.types import BufferedInputFile, InlineKeyboardMarkup, InputMediaPhoto, Message
+from datetime import datetime
from bot import bot
from config import ADMIN_ID, DATABASE_URL
from database import get_all_keys, get_servers
@@ -256,3 +257,33 @@ def sanitize_key_name(key_name: str) -> str:
str: Очищенное название ключа в нижнем регистре.
"""
return re.sub(r"[^a-z0-9@._-]", "", key_name.lower())
+
+
+RUSSIAN_MONTHS = {
+ 'January': 'Января',
+ 'February': 'Февраля',
+ 'March': 'Марта',
+ 'April': 'Апреля',
+ 'May': 'Мая',
+ 'June': 'Июня',
+ 'July': 'Июля',
+ 'August': 'Августа',
+ 'September': 'Сентября',
+ 'October': 'Октября',
+ 'November': 'Ноября',
+ 'December': 'Декабря'
+}
+
+
+def get_russian_month(date: datetime) -> str:
+ """
+ Преобразует английское название месяца в русское.
+
+ Args:
+ date: Объект datetime, из которого извлекается месяц.
+
+ Returns:
+ Название месяца на русском языке.
+ """
+ english_month = date.strftime("%B")
+ return RUSSIAN_MONTHS.get(english_month, english_month)