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": "🏠 На главную" }