diff --git a/frontend/src/lib/webapp/stores/accountStore.js b/frontend/src/lib/webapp/stores/accountStore.js index 421d5bb..6baa02f 100644 --- a/frontend/src/lib/webapp/stores/accountStore.js +++ b/frontend/src/lib/webapp/stores/accountStore.js @@ -361,7 +361,7 @@ export function createAccountStore({ if (typeof updateLocalData === "function") { updateLocalData(normalize(response.language || language)); } - await loadData(); + await loadData({ fresh: true }); } catch { showToast(t("wa_settings_language_update_failed")); } finally { diff --git a/locales/en.json b/locales/en.json index 08f3a89..32dbb92 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1802,5 +1802,160 @@ "admin_translations_audience_user": "User-visible", "admin_translations_audience_internal": "Admin/internal", "admin_translations_audience_user_hint": "Mini App, bot, payment, subscription, support, and auth copy.", - "admin_translations_audience_internal_hint": "Admin panel, logs, sync statuses, and service notifications." + "admin_translations_audience_internal_hint": "Admin panel, logs, sync statuses, and service notifications.", + "admin_actions": "Actions", + "admin_ad_created": "Campaign created", + "admin_ad_deleted": "Campaign deleted", + "admin_appearance_brand_sub": "File, URL, or confirmed emoji logo", + "admin_appearance_brand_title": "Logo", + "admin_appearance_emoji_font": "Emoji font", + "admin_appearance_favicon_upload_failed": "Failed to upload favicon", + "admin_appearance_favicon_upload_file": "Upload favicon", + "admin_appearance_favicon_upload_url": "From URL", + "admin_appearance_favicon_uploaded_pending": "Favicon uploaded and applied.", + "admin_appearance_logo_upload_failed": "Failed to upload logo", + "admin_appearance_logo_upload_file": "Upload file", + "admin_appearance_logo_upload_url": "From URL", + "admin_appearance_logo_uploaded_pending": "Logo uploaded and applied.", + "admin_appearance_preview_theme": "Preview", + "admin_appearance_theme_accent_empty": "Not set", + "admin_appearance_theme_accent_placeholder": "Not set", + "admin_appearance_theme_home_logo_scale": "Home and login logo", + "admin_appearance_themes_sub": "Global theme, accent color, and preview", + "admin_appearance_themes_title": "Themes", + "admin_appearance_use_custom_favicon": "Use a separate favicon", + "admin_appearance_use_emoji_logo": "Use emoji logo", + "admin_backups_create": "Create backup", + "admin_backups_create_done": "Backup created", + "admin_backups_create_failed": "Failed to create backup", + "admin_backups_creating": "Creating...", + "admin_backups_pagination_meta": "{from}-{to} / {total}", + "admin_btn_add_squad": "Add squad", + "admin_btn_ban": "Block user", + "admin_btn_cancel": "Cancel", + "admin_btn_confirm_delete": "Confirm deletion", + "admin_btn_confirm_send": "Confirm send", + "admin_btn_delete_account": "Delete account", + "admin_btn_preview_tg": "Preview in Telegram", + "admin_btn_save_tariff": "Save tariff", + "admin_btn_send_msg": "Send message", + "admin_btn_unban": "Unblock user", + "admin_days_short": "d", + "admin_load_failed": "Failed to load data", + "admin_loading_squads": "Loading list from panel...", + "admin_message_preview_failed": "Failed to send preview", + "admin_message_preview_sent": "Preview sent to Telegram", + "admin_nav_appearance": "Appearance", + "admin_nav_title": "Admin panel", + "admin_no": "No", + "admin_pagination_next": "Next", + "admin_pagination_prev": "Back", + "admin_premium_override_invalid_bonus": "Invalid GB value", + "admin_regular_override_invalid_bonus": "Invalid main traffic GB value", + "admin_regular_override_saved": "Main traffic override saved", + "admin_section_appearance_subtitle": "Logo, themes, and Mini App accent colors", + "admin_section_appearance_title": "Appearance", + "admin_select": "Select", + "admin_send": "Send", + "admin_settings_saved": "Settings saved", + "admin_status_banned": "Banned", + "admin_status_subscription": "Subscription", + "admin_support_send_failed": "Send failed", + "admin_tariff_btn_package_rub": "Package ₽", + "admin_tariff_btn_package_stars": "Package ⭐", + "admin_tariff_btn_period": "Period", + "admin_tariff_create_subtitle": "The catalog will be saved to JSON after confirmation", + "admin_tariff_create_title": "New tariff", + "admin_tariff_default_updated": "Default tariff updated", + "admin_tariff_delete_subtitle": "Tariff {key} will disappear from the sales catalog.", + "admin_tariff_delete_title": "Delete tariff?", + "admin_tariff_deleted": "Tariff deleted", + "admin_tariff_edit_title": "Tariff settings", + "admin_tariff_enabled_hint": "A disabled tariff is hidden from the bot/Mini App, but active subscriptions on it keep working", + "admin_tariff_error_delete_last_enabled": "Cannot delete the last enabled tariff", + "admin_tariff_error_key_exists": "A tariff with this key already exists", + "admin_tariff_error_key_required": "Enter a tariff key", + "admin_tariff_error_min_enabled": "At least one tariff must be enabled", + "admin_tariff_hidden": "Tariff is hidden from users", + "admin_tariff_hint_conversion": "This rate converts the remaining subscription period to gigabytes when a user switches from Period to Traffic", + "admin_tariff_hint_hwid": "How many devices can use the subscription at the same time. Empty means use the .env value; 0 means unlimited", + "admin_tariff_hint_key": "Latin characters, no spaces. Used in payments and subscriptions; changing it after publication is not recommended", + "admin_tariff_hint_premium_name_en": "Optional for the English interface.", + "admin_tariff_hint_premium_name_ru": "This text replaces \"Premium servers\" in the account, top-ups, and limit cards.", + "admin_tariff_hint_premium_squads": "Remnawave squads available only to owners of this tariff. Traffic is counted by their accessible nodes", + "admin_tariff_hint_premium_traffic_limit": "How many GB through premium squads are included each month. 0 or empty means there is no separate premium limit", + "admin_tariff_hint_squads": "Remnawave squads this tariff connects the user to. Select one or more", + "admin_tariff_hint_traffic_limit": "How many GB are included every month. 0 means unlimited traffic. Extra packages can be sold on the Top-ups tab", + "admin_tariff_hwid_packages_subtitle": "Extends the limit from the General tab. Each row is a \"+N devices for N currency units\" package", + "admin_tariff_hwid_packages_title": "Extra device packages (HWID)", + "admin_tariff_label_conversion": "Conversion rate, ₽ per 1 GB", + "admin_tariff_label_desc_en": "Description - EN", + "admin_tariff_label_desc_ru": "Description - RU", + "admin_tariff_label_hwid": "Device limit (HWID)", + "admin_tariff_label_key": "Tariff key", + "admin_tariff_label_model": "Billing model", + "admin_tariff_label_name_en": "Name - EN", + "admin_tariff_label_name_ru": "Name - RU", + "admin_tariff_label_premium_name_en": "Premium section name, EN", + "admin_tariff_label_premium_name_ru": "Premium section name, RU", + "admin_tariff_label_premium_traffic_limit": "Monthly premium traffic limit, GB", + "admin_tariff_label_squads": "Base Internal Squads", + "admin_tariff_label_traffic_limit": "Monthly traffic limit, GB", + "admin_tariff_model_period_desc": "the user buys a fixed period (1/3/12 months, etc.)", + "admin_tariff_model_period_label": "Period", + "admin_tariff_model_traffic_desc": "the user buys gigabyte packages at a fixed price per GB", + "admin_tariff_model_traffic_label": "Traffic", + "admin_tariff_placeholder_desc_ru": "Base server pool", + "admin_tariff_placeholder_name_ru": "Standard", + "admin_tariff_placeholder_premium_name_ru": "Premium servers", + "admin_tariff_premium_head": "Premium access and a separate traffic counter", + "admin_tariff_premium_subhead": "Premium squads give the user access to faster/premium nodes; their traffic is counted separately from main traffic so it can be limited or sold separately", + "admin_tariff_premium_topup_subtitle": "Packages that extend the monthly premium limit when the user runs out", + "admin_tariff_premium_topup_title": "Premium traffic top-up", + "admin_tariff_pricing_empty": "Add at least one period so the tariff appears in the storefront.", + "admin_tariff_pricing_period_subtitle": "Each row is a separate storefront option: how many months the user pays for and how much it costs", + "admin_tariff_pricing_period_title": "Subscription periods and prices", + "admin_tariff_pricing_traffic_subtitle": "Base storefront for the traffic model. Each row is an \"N gigabytes for N currency units\" package", + "admin_tariff_pricing_traffic_title": "Traffic packages", + "admin_tariff_saved": "Tariff saved", + "admin_tariff_status_updated": "Tariff status updated", + "admin_tariff_topup_subtitle": "When a user runs out of the monthly limit, they can buy an extra package without changing the subscription term", + "admin_tariff_topup_title": "Traffic top-up over the monthly limit", + "admin_tariff_topup_traffic_hint": "For the traffic model, separate top-ups are not needed: packages configured on the Prices tab are the top-ups users can buy again as they run out.", + "admin_tariff_visible": "Tariff is visible in the storefront", + "admin_tariffs_save_failed": "Failed to save tariffs", + "admin_tariffs_saved": "Tariffs saved", + "admin_tariffs_title": "Tariff catalog", + "admin_user_label_ref_bot": "Referral link (bot)", + "admin_user_label_ref_web": "Referral link (web)", + "admin_user_override_unlimited_short": "Unlimited", + "admin_user_premium_override_bonus": "Extra premium traffic, GB", + "admin_user_premium_override_bonus_hint": "", + "admin_user_premium_override_card_hint": "Unlimited access and extra volume for premium squads on top of the tariff.", + "admin_user_premium_override_card_title": "Premium traffic", + "admin_user_premium_override_save": "Save", + "admin_user_premium_override_status_bonus": "Premium now: +{gb} GB", + "admin_user_premium_override_status_none": "Premium override is not set", + "admin_user_premium_override_status_unlimited": "Current: unlimited", + "admin_user_premium_unlimited_hint": "Unlimited (admin override)", + "admin_user_premium_unlimited_value": "∞ (used {used})", + "admin_user_regular_override_bonus": "Extra main traffic, GB", + "admin_user_regular_override_bonus_hint": "", + "admin_user_regular_override_card_hint": "Unlimited access and a permanent bonus to the main traffic limit.", + "admin_user_regular_override_card_title": "Main traffic", + "admin_user_regular_override_save": "Save", + "admin_user_regular_override_status_bonus": "Main now: +{gb} GB", + "admin_user_regular_override_status_none": "Main traffic bonus is not set", + "admin_user_regular_override_status_unlimited": "Current: unlimited", + "admin_user_traffic_grant_gb": "GB to grant", + "admin_user_traffic_grant_hint": "Adds GB to the user balance like a top-up, but without payment. The limit and squads update in the panel immediately.", + "admin_user_traffic_grant_kind": "Traffic type", + "admin_user_traffic_grant_kind_premium": "Premium", + "admin_user_traffic_grant_kind_regular": "Regular", + "admin_user_traffic_grant_submit": "Grant", + "admin_user_traffic_grant_title": "Grant traffic", + "admin_yes": "Yes", + "wa_payment_success": "Payment successful", + "wa_settings_admin_panel": "Admin panel", + "wa_settings_admin_panel_hint": "Manage the app" } diff --git a/locales/ru.json b/locales/ru.json index 3be1f3f..636fa05 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -1802,5 +1802,160 @@ "admin_translations_audience_user": "Видно пользователю", "admin_translations_audience_internal": "Админка/внутреннее", "admin_translations_audience_user_hint": "Строки Mini App, бота, платежей, подписок, поддержки и входа.", - "admin_translations_audience_internal_hint": "Админка, логи, статусы синхронизации и сервисные уведомления." + "admin_translations_audience_internal_hint": "Админка, логи, статусы синхронизации и сервисные уведомления.", + "admin_actions": "Действия", + "admin_ad_created": "Кампания создана", + "admin_ad_deleted": "Кампания удалена", + "admin_appearance_brand_sub": "Файл, ссылка или подтвержденный emoji-логотип", + "admin_appearance_brand_title": "Логотип", + "admin_appearance_emoji_font": "Шрифт emoji", + "admin_appearance_favicon_upload_failed": "Не удалось загрузить favicon", + "admin_appearance_favicon_upload_file": "Загрузить favicon", + "admin_appearance_favicon_upload_url": "По ссылке", + "admin_appearance_favicon_uploaded_pending": "Favicon загружена и применена.", + "admin_appearance_logo_upload_failed": "Не удалось загрузить логотип", + "admin_appearance_logo_upload_file": "Загрузить файл", + "admin_appearance_logo_upload_url": "По ссылке", + "admin_appearance_logo_uploaded_pending": "Логотип загружен и применен.", + "admin_appearance_preview_theme": "Предпросмотр", + "admin_appearance_theme_accent_empty": "Не задан", + "admin_appearance_theme_accent_placeholder": "Не задан", + "admin_appearance_theme_home_logo_scale": "Логотип на главной и входе", + "admin_appearance_themes_sub": "Глобальная тема, accent color и предпросмотр", + "admin_appearance_themes_title": "Темы", + "admin_appearance_use_custom_favicon": "Использовать отдельную favicon", + "admin_appearance_use_emoji_logo": "Использовать emoji-логотип", + "admin_backups_create": "Создать бэкап", + "admin_backups_create_done": "Бэкап создан", + "admin_backups_create_failed": "Не удалось создать бэкап", + "admin_backups_creating": "Создание...", + "admin_backups_pagination_meta": "{from}-{to} / {total}", + "admin_btn_add_squad": "Добавить сквад", + "admin_btn_ban": "Заблокировать", + "admin_btn_cancel": "Отмена", + "admin_btn_confirm_delete": "Подтвердить удаление", + "admin_btn_confirm_send": "Подтвердить отправку", + "admin_btn_delete_account": "Удалить аккаунт", + "admin_btn_preview_tg": "Превью в Telegram", + "admin_btn_save_tariff": "Сохранить тариф", + "admin_btn_send_msg": "Отправить сообщение", + "admin_btn_unban": "Разбанить пользователя", + "admin_days_short": "дн.", + "admin_load_failed": "Не удалось загрузить данные", + "admin_loading_squads": "Загружаю список из панели…", + "admin_message_preview_failed": "Ошибка отправки превью", + "admin_message_preview_sent": "Превью отправлено в Telegram", + "admin_nav_appearance": "Внешний вид", + "admin_nav_title": "Админ-панель", + "admin_no": "Нет", + "admin_pagination_next": "Далее", + "admin_pagination_prev": "Назад", + "admin_premium_override_invalid_bonus": "Некорректное значение GB", + "admin_regular_override_invalid_bonus": "Некорректное значение GB для основного трафика", + "admin_regular_override_saved": "Оверрайд основного трафика сохранён", + "admin_section_appearance_subtitle": "Логотип, темы и акцентные цвета Mini App", + "admin_section_appearance_title": "Внешний вид", + "admin_select": "Выбрать", + "admin_send": "Отправить", + "admin_settings_saved": "Настройки сохранены", + "admin_status_banned": "Бан", + "admin_status_subscription": "Подписка", + "admin_support_send_failed": "Ошибка отправки", + "admin_tariff_btn_package_rub": "Пакет ₽", + "admin_tariff_btn_package_stars": "Пакет ⭐", + "admin_tariff_btn_period": "Период", + "admin_tariff_create_subtitle": "Каталог будет сохранён в JSON после подтверждения", + "admin_tariff_create_title": "Новый тариф", + "admin_tariff_default_updated": "Тариф по умолчанию обновлён", + "admin_tariff_delete_subtitle": "Тариф {key} исчезнет из каталога продаж.", + "admin_tariff_delete_title": "Удалить тариф?", + "admin_tariff_deleted": "Тариф удалён", + "admin_tariff_edit_title": "Настройка тарифа", + "admin_tariff_enabled_hint": "Выключенный тариф не показывается в боте/мини-аппе, но активные подписки на нём продолжают работать", + "admin_tariff_error_delete_last_enabled": "Нельзя удалить последний включённый тариф", + "admin_tariff_error_key_exists": "Тариф с таким ключом уже есть", + "admin_tariff_error_key_required": "Укажите ключ тарифа", + "admin_tariff_error_min_enabled": "Должен быть хотя бы один включённый тариф", + "admin_tariff_hidden": "Тариф скрыт от пользователей", + "admin_tariff_hint_conversion": "По этому курсу остаток подписки пересчитывается в гигабайты при переходе пользователя с тарифа «Период» на «Трафик»", + "admin_tariff_hint_hwid": "Сколько устройств может одновременно использовать подписку. Пусто — взять значение из .env, 0 — без ограничений", + "admin_tariff_hint_key": "Латиницей, без пробелов. Используется в платежах и подписках, менять после публикации не рекомендуется", + "admin_tariff_hint_premium_name_en": "Опционально для английского интерфейса.", + "admin_tariff_hint_premium_name_ru": "Эта строка заменит «Premium-серверы» в кабинете, докупках и карточках лимитов.", + "admin_tariff_hint_premium_squads": "Сквады из Remnawave, доступные только владельцам этого тарифа. Трафик считается по их accessible nodes", + "admin_tariff_hint_premium_traffic_limit": "Сколько GB через premium-сквады включено в тариф каждый месяц. 0 или пусто — отдельного premium-лимита нет (premium-нодами можно пользоваться без ограничения)", + "admin_tariff_hint_squads": "Сквады Remnawave, к которым подключается пользователь по этому тарифу. Выберите один или несколько", + "admin_tariff_hint_traffic_limit": "Сколько GB включено в тариф на каждый месяц. 0 — безлимитный трафика. Сверху можно докупать пакеты на вкладке «Докупки»", + "admin_tariff_hwid_packages_subtitle": "Расширяет лимит, указанный во вкладке «Основное». Каждая строка — пакет «+N устройств за N единиц валюты»", + "admin_tariff_hwid_packages_title": "Пакеты дополнительных устройств (HWID)", + "admin_tariff_label_conversion": "Курс конвертации, ₽ за 1 GB", + "admin_tariff_label_desc_en": "Описание · EN", + "admin_tariff_label_desc_ru": "Описание · RU", + "admin_tariff_label_hwid": "Лимит устройств (HWID)", + "admin_tariff_label_key": "Ключ тарифа", + "admin_tariff_label_model": "Модель тарификации", + "admin_tariff_label_name_en": "Название · EN", + "admin_tariff_label_name_ru": "Название · RU", + "admin_tariff_label_premium_name_en": "Название premium-раздела, EN", + "admin_tariff_label_premium_name_ru": "Название premium-раздела, RU", + "admin_tariff_label_premium_traffic_limit": "Месячный лимит premium-трафика, GB", + "admin_tariff_label_squads": "Базовые Internal Squads", + "admin_tariff_label_traffic_limit": "Месячный лимит трафика, GB", + "admin_tariff_model_period_desc": "пользователь покупает фиксированный срок (1/3/12 мес. и т.д.)", + "admin_tariff_model_period_label": "Период", + "admin_tariff_model_traffic_desc": "пользователь покупает пакеты гигабайт по фиксированной цене за GB", + "admin_tariff_model_traffic_label": "Трафик", + "admin_tariff_placeholder_desc_ru": "Базовый набор серверов", + "admin_tariff_placeholder_name_ru": "Стандарт", + "admin_tariff_placeholder_premium_name_ru": "Premium-серверы", + "admin_tariff_premium_head": "Premium-доступ и отдельный счётчик трафика", + "admin_tariff_premium_subhead": "Premium-сквады дают пользователю доступ к более быстрым/премиальным нодам; их трафик считается отдельно от основного, чтобы можно было ограничить или продавать дополнительно", + "admin_tariff_premium_topup_subtitle": "Пакеты для расширения месячного premium-лимита, когда пользователь его исчерпал", + "admin_tariff_premium_topup_title": "Докупка premium-трафика", + "admin_tariff_pricing_empty": "Добавьте хотя бы один период — без него тариф не появится на витрине.", + "admin_tariff_pricing_period_subtitle": "Каждая строка — отдельный вариант на витрине: за сколько месяцев пользователь платит и сколько это стоит", + "admin_tariff_pricing_period_title": "Периоды подписки и цены", + "admin_tariff_pricing_traffic_subtitle": "Базовая витрина для трафиковой модели. Каждая строка — пакет «N гигабайт за N единиц валюты»", + "admin_tariff_pricing_traffic_title": "Пакеты трафика", + "admin_tariff_saved": "Тариф сохранён", + "admin_tariff_status_updated": "Статус тарифа обновлён", + "admin_tariff_topup_subtitle": "Когда у пользователя кончился месячный лимит, ему предложат купить дополнительный пакет, не меняя срок подписки", + "admin_tariff_topup_title": "Докупка трафика поверх месячного лимита", + "admin_tariff_topup_traffic_hint": "Для трафиковой модели отдельные «докупки» не нужны — пакеты, которые вы настроили на вкладке «Цены», и являются докупками: пользователь покупает их повторно по мере исчерпания.", + "admin_tariff_visible": "Тариф виден на витрине", + "admin_tariffs_save_failed": "Ошибка сохранения тарифов", + "admin_tariffs_saved": "Тарифы сохранены", + "admin_tariffs_title": "Каталог тарифов", + "admin_user_label_ref_bot": "Реф. ссылка (бот)", + "admin_user_label_ref_web": "Реф. ссылка (веб)", + "admin_user_override_unlimited_short": "Безлимит", + "admin_user_premium_override_bonus": "Доп. премиум-трафик, GB", + "admin_user_premium_override_bonus_hint": "", + "admin_user_premium_override_card_hint": "Безлимит и дополнительный объём для премиум-сквадов поверх тарифа.", + "admin_user_premium_override_card_title": "Премиум-трафик", + "admin_user_premium_override_save": "Сохранить", + "admin_user_premium_override_status_bonus": "Премиум сейчас: +{gb} GB", + "admin_user_premium_override_status_none": "Премиум-оверрайд не задан", + "admin_user_premium_override_status_unlimited": "Сейчас: безлимит", + "admin_user_premium_unlimited_hint": "Безлимит (админ-оверрайд)", + "admin_user_premium_unlimited_value": "∞ (использовано {used})", + "admin_user_regular_override_bonus": "Доп. основной трафик, GB", + "admin_user_regular_override_bonus_hint": "", + "admin_user_regular_override_card_hint": "Безлимит и постоянный бонус к лимиту основного трафика.", + "admin_user_regular_override_card_title": "Основной трафик", + "admin_user_regular_override_save": "Сохранить", + "admin_user_regular_override_status_bonus": "Основной сейчас: +{gb} GB", + "admin_user_regular_override_status_none": "Бонус основного трафика не задан", + "admin_user_regular_override_status_unlimited": "Сейчас: безлимит", + "admin_user_traffic_grant_gb": "ГБ к выдаче", + "admin_user_traffic_grant_hint": "Зачисление ГБ на баланс пользователя — как при докупке, но без оплаты. Лимит и сквады в панели обновятся сразу.", + "admin_user_traffic_grant_kind": "Тип трафика", + "admin_user_traffic_grant_kind_premium": "Премиум", + "admin_user_traffic_grant_kind_regular": "Обычный", + "admin_user_traffic_grant_submit": "Выдать", + "admin_user_traffic_grant_title": "Выдать трафик", + "admin_yes": "Да", + "wa_payment_success": "Платёж успешно выполнен", + "wa_settings_admin_panel": "Админ-панель", + "wa_settings_admin_panel_hint": "Управление приложением" }