Revert "Add English localization for subscription management interfaces"

This commit is contained in:
Egor
2025-10-01 01:22:28 +03:00
committed by GitHub
parent be95d34122
commit 24e6d57273
5 changed files with 102 additions and 540 deletions

View File

@@ -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 = "🌍 <b>Управление странами подписки</b>\n\n"
text += f"📋 <b>Текущие страны ({len(current_countries)}):</b>\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",
"🌍 <b>Управление странами подписки</b>",
),
texts.t(
"SUBSCRIPTION_COUNTRIES_CURRENT",
"📋 <b>Текущие страны ({count}):</b>\n{countries}",
).format(count=len(current_countries), countries=countries_list),
texts.t(
"SUBSCRIPTION_COUNTRIES_INSTRUCTIONS",
"💡 <b>Инструкция:</b>\n"
"✅ - страна подключена\n"
" - будет добавлена (платно)\n"
" - будет отключена (бесплатно)\n"
"⚪ - не выбрана",
),
texts.t(
"SUBSCRIPTION_COUNTRIES_NOTICE",
"⚠️ <b>Важно:</b> Повторное подключение отключенных стран будет платным!",
),
]
)
text += "\n\n💡 <b>Инструкция:</b>\n"
text += "✅ - страна подключена\n"
text += " - будет добавлена (платно)\n"
text += " - будет отключена (бесплатно)\n"
text += "⚪ - не выбрана\n\n"
text += "⚠️ <b>Важно:</b> Повторное подключение отключенных стран будет платным!"
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",
"📱 <b>Изменение количества устройств</b>",
),
texts.t(
"SUBSCRIPTION_CHANGE_DEVICES_CURRENT",
"Текущий лимит: {count} устройств",
).format(count=current_devices),
texts.t(
"SUBSCRIPTION_CHANGE_DEVICES_PROMPT",
"Выберите новое количество устройств:",
),
"",
texts.t(
"SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT",
"💡 <b>Важно:</b>\n"
"• При увеличении - доплата пропорционально оставшемуся времени\n"
"• При уменьшении - возврат средств не производится",
),
]
),
f"📱 <b>Изменение количества устройств</b>\n\n"
f"Текущий лимит: {current_devices} устройств\n"
f"Выберите новое количество устройств:\n\n"
f"💡 <b>Важно:</b>\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",
"🔄 <b>Управление устройствами</b>",
),
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"🔄 <b>Управление устройствами</b>\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",
"<b>Подключенные устройства:</b>",
) + "\n"
devices_text += "<b>Подключенные устройства:</b>\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",
"💡 <b>Действия:</b>\n"
"• Выберите устройство для сброса\n"
"• Или сбросьте все устройства сразу",
)
devices_text += "\n💡 <b>Действия:</b>\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",
"⚙️ <b>Настройки подписки</b>\n\n"
"📊 <b>Текущие параметры:</b>\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"""
⚙️ <b>Настройки подписки</b>
📊 <b>Текущие параметры:</b>
🌐 Стран: {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",
"💳 <b>Автоплатеж</b>\n\n"
"📊 <b>Статус:</b> {status}\n"
"⏰ <b>Списание за:</b> {days} дн. до окончания\n\n"
"Выберите действие:",
).format(status=status, days=days)
text = f"💳 <b>Автоплатеж</b>\n\n"
text += f"📊 <b>Статус:</b> {status}\n"
text += f" <b>Списание за:</b> {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",
"🔄 <b>Переключение лимита трафика</b>",
),
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",
"💡 <b>Важно:</b>\n"
"• При увеличении - доплата за разницу\n"
"• При уменьшении - возврат средств не производится",
),
]
),
f"🔄 <b>Переключение лимита трафика</b>\n\n"
f"Текущий лимит: {texts.format_traffic(current_traffic)}\n"
f"Выберите новый лимит трафика:\n\n"
f"💡 <b>Важно:</b>\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"
)
]

View File

