mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-29 18:13:47 +00:00
feat: публичные лендинг-страницы для быстрой покупки VPN-подписок
- QuickPurchase: публичная страница покупки с выбором тарифа/периода/оплаты - PurchaseSuccess: статус покупки с поллингом и копированием ссылки - AdminLandings: управление лендингами (создание, сортировка, удаление) - AdminLandingEditor: полнофункциональный редактор лендинга - API-клиент landings.ts для всех эндпоинтов - Роутинг /buy/:slug и /buy/success/:token - Локализация ru/en/zh/fa для всех текстов лендинга - Санитизация HTML/CSS, rate limit защита, DOMPurify
This commit is contained in:
@@ -247,13 +247,13 @@
|
||||
"connectDevice": "Подключить устройство",
|
||||
"devicesConnected": "{{count}} подключено",
|
||||
"devicesOfMax": "{{used}} из {{max}} подключено",
|
||||
"devicesConnectedUnlimited": "{{used}} подключено · без лимита",
|
||||
"devicesShort": "устр.",
|
||||
"trafficUsage": "{{used}} / {{limit}} ГБ",
|
||||
"trafficUsageTitle": "Расход трафика",
|
||||
"usedTraffic": "использовано {{amount}}",
|
||||
"usedSuffix": "израсходовано",
|
||||
"unlimited": "Безлимит",
|
||||
"unlimitedTraffic": "Безлимитный трафик",
|
||||
"tariff": "Тариф",
|
||||
"validUntil": "до {{date}}",
|
||||
"remaining": "Осталось",
|
||||
@@ -1064,7 +1064,8 @@
|
||||
"roleAssign": "Назначение ролей",
|
||||
"policies": "Политики доступа",
|
||||
"auditLog": "Журнал аудита",
|
||||
"salesStats": "Статистика продаж"
|
||||
"salesStats": "Статистика продаж",
|
||||
"landings": "Лендинги"
|
||||
},
|
||||
"panel": {
|
||||
"title": "Панель администратора",
|
||||
@@ -1097,7 +1098,8 @@
|
||||
"roleAssignDesc": "Назначение и отзыв ролей пользователей",
|
||||
"policiesDesc": "Настройка политик контроля доступа ABAC",
|
||||
"auditLogDesc": "Просмотр активности системы и истории доступа",
|
||||
"salesStatsDesc": "Аналитика продаж и тренды"
|
||||
"salesStatsDesc": "Аналитика продаж и тренды",
|
||||
"landingsDesc": "Страницы быстрой покупки"
|
||||
},
|
||||
"salesStats": {
|
||||
"title": "Статистика продаж",
|
||||
@@ -3693,6 +3695,51 @@
|
||||
"loadFailed": "Не удалось загрузить журнал аудита",
|
||||
"retry": "Попробовать снова"
|
||||
}
|
||||
},
|
||||
"landings": {
|
||||
"title": "Лендинги",
|
||||
"create": "Создать лендинг",
|
||||
"edit": "Редактировать",
|
||||
"slug": "URL-идентификатор",
|
||||
"slugHint": "Латиница, цифры и дефис",
|
||||
"pageTitle": "Заголовок",
|
||||
"subtitle": "Подзаголовок",
|
||||
"footerText": "Текст внизу (HTML)",
|
||||
"features": "Преимущества",
|
||||
"addFeature": "Добавить",
|
||||
"featureIcon": "Иконка",
|
||||
"featureTitle": "Заголовок",
|
||||
"featureDesc": "Описание",
|
||||
"tariffs": "Тарифы",
|
||||
"selectTariffs": "Выберите тарифы",
|
||||
"periods": "Периоды",
|
||||
"paymentMethods": "Способы оплаты",
|
||||
"addMethod": "Добавить метод",
|
||||
"methodId": "ID метода",
|
||||
"methodName": "Название",
|
||||
"methodDesc": "Описание",
|
||||
"methodIcon": "URL иконки",
|
||||
"gifts": "Подарки",
|
||||
"giftEnabled": "Покупка в подарок",
|
||||
"customCss": "CSS",
|
||||
"seo": "SEO",
|
||||
"metaTitle": "Meta Title",
|
||||
"metaDesc": "Meta Description",
|
||||
"active": "Активен",
|
||||
"inactive": "Неактивен",
|
||||
"purchases": "покупок",
|
||||
"copyUrl": "Скопировать URL",
|
||||
"urlCopied": "URL скопирован",
|
||||
"deleteConfirm": "Удалить лендинг «{{title}}»?",
|
||||
"created": "Лендинг создан",
|
||||
"updated": "Лендинг обновлён",
|
||||
"deleted": "Лендинг удалён",
|
||||
"saveOrder": "Сохранить порядок",
|
||||
"orderSaved": "Порядок сохранён",
|
||||
"general": "Основное",
|
||||
"content": "Контент",
|
||||
"save": "Сохранить",
|
||||
"back": "Назад"
|
||||
}
|
||||
},
|
||||
"adminUpdates": {
|
||||
@@ -4428,5 +4475,44 @@
|
||||
"error": "Ошибка при объединении. Попробуйте позже.",
|
||||
"expiresIn": "Действует ещё {{minutes}}",
|
||||
"merging": "Объединение..."
|
||||
},
|
||||
"landing": {
|
||||
"notFound": "Страница не найдена",
|
||||
"forMe": "Для себя",
|
||||
"asGift": "В подарок",
|
||||
"contactLabel": "Ваш email или @username Telegram",
|
||||
"yourContact": "Ваш email или @username",
|
||||
"contactPlaceholder": "email@example.com или @username",
|
||||
"contactHint": "Введите email или Telegram @username",
|
||||
"recipientLabel": "Кому подарить",
|
||||
"recipientPlaceholder": "email или @username получателя",
|
||||
"giftMessageLabel": "Поздравление (необязательно)",
|
||||
"giftMessagePlaceholder": "Напишите поздравление...",
|
||||
"chooseTariff": "Выберите тариф",
|
||||
"devices": "устройств",
|
||||
"paymentMethod": "Способ оплаты",
|
||||
"processing": "Обработка...",
|
||||
"payButton": "Оплатить {{price}}",
|
||||
"accessFor": "Доступ на {{period}}",
|
||||
"purchaseError": "Ошибка при создании оплаты",
|
||||
"purchaseNotFound": "Покупка не найдена",
|
||||
"awaitingPayment": "Ожидание оплаты",
|
||||
"awaitingPaymentDesc": "Завершите оплату в открывшемся окне",
|
||||
"purchaseSuccess": "Оплата прошла успешно!",
|
||||
"keySentTo": "Ключ подписки отправлен на {{contact}}",
|
||||
"giftSentTo": "Подарок отправлен на {{contact}}",
|
||||
"purchaseFailed": "Ошибка оплаты",
|
||||
"purchaseFailedDesc": "Оплата не прошла. Попробуйте снова.",
|
||||
"subscriptionLink": "Ссылка подписки",
|
||||
"daysAccess": "дней доступа",
|
||||
"error": "Ошибка",
|
||||
"gb": "ГБ",
|
||||
"selectedTariff": "Тариф",
|
||||
"period": "Период",
|
||||
"total": "Итого",
|
||||
"pay": "Оплатить",
|
||||
"choosePeriod": "Выберите период",
|
||||
"copied": "Скопировано!",
|
||||
"copyLink": "Скопировать ссылку"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user