diff --git a/app/handlers/subscription.py b/app/handlers/subscription.py
index ac9353d5..923a07ca 100644
--- a/app/handlers/subscription.py
+++ b/app/handlers/subscription.py
@@ -1174,10 +1174,7 @@ async def handle_add_countries(
subscription = db_user.subscription
if not subscription or subscription.is_trial:
- await callback.answer(
- texts.t("SUBSCRIPTION_FEATURE_PAID_ONLY", "⚠ Эта функция доступна только для платных подписок"),
- show_alert=True,
- )
+ await callback.answer("⚠ Эта функция доступна только для платных подписок", show_alert=True)
return
countries = await _get_available_countries(db_user.promo_group_id)
@@ -1195,34 +1192,19 @@ async def handle_add_countries(
if country['uuid'] in current_countries:
current_countries_names.append(country['name'])
- countries_list = "\n".join(f"• {name}" for name in current_countries_names)
- if not countries_list:
- countries_list = texts.t("SUBSCRIPTION_COUNTRIES_NONE", "Нет подключенных стран")
+ text = "🌍 Управление странами подписки\n\n"
+ text += f"📋 Текущие страны ({len(current_countries)}):\n"
+ if current_countries_names:
+ text += "\n".join(f"• {name}" for name in current_countries_names)
+ else:
+ text += "Нет подключенных стран"
- text = "\n\n".join(
- [
- texts.t(
- "SUBSCRIPTION_COUNTRIES_MANAGEMENT_TITLE",
- "🌍 Управление странами подписки",
- ),
- texts.t(
- "SUBSCRIPTION_COUNTRIES_CURRENT",
- "📋 Текущие страны ({count}):\n{countries}",
- ).format(count=len(current_countries), countries=countries_list),
- texts.t(
- "SUBSCRIPTION_COUNTRIES_INSTRUCTIONS",
- "💡 Инструкция:\n"
- "✅ - страна подключена\n"
- "➕ - будет добавлена (платно)\n"
- "➖ - будет отключена (бесплатно)\n"
- "⚪ - не выбрана",
- ),
- texts.t(
- "SUBSCRIPTION_COUNTRIES_NOTICE",
- "⚠️ Важно: Повторное подключение отключенных стран будет платным!",
- ),
- ]
- )
+ text += "\n\n💡 Инструкция:\n"
+ text += "✅ - страна подключена\n"
+ text += "➕ - будет добавлена (платно)\n"
+ text += "➖ - будет отключена (бесплатно)\n"
+ text += "⚪ - не выбрана\n\n"
+ text += "⚠️ Важно: Повторное подключение отключенных стран будет платным!"
await state.update_data(countries=current_countries.copy())
@@ -1292,13 +1274,9 @@ async def handle_manage_country(
country_uuid = callback.data.split('_')[2]
- texts = get_texts(db_user.language)
subscription = db_user.subscription
if not subscription or subscription.is_trial:
- await callback.answer(
- texts.t("SUBSCRIPTION_FEATURE_PAID_ONLY", "⚠ Только для платных подписок"),
- show_alert=True,
- )
+ await callback.answer("⚠ Только для платных подписок", show_alert=True)
return
data = await state.get_data()
@@ -1308,13 +1286,7 @@ async def handle_manage_country(
allowed_country_ids = {country['uuid'] for country in countries}
if country_uuid not in allowed_country_ids and country_uuid not in current_selected:
- await callback.answer(
- texts.t(
- "SUBSCRIPTION_COUNTRY_NOT_AVAILABLE",
- "❌ Сервер недоступен для вашей промогруппы",
- ),
- show_alert=True,
- )
+ await callback.answer("❌ Сервер недоступен для вашей промогруппы", show_alert=True)
return
if country_uuid in current_selected:
@@ -1626,10 +1598,7 @@ async def handle_change_devices(
subscription = db_user.subscription
if not subscription or subscription.is_trial:
- await callback.answer(
- texts.t("SUBSCRIPTION_FEATURE_PAID_ONLY", "⚠️ Эта функция доступна только для платных подписок"),
- show_alert=True,
- )
+ await callback.answer("⚠️ Эта функция доступна только для платных подписок", show_alert=True)
return
current_devices = subscription.device_limit
@@ -1641,32 +1610,13 @@ async def handle_change_devices(
period_hint_days,
)
- texts = get_texts(db_user.language)
-
await callback.message.edit_text(
- "\n".join(
- [
- texts.t(
- "SUBSCRIPTION_CHANGE_DEVICES_TITLE",
- "📱 Изменение количества устройств",
- ),
- texts.t(
- "SUBSCRIPTION_CHANGE_DEVICES_CURRENT",
- "Текущий лимит: {count} устройств",
- ).format(count=current_devices),
- texts.t(
- "SUBSCRIPTION_CHANGE_DEVICES_PROMPT",
- "Выберите новое количество устройств:",
- ),
- "",
- texts.t(
- "SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT",
- "💡 Важно:\n"
- "• При увеличении - доплата пропорционально оставшемуся времени\n"
- "• При уменьшении - возврат средств не производится",
- ),
- ]
- ),
+ f"📱 Изменение количества устройств\n\n"
+ f"Текущий лимит: {current_devices} устройств\n"
+ f"Выберите новое количество устройств:\n\n"
+ f"💡 Важно:\n"
+ f"• При увеличении - доплата пропорционально оставшемуся времени\n"
+ f"• При уменьшении - возврат средств не производится",
reply_markup=get_change_devices_keyboard(
current_devices,
db_user.language,
@@ -1691,22 +1641,13 @@ async def confirm_change_devices(
current_devices = subscription.device_limit
if new_devices_count == current_devices:
- await callback.answer(
- texts.t(
- "SUBSCRIPTION_CHANGE_DEVICES_NO_CHANGE",
- "ℹ️ Количество устройств не изменилось",
- ),
- show_alert=True,
- )
+ await callback.answer("ℹ️ Количество устройств не изменилось", show_alert=True)
return
if settings.MAX_DEVICES_LIMIT > 0 and new_devices_count > settings.MAX_DEVICES_LIMIT:
await callback.answer(
- texts.t(
- "SUBSCRIPTION_CHANGE_DEVICES_MAX_LIMIT",
- "⚠️ Превышен максимальный лимит устройств ({limit})",
- ).format(limit=settings.MAX_DEVICES_LIMIT),
- show_alert=True,
+ f"⚠️ Превышен максимальный лимит устройств ({settings.MAX_DEVICES_LIMIT})",
+ show_alert=True
)
return
@@ -1890,17 +1831,11 @@ async def handle_device_management(
subscription = db_user.subscription
if not subscription or subscription.is_trial:
- await callback.answer(
- texts.t("SUBSCRIPTION_FEATURE_PAID_ONLY", "⚠️ Эта функция доступна только для платных подписок"),
- show_alert=True,
- )
+ await callback.answer("⚠️ Эта функция доступна только для платных подписок", show_alert=True)
return
if not db_user.remnawave_uuid:
- await callback.answer(
- texts.t("SUBSCRIPTION_DEVICES_UUID_NOT_FOUND", "❌ UUID пользователя не найден"),
- show_alert=True,
- )
+ await callback.answer("❌ UUID пользователя не найден", show_alert=True)
return
try:
@@ -1917,10 +1852,7 @@ async def handle_device_management(
if total_devices == 0:
await callback.message.edit_text(
- texts.t(
- "SUBSCRIPTION_DEVICES_NONE",
- "ℹ️ У вас нет подключенных устройств",
- ),
+ "ℹ️ У вас нет подключенных устройств",
reply_markup=get_back_keyboard(db_user.language)
)
await callback.answer()
@@ -1928,23 +1860,11 @@ async def handle_device_management(
await show_devices_page(callback, db_user, devices_list, page=1)
else:
- await callback.answer(
- texts.t(
- "SUBSCRIPTION_DEVICES_FETCH_ERROR",
- "❌ Ошибка получения информации об устройствах",
- ),
- show_alert=True,
- )
+ await callback.answer("❌ Ошибка получения информации об устройствах", show_alert=True)
except Exception as e:
logger.error(f"Ошибка получения списка устройств: {e}")
- await callback.answer(
- texts.t(
- "SUBSCRIPTION_DEVICES_FETCH_ERROR",
- "❌ Ошибка получения информации об устройствах",
- ),
- show_alert=True,
- )
+ await callback.answer("❌ Ошибка получения информации об устройствах", show_alert=True)
await callback.answer()
@@ -1960,32 +1880,15 @@ async def show_devices_page(
pagination = paginate_list(devices_list, page=page, per_page=devices_per_page)
- devices_text = "\n".join(
- [
- texts.t(
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TITLE",
- "🔄 Управление устройствами",
- ),
- texts.t(
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL",
- "📊 Всего подключено: {count} устройств",
- ).format(count=len(devices_list)),
- texts.t(
- "SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE",
- "📄 Страница {current} из {total}",
- ).format(current=pagination.page, total=pagination.total_pages),
- "",
- ]
- )
+ devices_text = f"🔄 Управление устройствами\n\n"
+ devices_text += f"📊 Всего подключено: {len(devices_list)} устройств\n"
+ devices_text += f"📄 Страница {pagination.page} из {pagination.total_pages}\n\n"
if pagination.items:
- devices_text += texts.t(
- "SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER",
- "Подключенные устройства:",
- ) + "\n"
+ devices_text += "Подключенные устройства:\n"
for i, device in enumerate(pagination.items, 1):
- platform = device.get('platform', texts.t("SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM", "Unknown"))
- device_model = device.get('deviceModel', texts.t("SUBSCRIPTION_DEVICES_UNKNOWN_MODEL", "Unknown"))
+ platform = device.get('platform', 'Unknown')
+ device_model = device.get('deviceModel', 'Unknown')
device_info = f"{platform} - {device_model}"
if len(device_info) > 35:
@@ -1993,12 +1896,9 @@ async def show_devices_page(
devices_text += f"• {device_info}\n"
- devices_text += "\n" + texts.t(
- "SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS",
- "💡 Действия:\n"
- "• Выберите устройство для сброса\n"
- "• Или сбросьте все устройства сразу",
- )
+ devices_text += "\n💡 Действия:\n"
+ devices_text += "• Выберите устройство для сброса\n"
+ devices_text += "• Или сбросьте все устройства сразу"
await callback.message.edit_text(
devices_text,
@@ -4026,31 +3926,21 @@ async def handle_subscription_settings(
subscription = db_user.subscription
if not subscription or subscription.is_trial:
- await callback.answer(
- texts.t("SUBSCRIPTION_SETTINGS_PAID_ONLY_ALERT", "⚠️ Настройки доступны только для платных подписок"),
- show_alert=True,
- )
+ await callback.answer("⚠️ Настройки доступны только для платных подписок", show_alert=True)
return
devices_used = await get_current_devices_count(db_user)
- traffic_usage = (
- f"{texts.format_traffic(subscription.traffic_used_gb)} / "
- f"{texts.format_traffic(subscription.traffic_limit_gb)}"
- )
- settings_text = texts.t(
- "SUBSCRIPTION_SETTINGS_OVERVIEW",
- "⚙️ Настройки подписки\n\n"
- "📊 Текущие параметры:\n"
- "🌐 Стран: {countries}\n"
- "📈 Трафик: {traffic}\n"
- "📱 Устройства: {devices}\n\n"
- "Выберите что хотите изменить:",
- ).format(
- countries=len(subscription.connected_squads),
- traffic=traffic_usage,
- devices=f"{devices_used} / {subscription.device_limit}",
- )
+ settings_text = f"""
+⚙️ Настройки подписки
+
+📊 Текущие параметры:
+🌐 Стран: {len(subscription.connected_squads)}
+📈 Трафик: {texts.format_traffic(subscription.traffic_used_gb)} / {texts.format_traffic(subscription.traffic_limit_gb)}
+📱 Устройства: {devices_used} / {subscription.device_limit}
+
+Выберите что хотите изменить:
+"""
show_countries = await _should_show_countries_management(db_user)
@@ -4067,28 +3957,18 @@ async def handle_autopay_menu(
db_user: User,
db: AsyncSession
):
- texts = get_texts(db_user.language)
subscription = db_user.subscription
if not subscription:
- await callback.answer(
- texts.t("SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION", "⚠️ У вас нет активной подписки!"),
- show_alert=True,
- )
+ await callback.answer("⚠️ У вас нет активной подписки!", show_alert=True)
return
- status = texts.t(
- "SUBSCRIPTION_AUTOPAY_STATUS_ENABLED" if subscription.autopay_enabled else "SUBSCRIPTION_AUTOPAY_STATUS_DISABLED",
- "включен" if subscription.autopay_enabled else "выключен",
- )
+ status = "включен" if subscription.autopay_enabled else "выключен"
days = subscription.autopay_days_before
- text = texts.t(
- "SUBSCRIPTION_AUTOPAY_MENU",
- "💳 Автоплатеж\n\n"
- "📊 Статус: {status}\n"
- "⏰ Списание за: {days} дн. до окончания\n\n"
- "Выберите действие:",
- ).format(status=status, days=days)
+ text = f"💳 Автоплатеж\n\n"
+ text += f"📊 Статус: {status}\n"
+ text += f"⏰ Списание за: {days} дн. до окончания\n\n"
+ text += "Выберите действие:"
await callback.message.edit_text(
text,
@@ -4102,19 +3982,13 @@ async def toggle_autopay(
db_user: User,
db: AsyncSession
):
- texts = get_texts(db_user.language)
subscription = db_user.subscription
enable = callback.data == "autopay_enable"
await update_subscription_autopay(db, subscription, enable)
- status = texts.t(
- "SUBSCRIPTION_AUTOPAY_STATUS_ENABLED" if enable else "SUBSCRIPTION_AUTOPAY_STATUS_DISABLED",
- "включен" if enable else "выключен",
- )
- await callback.answer(
- texts.t("SUBSCRIPTION_AUTOPAY_TOGGLED", "✅ Автоплатеж {status}!").format(status=status)
- )
+ status = "включен" if enable else "выключен"
+ await callback.answer(f"✅ Автоплатеж {status}!")
await handle_autopay_menu(callback, db_user, db)
@@ -4123,12 +3997,8 @@ async def show_autopay_days(
callback: types.CallbackQuery,
db_user: User
):
- texts = get_texts(db_user.language)
await callback.message.edit_text(
- texts.t(
- "SUBSCRIPTION_AUTOPAY_SELECT_DAYS",
- "⏰ Выберите за сколько дней до окончания списывать средства:",
- ),
+ "⏰ Выберите за сколько дней до окончания списывать средства:",
reply_markup=get_autopay_days_keyboard(db_user.language)
)
await callback.answer()
@@ -4142,15 +4012,11 @@ async def set_autopay_days(
days = int(callback.data.split('_')[2])
subscription = db_user.subscription
- texts = get_texts(db_user.language)
-
await update_subscription_autopay(
db, subscription, subscription.autopay_enabled, days
)
- await callback.answer(
- texts.t("SUBSCRIPTION_AUTOPAY_DAYS_SET", "✅ Установлено {days} дней!").format(days=days)
- )
+ await callback.answer(f"✅ Установлено {days} дней!")
await handle_autopay_menu(callback, db_user, db)
@@ -5444,22 +5310,15 @@ async def handle_switch_traffic(
):
from app.config import settings
- texts = get_texts(db_user.language)
-
if settings.is_traffic_fixed():
- await callback.answer(
- texts.t("SUBSCRIPTION_TRAFFIC_FIXED_ALERT", "⚠️ В текущем режиме трафик фиксированный"),
- show_alert=True,
- )
+ await callback.answer("⚠️ В текущем режиме трафик фиксированный", show_alert=True)
return
+ texts = get_texts(db_user.language)
subscription = db_user.subscription
if not subscription or subscription.is_trial:
- await callback.answer(
- texts.t("SUBSCRIPTION_FEATURE_PAID_ONLY", "⚠️ Эта функция доступна только для платных подписок"),
- show_alert=True,
- )
+ await callback.answer("⚠️ Эта функция доступна только для платных подписок", show_alert=True)
return
current_traffic = subscription.traffic_limit_gb
@@ -5471,29 +5330,12 @@ async def handle_switch_traffic(
)
await callback.message.edit_text(
- "\n".join(
- [
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_TITLE",
- "🔄 Переключение лимита трафика",
- ),
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT",
- "Текущий лимит: {traffic}",
- ).format(traffic=texts.format_traffic(current_traffic)),
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT",
- "Выберите новый лимит трафика:",
- ),
- "",
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT",
- "💡 Важно:\n"
- "• При увеличении - доплата за разницу\n"
- "• При уменьшении - возврат средств не производится",
- ),
- ]
- ),
+ f"🔄 Переключение лимита трафика\n\n"
+ f"Текущий лимит: {texts.format_traffic(current_traffic)}\n"
+ f"Выберите новый лимит трафика:\n\n"
+ f"💡 Важно:\n"
+ f"• При увеличении - доплата за разницу\n"
+ f"• При уменьшении - возврат средств не производится",
reply_markup=get_traffic_switch_keyboard(
current_traffic,
db_user.language,
@@ -5518,13 +5360,7 @@ async def confirm_switch_traffic(
current_traffic = subscription.traffic_limit_gb
if new_traffic_gb == current_traffic:
- await callback.answer(
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_CHANGE",
- "ℹ️ Лимит трафика не изменился",
- ),
- show_alert=True,
- )
+ await callback.answer("ℹ️ Лимит трафика не изменился", show_alert=True)
return
old_price_per_month = settings.get_traffic_price(current_traffic)
@@ -5646,13 +5482,7 @@ async def execute_switch_traffic(
)
if not success:
- await callback.answer(
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGE_ERROR",
- "⚠️ Ошибка списания средств",
- ),
- show_alert=True,
- )
+ await callback.answer("⚠️ Ошибка списания средств", show_alert=True)
return
months_remaining = get_remaining_months(subscription.end_date)
@@ -5684,49 +5514,17 @@ async def execute_switch_traffic(
except Exception as e:
logger.error(f"Ошибка отправки уведомления об изменении трафика: {e}")
- change_line = texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHANGE_LINE",
- "📊 Было: {old} → Стало: {new}",
- ).format(
- old=texts.format_traffic(current_traffic),
- new=texts.format_traffic(new_traffic_gb),
- )
-
if new_traffic_gb > current_traffic:
- success_parts = [
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_INCREASE_TITLE",
- "✅ Лимит трафика увеличен!",
- ),
- "",
- change_line,
- ]
+ success_text = f"✅ Лимит трафика увеличен!\n\n"
+ success_text += f"📊 Было: {texts.format_traffic(current_traffic)} → "
+ success_text += f"Стало: {texts.format_traffic(new_traffic_gb)}\n"
if price_difference > 0:
- success_parts.extend(
- [
- "",
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGED",
- "💰 Списано: {amount}",
- ).format(amount=texts.format_price(price_difference)),
- ]
- )
- else:
- success_parts = [
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_DECREASE_TITLE",
- "✅ Лимит трафика уменьшен!",
- ),
- "",
- change_line,
- "",
- texts.t(
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_REFUND",
- "ℹ️ Возврат средств не производится",
- ),
- ]
-
- success_text = "\n".join(part for part in success_parts if part is not None)
+ success_text += f"💰 Списано: {texts.format_price(price_difference)}"
+ elif new_traffic_gb < current_traffic:
+ success_text = f"✅ Лимит трафика уменьшен!\n\n"
+ success_text += f"📊 Было: {texts.format_traffic(current_traffic)} → "
+ success_text += f"Стало: {texts.format_traffic(new_traffic_gb)}\n"
+ success_text += f"ℹ️ Возврат средств не производится"
await callback.message.edit_text(
success_text,
@@ -5754,16 +5552,12 @@ def get_traffic_switch_keyboard(
) -> InlineKeyboardMarkup:
from app.config import settings
- texts = get_texts(language)
months_multiplier = 1
period_text = ""
if subscription_end_date:
months_multiplier = get_remaining_months(subscription_end_date)
if months_multiplier > 1:
- period_text = texts.t(
- "SUBSCRIPTION_TRAFFIC_PERIOD_SUFFIX",
- " за {months} мес",
- ).format(months=months_multiplier)
+ period_text = f" (за {months_multiplier} мес)"
packages = settings.get_traffic_packages()
enabled_packages = [pkg for pkg in packages if pkg['enabled']]
@@ -5789,57 +5583,34 @@ def get_traffic_switch_keyboard(
if gb == current_traffic_gb:
emoji = "✅"
- suffix = texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_CURRENT",
- " (текущий)",
- )
+ action_text = " (текущий)"
+ price_text = ""
elif total_price_diff > 0:
emoji = "⬆️"
- suffix = texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_PRICE_UP",
- " (+{amount}{period})",
- ).format(
- amount=texts.format_price(total_price_diff),
- period=period_text,
- )
+ action_text = ""
+ price_text = f" (+{total_price_diff // 100}₽{period_text})"
if discount_percent > 0:
discount_total = (
- (price_per_month - current_price_per_month) * months_multiplier
- - total_price_diff
+ (price_per_month - current_price_per_month) * months_multiplier
+ - total_price_diff
)
if discount_total > 0:
- suffix += texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_DISCOUNT",
- " (скидка {percent}%: -{amount})",
- ).format(
- percent=discount_percent,
- amount=texts.format_price(discount_total),
- )
+ price_text += f" (скидка {discount_percent}%: -{discount_total // 100}₽)"
elif total_price_diff < 0:
emoji = "⬇️"
- suffix = texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_NO_REFUND",
- " (без возврата)",
- )
+ action_text = ""
+ price_text = " (без возврата)"
else:
emoji = "🔄"
- suffix = texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_FREE",
- " (бесплатно)",
- )
+ action_text = ""
+ price_text = " (бесплатно)"
if gb == 0:
- traffic_text = texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_UNLIMITED",
- "Безлимит",
- )
+ traffic_text = "Безлимит"
else:
- traffic_text = texts.t(
- "SUBSCRIPTION_TRAFFIC_OPTION_LIMITED",
- "{gb} ГБ",
- ).format(gb=gb)
+ traffic_text = f"{gb} ГБ"
- button_text = f"{emoji} {traffic_text}{suffix}"
+ button_text = f"{emoji} {traffic_text}{action_text}{price_text}"
buttons.append([
InlineKeyboardButton(text=button_text, callback_data=f"switch_traffic_{gb}")
@@ -5847,7 +5618,7 @@ def get_traffic_switch_keyboard(
buttons.append([
InlineKeyboardButton(
- text=texts.BACK,
+ text="⬅️ Назад" if language == "ru" else "⬅️ Back",
callback_data="subscription_settings"
)
])
@@ -5860,17 +5631,16 @@ def get_confirm_switch_traffic_keyboard(
price_difference: int,
language: str = "ru"
) -> InlineKeyboardMarkup:
- texts = get_texts(language)
return InlineKeyboardMarkup(inline_keyboard=[
[
InlineKeyboardButton(
- text=texts.CONFIRM_CHANGE_BUTTON,
+ text="✅ Подтвердить переключение",
callback_data=f"confirm_switch_traffic_{new_traffic_gb}_{price_difference}"
)
],
[
InlineKeyboardButton(
- text=texts.CANCEL,
+ text="❌ Отмена",
callback_data="subscription_settings"
)
]
diff --git a/app/localization/locales/en.json b/app/localization/locales/en.json
index 07019749..2cd0fec1 100644
--- a/app/localization/locales/en.json
+++ b/app/localization/locales/en.json
@@ -638,57 +638,5 @@
"ADMIN_SUPPORT_EDIT_DESCRIPTION_CONTACT_HINT": "Add to the description if needed.",
"ADMIN_SUPPORT_DESCRIPTION_UPDATED": "✅ Description updated.",
"ADMIN_SUPPORT_DESCRIPTION_SENT": "Description sent below",
- "ADMIN_SUPPORT_MESSAGE_DELETED": "Message deleted",
- "SUBSCRIPTION_SETTINGS_PAID_ONLY_ALERT": "⚠️ Settings are available only for paid subscriptions",
- "SUBSCRIPTION_SETTINGS_OVERVIEW": "⚙️ Subscription settings\n\n📊 Current parameters:\n🌐 Countries: {countries}\n📈 Traffic: {traffic}\n📱 Devices: {devices}\n\nChoose what you want to change:",
- "SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION": "⚠️ You don't have an active subscription!",
- "SUBSCRIPTION_AUTOPAY_STATUS_ENABLED": "enabled",
- "SUBSCRIPTION_AUTOPAY_STATUS_DISABLED": "disabled",
- "SUBSCRIPTION_AUTOPAY_MENU": "💳 Auto payment\n\n📊 Status: {status}\n⏰ Charge: {days} days before expiration\n\nChoose an action:",
- "SUBSCRIPTION_AUTOPAY_TOGGLED": "✅ Auto payment {status}!",
- "SUBSCRIPTION_AUTOPAY_SELECT_DAYS": "⏰ Choose how many days before expiration to charge:",
- "SUBSCRIPTION_AUTOPAY_DAYS_SET": "✅ Set to {days} days!",
- "SUBSCRIPTION_FEATURE_PAID_ONLY": "⚠️ This feature is only available for paid subscriptions",
- "SUBSCRIPTION_COUNTRIES_NONE": "No connected countries",
- "SUBSCRIPTION_COUNTRIES_MANAGEMENT_TITLE": "🌍 Manage subscription countries",
- "SUBSCRIPTION_COUNTRIES_CURRENT": "📋 Current countries ({count}):\n{countries}",
- "SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 How it works:\n✅ - country connected\n➕ - will be added (paid)\n➖ - will be removed (free)\n⚪️ - not selected",
- "SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ Important: Reconnecting removed countries will incur an additional charge!",
- "SUBSCRIPTION_COUNTRY_NOT_AVAILABLE": "❌ This server is not available for your promo group",
- "SUBSCRIPTION_CHANGE_DEVICES_TITLE": "📱 Change device limit",
- "SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Current limit: {count} devices",
- "SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Choose a new device limit:",
- "SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 Important:\n• Increasing — additional charge proportional to the remaining time\n• Decreasing — no refunds",
- "SUBSCRIPTION_CHANGE_DEVICES_NO_CHANGE": "ℹ️ The number of devices hasn't changed",
- "SUBSCRIPTION_CHANGE_DEVICES_MAX_LIMIT": "⚠️ Maximum device limit exceeded ({limit})",
- "SUBSCRIPTION_DEVICES_UUID_NOT_FOUND": "❌ User UUID not found",
- "SUBSCRIPTION_DEVICES_NONE": "ℹ️ You don't have any connected devices",
- "SUBSCRIPTION_DEVICES_FETCH_ERROR": "❌ Failed to retrieve device information",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TITLE": "🔄 Manage devices",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Total connected: {count} devices",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Page {current} of {total}",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "Connected devices:",
- "SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Unknown",
- "SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Unknown",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 Actions:\n• Select a device to reset\n• Or reset all devices at once",
- "SUBSCRIPTION_TRAFFIC_FIXED_ALERT": "⚠️ Traffic is fixed in the current mode",
- "SUBSCRIPTION_SWITCH_TRAFFIC_TITLE": "🔄 Switch traffic limit",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Current limit: {traffic}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Choose a new traffic limit:",
- "SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 Important:\n• Increasing — pay the difference\n• Decreasing — no refunds",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_CHANGE": "ℹ️ The traffic limit hasn't changed",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGE_ERROR": "⚠️ Failed to charge funds",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHANGE_LINE": "📊 Previously: {old} → Now: {new}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_INCREASE_TITLE": "✅ Traffic limit increased!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGED": "💰 Charged: {amount}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_DECREASE_TITLE": "✅ Traffic limit decreased!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_REFUND": "ℹ️ Refunds are not provided",
- "SUBSCRIPTION_TRAFFIC_PERIOD_SUFFIX": " for {months} mo.",
- "SUBSCRIPTION_TRAFFIC_OPTION_CURRENT": " (current)",
- "SUBSCRIPTION_TRAFFIC_OPTION_PRICE_UP": " (+{amount}{period})",
- "SUBSCRIPTION_TRAFFIC_OPTION_DISCOUNT": " (discount {percent}%: -{amount})",
- "SUBSCRIPTION_TRAFFIC_OPTION_NO_REFUND": " (no refund)",
- "SUBSCRIPTION_TRAFFIC_OPTION_FREE": " (free)",
- "SUBSCRIPTION_TRAFFIC_OPTION_UNLIMITED": "Unlimited",
- "SUBSCRIPTION_TRAFFIC_OPTION_LIMITED": "{gb} GB"
+ "ADMIN_SUPPORT_MESSAGE_DELETED": "Message deleted"
}
diff --git a/app/localization/locales/ru.json b/app/localization/locales/ru.json
index 3c62264c..3dabdd53 100644
--- a/app/localization/locales/ru.json
+++ b/app/localization/locales/ru.json
@@ -638,57 +638,5 @@
"ADMIN_SUPPORT_EDIT_DESCRIPTION_CONTACT_HINT": "Добавьте в описание при необходимости.",
"ADMIN_SUPPORT_DESCRIPTION_UPDATED": "✅ Описание обновлено.",
"ADMIN_SUPPORT_DESCRIPTION_SENT": "Текст отправлен ниже",
- "ADMIN_SUPPORT_MESSAGE_DELETED": "Сообщение удалено",
- "SUBSCRIPTION_SETTINGS_PAID_ONLY_ALERT": "⚠️ Настройки доступны только для платных подписок",
- "SUBSCRIPTION_SETTINGS_OVERVIEW": "⚙️ Настройки подписки\n\n📊 Текущие параметры:\n🌐 Стран: {countries}\n📈 Трафик: {traffic}\n📱 Устройства: {devices}\n\nВыберите что хотите изменить:",
- "SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION": "⚠️ У вас нет активной подписки!",
- "SUBSCRIPTION_AUTOPAY_STATUS_ENABLED": "включен",
- "SUBSCRIPTION_AUTOPAY_STATUS_DISABLED": "выключен",
- "SUBSCRIPTION_AUTOPAY_MENU": "💳 Автоплатеж\n\n📊 Статус: {status}\n⏰ Списание за: {days} дн. до окончания\n\nВыберите действие:",
- "SUBSCRIPTION_AUTOPAY_TOGGLED": "✅ Автоплатеж {status}!",
- "SUBSCRIPTION_AUTOPAY_SELECT_DAYS": "⏰ Выберите за сколько дней до окончания списывать средства:",
- "SUBSCRIPTION_AUTOPAY_DAYS_SET": "✅ Установлено {days} дней!",
- "SUBSCRIPTION_FEATURE_PAID_ONLY": "⚠ Эта функция доступна только для платных подписок",
- "SUBSCRIPTION_COUNTRIES_NONE": "Нет подключенных стран",
- "SUBSCRIPTION_COUNTRIES_MANAGEMENT_TITLE": "🌍 Управление странами подписки",
- "SUBSCRIPTION_COUNTRIES_CURRENT": "📋 Текущие страны ({count}):\n{countries}",
- "SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 Инструкция:\n✅ - страна подключена\n➕ - будет добавлена (платно)\n➖ - будет отключена (бесплатно)\n⚪️ - не выбрана",
- "SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ Важно: Повторное подключение отключенных стран будет платным!",
- "SUBSCRIPTION_COUNTRY_NOT_AVAILABLE": "❌ Сервер недоступен для вашей промогруппы",
- "SUBSCRIPTION_CHANGE_DEVICES_TITLE": "📱 Изменение количества устройств",
- "SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Текущий лимит: {count} устройств",
- "SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Выберите новое количество устройств:",
- "SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 Важно:\n• При увеличении - доплата пропорционально оставшемуся времени\n• При уменьшении - возврат средств не производится",
- "SUBSCRIPTION_CHANGE_DEVICES_NO_CHANGE": "ℹ️ Количество устройств не изменилось",
- "SUBSCRIPTION_CHANGE_DEVICES_MAX_LIMIT": "⚠️ Превышен максимальный лимит устройств ({limit})",
- "SUBSCRIPTION_DEVICES_UUID_NOT_FOUND": "❌ UUID пользователя не найден",
- "SUBSCRIPTION_DEVICES_NONE": "ℹ️ У вас нет подключенных устройств",
- "SUBSCRIPTION_DEVICES_FETCH_ERROR": "❌ Ошибка получения информации об устройствах",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TITLE": "🔄 Управление устройствами",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Всего подключено: {count} устройств",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Страница {current} из {total}",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "Подключенные устройства:",
- "SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Неизвестно",
- "SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Неизвестно",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 Действия:\n• Выберите устройство для сброса\n• Или сбросьте все устройства сразу",
- "SUBSCRIPTION_TRAFFIC_FIXED_ALERT": "⚠️ В текущем режиме трафик фиксированный",
- "SUBSCRIPTION_SWITCH_TRAFFIC_TITLE": "🔄 Переключение лимита трафика",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Текущий лимит: {traffic}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Выберите новый лимит трафика:",
- "SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 Важно:\n• При увеличении - доплата за разницу\n• При уменьшении - возврат средств не производится",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_CHANGE": "ℹ️ Лимит трафика не изменился",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGE_ERROR": "⚠️ Ошибка списания средств",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHANGE_LINE": "📊 Было: {old} → Стало: {new}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_INCREASE_TITLE": "✅ Лимит трафика увеличен!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGED": "💰 Списано: {amount}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_DECREASE_TITLE": "✅ Лимит трафика уменьшен!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_REFUND": "ℹ️ Возврат средств не производится",
- "SUBSCRIPTION_TRAFFIC_PERIOD_SUFFIX": " за {months} мес",
- "SUBSCRIPTION_TRAFFIC_OPTION_CURRENT": " (текущий)",
- "SUBSCRIPTION_TRAFFIC_OPTION_PRICE_UP": " (+{amount}{period})",
- "SUBSCRIPTION_TRAFFIC_OPTION_DISCOUNT": " (скидка {percent}%: -{amount})",
- "SUBSCRIPTION_TRAFFIC_OPTION_NO_REFUND": " (без возврата)",
- "SUBSCRIPTION_TRAFFIC_OPTION_FREE": " (бесплатно)",
- "SUBSCRIPTION_TRAFFIC_OPTION_UNLIMITED": "Безлимит",
- "SUBSCRIPTION_TRAFFIC_OPTION_LIMITED": "{gb} ГБ"
+ "ADMIN_SUPPORT_MESSAGE_DELETED": "Сообщение удалено"
}
diff --git a/locales/en.json b/locales/en.json
index c660b19d..d970b566 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -815,57 +815,5 @@
"ADMIN_BROADCAST_BUTTON_CONNECT": "🔗 Connect",
"ADMIN_BROADCAST_BUTTON_SUBSCRIPTION": "📱 Subscription",
"ADMIN_BROADCAST_BUTTON_SUPPORT": "🛠️ Support",
- "ADMIN_BROADCAST_BUTTON_HOME": "🏠 Main menu",
- "SUBSCRIPTION_SETTINGS_PAID_ONLY_ALERT": "⚠️ Settings are available only for paid subscriptions",
- "SUBSCRIPTION_SETTINGS_OVERVIEW": "⚙️ Subscription settings\n\n📊 Current parameters:\n🌐 Countries: {countries}\n📈 Traffic: {traffic}\n📱 Devices: {devices}\n\nChoose what you want to change:",
- "SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION": "⚠️ You don't have an active subscription!",
- "SUBSCRIPTION_AUTOPAY_STATUS_ENABLED": "enabled",
- "SUBSCRIPTION_AUTOPAY_STATUS_DISABLED": "disabled",
- "SUBSCRIPTION_AUTOPAY_MENU": "💳 Auto payment\n\n📊 Status: {status}\n⏰ Charge: {days} days before expiration\n\nChoose an action:",
- "SUBSCRIPTION_AUTOPAY_TOGGLED": "✅ Auto payment {status}!",
- "SUBSCRIPTION_AUTOPAY_SELECT_DAYS": "⏰ Choose how many days before expiration to charge:",
- "SUBSCRIPTION_AUTOPAY_DAYS_SET": "✅ Set to {days} days!",
- "SUBSCRIPTION_FEATURE_PAID_ONLY": "⚠️ This feature is only available for paid subscriptions",
- "SUBSCRIPTION_COUNTRIES_NONE": "No connected countries",
- "SUBSCRIPTION_COUNTRIES_MANAGEMENT_TITLE": "🌍 Manage subscription countries",
- "SUBSCRIPTION_COUNTRIES_CURRENT": "📋 Current countries ({count}):\n{countries}",
- "SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 How it works:\n✅ - country connected\n➕ - will be added (paid)\n➖ - will be removed (free)\n⚪️ - not selected",
- "SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ Important: Reconnecting removed countries will incur an additional charge!",
- "SUBSCRIPTION_COUNTRY_NOT_AVAILABLE": "❌ This server is not available for your promo group",
- "SUBSCRIPTION_CHANGE_DEVICES_TITLE": "📱 Change device limit",
- "SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Current limit: {count} devices",
- "SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Choose a new device limit:",
- "SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 Important:\n• Increasing — additional charge proportional to the remaining time\n• Decreasing — no refunds",
- "SUBSCRIPTION_CHANGE_DEVICES_NO_CHANGE": "ℹ️ The number of devices hasn't changed",
- "SUBSCRIPTION_CHANGE_DEVICES_MAX_LIMIT": "⚠️ Maximum device limit exceeded ({limit})",
- "SUBSCRIPTION_DEVICES_UUID_NOT_FOUND": "❌ User UUID not found",
- "SUBSCRIPTION_DEVICES_NONE": "ℹ️ You don't have any connected devices",
- "SUBSCRIPTION_DEVICES_FETCH_ERROR": "❌ Failed to retrieve device information",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TITLE": "🔄 Manage devices",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Total connected: {count} devices",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Page {current} of {total}",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "Connected devices:",
- "SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Unknown",
- "SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Unknown",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 Actions:\n• Select a device to reset\n• Or reset all devices at once",
- "SUBSCRIPTION_TRAFFIC_FIXED_ALERT": "⚠️ Traffic is fixed in the current mode",
- "SUBSCRIPTION_SWITCH_TRAFFIC_TITLE": "🔄 Switch traffic limit",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Current limit: {traffic}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Choose a new traffic limit:",
- "SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 Important:\n• Increasing — pay the difference\n• Decreasing — no refunds",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_CHANGE": "ℹ️ The traffic limit hasn't changed",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGE_ERROR": "⚠️ Failed to charge funds",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHANGE_LINE": "📊 Previously: {old} → Now: {new}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_INCREASE_TITLE": "✅ Traffic limit increased!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGED": "💰 Charged: {amount}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_DECREASE_TITLE": "✅ Traffic limit decreased!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_REFUND": "ℹ️ Refunds are not provided",
- "SUBSCRIPTION_TRAFFIC_PERIOD_SUFFIX": " for {months} mo.",
- "SUBSCRIPTION_TRAFFIC_OPTION_CURRENT": " (current)",
- "SUBSCRIPTION_TRAFFIC_OPTION_PRICE_UP": " (+{amount}{period})",
- "SUBSCRIPTION_TRAFFIC_OPTION_DISCOUNT": " (discount {percent}%: -{amount})",
- "SUBSCRIPTION_TRAFFIC_OPTION_NO_REFUND": " (no refund)",
- "SUBSCRIPTION_TRAFFIC_OPTION_FREE": " (free)",
- "SUBSCRIPTION_TRAFFIC_OPTION_UNLIMITED": "Unlimited",
- "SUBSCRIPTION_TRAFFIC_OPTION_LIMITED": "{gb} GB"
+ "ADMIN_BROADCAST_BUTTON_HOME": "🏠 Main menu"
}
diff --git a/locales/ru.json b/locales/ru.json
index ce189907..13c5c434 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -815,57 +815,5 @@
"ADMIN_BROADCAST_BUTTON_CONNECT": "🔗 Подключиться",
"ADMIN_BROADCAST_BUTTON_SUBSCRIPTION": "📱 Подписка",
"ADMIN_BROADCAST_BUTTON_SUPPORT": "🛠️ Техподдержка",
- "ADMIN_BROADCAST_BUTTON_HOME": "🏠 На главную",
- "SUBSCRIPTION_SETTINGS_PAID_ONLY_ALERT": "⚠️ Настройки доступны только для платных подписок",
- "SUBSCRIPTION_SETTINGS_OVERVIEW": "⚙️ Настройки подписки\n\n📊 Текущие параметры:\n🌐 Стран: {countries}\n📈 Трафик: {traffic}\n📱 Устройства: {devices}\n\nВыберите что хотите изменить:",
- "SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION": "⚠️ У вас нет активной подписки!",
- "SUBSCRIPTION_AUTOPAY_STATUS_ENABLED": "включен",
- "SUBSCRIPTION_AUTOPAY_STATUS_DISABLED": "выключен",
- "SUBSCRIPTION_AUTOPAY_MENU": "💳 Автоплатеж\n\n📊 Статус: {status}\n⏰ Списание за: {days} дн. до окончания\n\nВыберите действие:",
- "SUBSCRIPTION_AUTOPAY_TOGGLED": "✅ Автоплатеж {status}!",
- "SUBSCRIPTION_AUTOPAY_SELECT_DAYS": "⏰ Выберите за сколько дней до окончания списывать средства:",
- "SUBSCRIPTION_AUTOPAY_DAYS_SET": "✅ Установлено {days} дней!",
- "SUBSCRIPTION_FEATURE_PAID_ONLY": "⚠ Эта функция доступна только для платных подписок",
- "SUBSCRIPTION_COUNTRIES_NONE": "Нет подключенных стран",
- "SUBSCRIPTION_COUNTRIES_MANAGEMENT_TITLE": "🌍 Управление странами подписки",
- "SUBSCRIPTION_COUNTRIES_CURRENT": "📋 Текущие страны ({count}):\n{countries}",
- "SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 Инструкция:\n✅ - страна подключена\n➕ - будет добавлена (платно)\n➖ - будет отключена (бесплатно)\n⚪️ - не выбрана",
- "SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ Важно: Повторное подключение отключенных стран будет платным!",
- "SUBSCRIPTION_COUNTRY_NOT_AVAILABLE": "❌ Сервер недоступен для вашей промогруппы",
- "SUBSCRIPTION_CHANGE_DEVICES_TITLE": "📱 Изменение количества устройств",
- "SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Текущий лимит: {count} устройств",
- "SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Выберите новое количество устройств:",
- "SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 Важно:\n• При увеличении - доплата пропорционально оставшемуся времени\n• При уменьшении - возврат средств не производится",
- "SUBSCRIPTION_CHANGE_DEVICES_NO_CHANGE": "ℹ️ Количество устройств не изменилось",
- "SUBSCRIPTION_CHANGE_DEVICES_MAX_LIMIT": "⚠️ Превышен максимальный лимит устройств ({limit})",
- "SUBSCRIPTION_DEVICES_UUID_NOT_FOUND": "❌ UUID пользователя не найден",
- "SUBSCRIPTION_DEVICES_NONE": "ℹ️ У вас нет подключенных устройств",
- "SUBSCRIPTION_DEVICES_FETCH_ERROR": "❌ Ошибка получения информации об устройствах",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TITLE": "🔄 Управление устройствами",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Всего подключено: {count} устройств",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Страница {current} из {total}",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "Подключенные устройства:",
- "SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Неизвестно",
- "SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Неизвестно",
- "SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 Действия:\n• Выберите устройство для сброса\n• Или сбросьте все устройства сразу",
- "SUBSCRIPTION_TRAFFIC_FIXED_ALERT": "⚠️ В текущем режиме трафик фиксированный",
- "SUBSCRIPTION_SWITCH_TRAFFIC_TITLE": "🔄 Переключение лимита трафика",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Текущий лимит: {traffic}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Выберите новый лимит трафика:",
- "SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 Важно:\n• При увеличении - доплата за разницу\n• При уменьшении - возврат средств не производится",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_CHANGE": "ℹ️ Лимит трафика не изменился",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGE_ERROR": "⚠️ Ошибка списания средств",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHANGE_LINE": "📊 Было: {old} → Стало: {new}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_INCREASE_TITLE": "✅ Лимит трафика увеличен!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_CHARGED": "💰 Списано: {amount}",
- "SUBSCRIPTION_SWITCH_TRAFFIC_DECREASE_TITLE": "✅ Лимит трафика уменьшен!",
- "SUBSCRIPTION_SWITCH_TRAFFIC_NO_REFUND": "ℹ️ Возврат средств не производится",
- "SUBSCRIPTION_TRAFFIC_PERIOD_SUFFIX": " за {months} мес",
- "SUBSCRIPTION_TRAFFIC_OPTION_CURRENT": " (текущий)",
- "SUBSCRIPTION_TRAFFIC_OPTION_PRICE_UP": " (+{amount}{period})",
- "SUBSCRIPTION_TRAFFIC_OPTION_DISCOUNT": " (скидка {percent}%: -{amount})",
- "SUBSCRIPTION_TRAFFIC_OPTION_NO_REFUND": " (без возврата)",
- "SUBSCRIPTION_TRAFFIC_OPTION_FREE": " (бесплатно)",
- "SUBSCRIPTION_TRAFFIC_OPTION_UNLIMITED": "Безлимит",
- "SUBSCRIPTION_TRAFFIC_OPTION_LIMITED": "{gb} ГБ"
+ "ADMIN_BROADCAST_BUTTON_HOME": "🏠 На главную"
}