@@ -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": "⚙️ <b>Subscription settings</b>\n\n📊 <b>Current parameters:</b>\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": "💳 <b>Auto payment</b>\n\n📊 <b>Status:</b> {status}\n⏰ <b>Charge:</b> {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": "🌍 <b>Manage subscription countries</b>",
"SUBSCRIPTION_COUNTRIES_CURRENT": "📋 <b>Current countries ({count}):</b>\n{countries}",
"SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 <b>How it works:</b>\n✅ - country connected\n - will be added (paid)\n - will be removed (free)\n⚪ - not selected",
"SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ <b>Important:</b> 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": "📱 <b>Change device limit</b>",
"SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Current limit: {count} devices",
"SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Choose a new device limit:",
"SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 <b>Important:</b>\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": "🔄 <b>Manage devices</b>",
"SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Total connected: {count} devices",
"SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Page {current} of {total}",
"SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "<b>Connected devices:</b>",
"SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Unknown",
"SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Unknown",
"SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 <b>Actions:</b>\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": "🔄 <b>Switch traffic limit</b>",
"SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Current limit: {traffic}",
"SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Choose a new traffic limit:",
"SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 <b>Important:</b>\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"
}

View File

@@ -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": "⚙️ <b>Настройки подписки</b>\n\n📊 <b>Текущие параметры:</b>\n🌐 Стран: {countries}\n📈 Трафик: {traffic}\n📱 Устройства: {devices}\n\nВыберите что хотите изменить:",
"SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION": "⚠️ У вас нет активной подписки!",
"SUBSCRIPTION_AUTOPAY_STATUS_ENABLED": "включен",
"SUBSCRIPTION_AUTOPAY_STATUS_DISABLED": "выключен",
"SUBSCRIPTION_AUTOPAY_MENU": "💳 <b>Автоплатеж</b>\n\n📊 <b>Статус:</b> {status}\n⏰ <b>Списание за:</b> {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": "🌍 <b>Управление странами подписки</b>",
"SUBSCRIPTION_COUNTRIES_CURRENT": "📋 <b>Текущие страны ({count}):</b>\n{countries}",
"SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 <b>Инструкция:</b>\n✅ - страна подключена\n - будет добавлена (платно)\n - будет отключена (бесплатно)\n⚪ - не выбрана",
"SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ <b>Важно:</b> Повторное подключение отключенных стран будет платным!",
"SUBSCRIPTION_COUNTRY_NOT_AVAILABLE": "❌ Сервер недоступен для вашей промогруппы",
"SUBSCRIPTION_CHANGE_DEVICES_TITLE": "📱 <b>Изменение количества устройств</b>",
"SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Текущий лимит: {count} устройств",
"SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Выберите новое количество устройств:",
"SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 <b>Важно:</b>\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": "🔄 <b>Управление устройствами</b>",
"SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Всего подключено: {count} устройств",
"SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Страница {current} из {total}",
"SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "<b>Подключенные устройства:</b>",
"SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Неизвестно",
"SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Неизвестно",
"SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 <b>Действия:</b>\n• Выберите устройство для сброса\n• Или сбросьте все устройства сразу",
"SUBSCRIPTION_TRAFFIC_FIXED_ALERT": "⚠️ В текущем режиме трафик фиксированный",
"SUBSCRIPTION_SWITCH_TRAFFIC_TITLE": "🔄 <b>Переключение лимита трафика</b>",
"SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Текущий лимит: {traffic}",
"SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Выберите новый лимит трафика:",
"SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 <b>Важно:</b>\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": "Сообщение удалено"
}

View File

@@ -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": "⚙️ <b>Subscription settings</b>\n\n📊 <b>Current parameters:</b>\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": "💳 <b>Auto payment</b>\n\n📊 <b>Status:</b> {status}\n⏰ <b>Charge:</b> {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": "🌍 <b>Manage subscription countries</b>",
"SUBSCRIPTION_COUNTRIES_CURRENT": "📋 <b>Current countries ({count}):</b>\n{countries}",
"SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 <b>How it works:</b>\n✅ - country connected\n - will be added (paid)\n - will be removed (free)\n⚪ - not selected",
"SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ <b>Important:</b> 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": "📱 <b>Change device limit</b>",
"SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Current limit: {count} devices",
"SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Choose a new device limit:",
"SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 <b>Important:</b>\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": "🔄 <b>Manage devices</b>",
"SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Total connected: {count} devices",
"SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Page {current} of {total}",
"SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "<b>Connected devices:</b>",
"SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Unknown",
"SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Unknown",
"SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 <b>Actions:</b>\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": "🔄 <b>Switch traffic limit</b>",
"SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Current limit: {traffic}",
"SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Choose a new traffic limit:",
"SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 <b>Important:</b>\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"
}

