Issue invite configs as subscription URLs with redeem-based lifetime.

Admin picks inbound once, sets duration in days from Get config, and configures the 3x-ui /sub base URL.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
orohi
2026-07-26 01:34:40 +03:00
co-authored by Cursor
parent 7b3d8aac34
commit 7d7094bc38
13 changed files with 347 additions and 148 deletions
+16
View File
@@ -215,6 +215,20 @@
"invite_user_required": "Select a user to store configs under",
"invite_password_label": "Password (optional)",
"invite_expires_label": "Expires at (optional)",
"invite_duration_label": "Config lifetime (days)",
"invite_duration_hint": "Starts when the user clicks Get config. 0 = no expiry.",
"invite_duration_short": "Lifetime",
"invite_duration_starts_hint": "After you get a config it will work for {} day(s)",
"invite_config_expires_at": "Config valid until: {}",
"invite_inbound_hint": "Choose the VLESS inbound once — all configs from this link use it",
"invite_inbound_loading": "Loading inbounds…",
"invite_inbound_empty": "No VLESS inbounds found",
"invite_inbound_need_xui": "Configure 3x-ui in Settings first",
"invite_inbound_required": "Select a VLESS inbound",
"invite_sub_url_missing_title": "Subscription URL is not set",
"invite_sub_url_missing_hint": "In Settings → 3x-ui set Subscription URL base so invite links issue /sub/… configs.",
"invite_sub_tab": "Subscription",
"days_short": "d",
"invite_clear_expires": "Remove expiration",
"invite_note_label": "Note (admin only)",
"invite_note_placeholder": "Internal comment",
@@ -277,6 +291,8 @@
"sync_hint": "Users will be created, disabled, and deleted automatically based on Remnawave data",
"xui_url_label": "3x-ui URL",
"xui_url_hint": "Include scheme, port and webBasePath if configured (example: https://host:2053/secret)",
"xui_sub_url_label": "Subscription URL base",
"xui_sub_url_hint": "Public /sub base without trailing slash (example: https://host:2096/sub). Invite configs are issued as subscription links.",
"xui_api_token_label": "API Token (preferred)",
"xui_api_token_placeholder": "Settings → Security → API Token",
"xui_api_token_hint": "If set, username/password login is skipped",
+16
View File
@@ -213,6 +213,20 @@
"invite_user_required": "یک کاربر انتخاب کنید",
"invite_password_label": "رمز عبور (اختیاری)",
"invite_expires_label": "انقضا (اختیاری)",
"invite_duration_label": "مدت کانفیگ (روز)",
"invite_duration_hint": "از لحظه کلیک روی دریافت کانفیگ شروع می‌شود. 0 = بدون انقضا.",
"invite_duration_short": "مدت",
"invite_duration_starts_hint": "پس از دریافت، کانفیگ {} روز معتبر است",
"invite_config_expires_at": "اعتبار تا: {}",
"invite_inbound_hint": "یک‌بار inbound مورد نیاز VLESS را انتخاب کنید",
"invite_inbound_loading": "در حال بارگذاری…",
"invite_inbound_empty": "inbound VLESS یافت نشد",
"invite_inbound_need_xui": "ابتدا 3x-ui را در تنظیمات پیکربندی کنید",
"invite_inbound_required": "یک inbound VLESS انتخاب کنید",
"invite_sub_url_missing_title": "آدرس اشتراک تنظیم نشده",
"invite_sub_url_missing_hint": "در تنظیمات → 3x-ui پایه /sub را وارد کنید.",
"invite_sub_tab": "اشتراک",
"days_short": "روز",
"invite_clear_expires": "حذف تاریخ انقضا",
"invite_note_label": "یادداشت (فقط ادمین)",
"invite_note_placeholder": "توضیح داخلی",
@@ -275,6 +289,8 @@
"sync_hint": "کاربران طبق داده‌های Remnawave به‌طور خودکار مدیریت می‌شوند",
"xui_url_label": "آدرس 3x-ui",
"xui_url_hint": "شامل پروتکل، پورت و webBasePath در صورت وجود",
"xui_sub_url_label": "آدرس پایه اشتراک",
"xui_sub_url_hint": "پایه عمومی /sub بدون اسلش پایانی (مثال: https://host:2096/sub).",
"xui_api_token_label": "توکن API (ترجیحی)",
"xui_api_token_placeholder": "Settings → Security → API Token",
"xui_api_token_hint": "در صورت تنظیم، ورود با نام کاربری/رمز رد می‌شود",
+16
View File
@@ -213,6 +213,20 @@
"invite_user_required": "Choisissez un utilisateur",
"invite_password_label": "Mot de passe (optionnel)",
"invite_expires_label": "Expiration (optionnel)",
"invite_duration_label": "Durée du config (jours)",
"invite_duration_hint": "Commence quand l'utilisateur clique Obtenir. 0 = illimité.",
"invite_duration_short": "Durée",
"invite_duration_starts_hint": "Après obtention, valable {} jour(s)",
"invite_config_expires_at": "Valable jusqu'au : {}",
"invite_inbound_hint": "Choisissez l'inbound VLESS une fois",
"invite_inbound_loading": "Chargement…",
"invite_inbound_empty": "Aucun inbound VLESS",
"invite_inbound_need_xui": "Configurez 3x-ui d'abord",
"invite_inbound_required": "Sélectionnez un inbound VLESS",
"invite_sub_url_missing_title": "URL d'abonnement manquante",
"invite_sub_url_missing_hint": "Dans Paramètres → 3x-ui, définissez l'URL de base /sub.",
"invite_sub_tab": "Abonnement",
"days_short": "j",
"invite_clear_expires": "Retirer l'expiration",
"invite_note_label": "Note (admin)",
"invite_note_placeholder": "Commentaire interne",
@@ -275,6 +289,8 @@
"sync_hint": "Synchro automatique avec Remnawave",
"xui_url_label": "URL 3x-ui",
"xui_url_hint": "Inclure le schéma, le port et webBasePath si configuré",
"xui_sub_url_label": "URL de base d'abonnement",
"xui_sub_url_hint": "Base /sub publique sans slash final (ex: https://host:2096/sub).",
"xui_api_token_label": "Jeton API (préféré)",
"xui_api_token_placeholder": "Settings → Security → API Token",
"xui_api_token_hint": "Si défini, le login/mot de passe est ignoré",
+16
View File
@@ -215,6 +215,20 @@
"invite_user_required": "Выберите пользователя для хранения конфигов",
"invite_password_label": "Пароль (опционально)",
"invite_expires_label": "Срок действия (опционально)",
"invite_duration_label": "Срок конфига (дни)",
"invite_duration_hint": "Отсчёт начинается, когда пользователь нажал «Получить конфиг». 0 = без срока.",
"invite_duration_short": "Срок",
"invite_duration_starts_hint": "После получения конфиг будет действовать {} дн.",
"invite_config_expires_at": "Конфиг действует до: {}",
"invite_inbound_hint": "Укажите нужный VLESS inbound один раз — все конфиги с этой ссылки пойдут в него",
"invite_inbound_loading": "Загрузка inbound…",
"invite_inbound_empty": "VLESS inbound не найдены",
"invite_inbound_need_xui": "Сначала настройте 3x-ui в Настройках",
"invite_inbound_required": "Выберите VLESS inbound",
"invite_sub_url_missing_title": "Не задан URL подписки",
"invite_sub_url_missing_hint": "В Настройки → 3x-ui укажите «Базовый URL подписки», чтобы ссылки выдавали /sub/… конфиги.",
"invite_sub_tab": "Подписка",
"days_short": "дн",
"invite_clear_expires": "Убрать срок действия",
"invite_note_label": "Заметка (только админ)",
"invite_note_placeholder": "Внутренний комментарий",
@@ -277,6 +291,8 @@
"sync_hint": "Пользователи будут создаваться, отключаться и удаляться автоматически на основе данных из Remnawave",
"xui_url_label": "URL 3x-ui",
"xui_url_hint": "Укажите схему, порт и webBasePath при наличии (пример: https://host:2053/secret)",
"xui_sub_url_label": "Базовый URL подписки",
"xui_sub_url_hint": "Публичный /sub без слэша в конце (пример: https://host:2096/sub). Конфиги по ссылкам выдаются как subscription URL.",
"xui_api_token_label": "API Token (предпочтительно)",
"xui_api_token_placeholder": "Settings → Security → API Token",
"xui_api_token_hint": "Если задан, вход по логину/паролю не используется",
+16
View File
@@ -213,6 +213,20 @@
"invite_user_required": "请选择用户",
"invite_password_label": "密码(可选)",
"invite_expires_label": "过期时间(可选)",
"invite_duration_label": "配置有效期(天)",
"invite_duration_hint": "从用户点击获取配置时开始计时。0 = 不过期。",
"invite_duration_short": "有效期",
"invite_duration_starts_hint": "获取后配置将有效 {} 天",
"invite_config_expires_at": "配置有效至:{}",
"invite_inbound_hint": "一次性选择所需的 VLESS 入站",
"invite_inbound_loading": "加载入站中…",
"invite_inbound_empty": "未找到 VLESS 入站",
"invite_inbound_need_xui": "请先在设置中配置 3x-ui",
"invite_inbound_required": "请选择 VLESS 入站",
"invite_sub_url_missing_title": "未设置订阅 URL",
"invite_sub_url_missing_hint": "在 设置 → 3x-ui 中填写订阅基础 URL,以便发放 /sub/… 配置。",
"invite_sub_tab": "订阅",
"days_short": "天",
"invite_clear_expires": "清除过期时间",
"invite_note_label": "备注(仅管理员)",
"invite_note_placeholder": "内部备注",
@@ -275,6 +289,8 @@
"sync_hint": "将根据 Remnawave 数据自动创建、禁用和删除用户",
"xui_url_label": "3x-ui 地址",
"xui_url_hint": "包含协议、端口和 webBasePath(如有)",
"xui_sub_url_label": "订阅基础 URL",
"xui_sub_url_hint": "公共 /sub 基础地址,末尾不要斜杠(如 https://host:2096/sub)。",
"xui_api_token_label": "API Token(推荐)",
"xui_api_token_placeholder": "Settings → Security → API Token",
"xui_api_token_hint": "若已设置,将跳过用户名/密码登录",