View File

@@ -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": "⚙️ <b>Настройки подписки</b>\n\n📊 <b>Текущие параметры:</b>\n🌐 Стран: {countries}\n📈 Трафик: {traffic}\n📱 Устройства: {devices}\n\nВыберите что хотите изменить:",
"SUBSCRIPTION_AUTOPAY_NO_SUBSCRIPTION": "⚠️ У вас нет активной подписки!",
"SUBSCRIPTION_AUTOPAY_STATUS_ENABLED": "включен",
"SUBSCRIPTION_AUTOPAY_STATUS_DISABLED": "выключен",
"SUBSCRIPTION_AUTOPAY_MENU": "💳 <b>Автоплатеж</b>\n\n📊 <b>Статус:</b> {status}\n⏰ <b>Списание за:</b> {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": "🌍 <b>Управление странами подписки</b>",
"SUBSCRIPTION_COUNTRIES_CURRENT": "📋 <b>Текущие страны ({count}):</b>\n{countries}",
"SUBSCRIPTION_COUNTRIES_INSTRUCTIONS": "💡 <b>Инструкция:</b>\n✅ - страна подключена\n - будет добавлена (платно)\n - будет отключена (бесплатно)\n⚪ - не выбрана",
"SUBSCRIPTION_COUNTRIES_NOTICE": "⚠️ <b>Важно:</b> Повторное подключение отключенных стран будет платным!",
"SUBSCRIPTION_COUNTRY_NOT_AVAILABLE": "❌ Сервер недоступен для вашей промогруппы",
"SUBSCRIPTION_CHANGE_DEVICES_TITLE": "📱 <b>Изменение количества устройств</b>",
"SUBSCRIPTION_CHANGE_DEVICES_CURRENT": "Текущий лимит: {count} устройств",
"SUBSCRIPTION_CHANGE_DEVICES_PROMPT": "Выберите новое количество устройств:",
"SUBSCRIPTION_CHANGE_DEVICES_IMPORTANT": "💡 <b>Важно:</b>\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": "🔄 <b>Управление устройствами</b>",
"SUBSCRIPTION_DEVICES_MANAGEMENT_TOTAL": "📊 Всего подключено: {count} устройств",
"SUBSCRIPTION_DEVICES_MANAGEMENT_PAGE": "📄 Страница {current} из {total}",
"SUBSCRIPTION_DEVICES_MANAGEMENT_LIST_HEADER": "<b>Подключенные устройства:</b>",
"SUBSCRIPTION_DEVICES_UNKNOWN_PLATFORM": "Неизвестно",
"SUBSCRIPTION_DEVICES_UNKNOWN_MODEL": "Неизвестно",
"SUBSCRIPTION_DEVICES_MANAGEMENT_ACTIONS": "💡 <b>Действия:</b>\n• Выберите устройство для сброса\n• Или сбросьте все устройства сразу",
"SUBSCRIPTION_TRAFFIC_FIXED_ALERT": "⚠️ В текущем режиме трафик фиксированный",
"SUBSCRIPTION_SWITCH_TRAFFIC_TITLE": "🔄 <b>Переключение лимита трафика</b>",
"SUBSCRIPTION_SWITCH_TRAFFIC_CURRENT": "Текущий лимит: {traffic}",
"SUBSCRIPTION_SWITCH_TRAFFIC_PROMPT": "Выберите новый лимит трафика:",
"SUBSCRIPTION_SWITCH_TRAFFIC_IMPORTANT": "💡 <b>Важно:</b>\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": "🏠 На главную"
}