mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
fix(i18n): spell the brand "Remnawave" instead of camelCase "RemnaWave"
Replace the user-facing 'RemnaWave' spelling with 'Remnawave' across all locale values (en/ru/zh/fa, 67 strings), t() display fallbacks, and code comments. Translation keys (refreshRemnaWave, ...) and code identifiers (RemnaWaveService, setRemnaWaveUuid, ...) are left untouched.
This commit is contained in:
@@ -9,7 +9,7 @@ export interface LocalizedText {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const adminAppsApi = {
|
export const adminAppsApi = {
|
||||||
// Get RemnaWave config status
|
// Get Remnawave config status
|
||||||
getRemnaWaveStatus: async (): Promise<{ enabled: boolean; config_uuid: string | null }> => {
|
getRemnaWaveStatus: async (): Promise<{ enabled: boolean; config_uuid: string | null }> => {
|
||||||
const response = await apiClient.get<{ enabled: boolean; config_uuid: string | null }>(
|
const response = await apiClient.get<{ enabled: boolean; config_uuid: string | null }>(
|
||||||
'/cabinet/admin/apps/remnawave/status',
|
'/cabinet/admin/apps/remnawave/status',
|
||||||
@@ -17,7 +17,7 @@ export const adminAppsApi = {
|
|||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Set RemnaWave config UUID
|
// Set Remnawave config UUID
|
||||||
setRemnaWaveUuid: async (
|
setRemnaWaveUuid: async (
|
||||||
uuid: string | null,
|
uuid: string | null,
|
||||||
): Promise<{ enabled: boolean; config_uuid: string | null }> => {
|
): Promise<{ enabled: boolean; config_uuid: string | null }> => {
|
||||||
@@ -28,7 +28,7 @@ export const adminAppsApi = {
|
|||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
// List available RemnaWave configs
|
// List available Remnawave configs
|
||||||
listRemnaWaveConfigs: async (): Promise<
|
listRemnaWaveConfigs: async (): Promise<
|
||||||
{ uuid: string; name: string; view_position: number }[]
|
{ uuid: string; name: string; view_position: number }[]
|
||||||
> => {
|
> => {
|
||||||
@@ -38,7 +38,7 @@ export const adminAppsApi = {
|
|||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get RemnaWave subscription config
|
// Get Remnawave subscription config
|
||||||
getRemnaWaveConfig: async (): Promise<RemnawaveConfig> => {
|
getRemnaWaveConfig: async (): Promise<RemnawaveConfig> => {
|
||||||
const response = await apiClient.get<{
|
const response = await apiClient.get<{
|
||||||
uuid: string;
|
uuid: string;
|
||||||
@@ -50,7 +50,7 @@ export const adminAppsApi = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// ============== RemnaWave Format Types ==============
|
// ============== Remnawave Format Types ==============
|
||||||
|
|
||||||
export interface RemnawaveButton {
|
export interface RemnawaveButton {
|
||||||
url: string;
|
url: string;
|
||||||
|
|||||||
@@ -698,7 +698,7 @@ export const adminUsersApi = {
|
|||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get subscription request history from RemnaWave panel
|
// Get subscription request history from Remnawave panel
|
||||||
getSubscriptionRequestHistory: async (
|
getSubscriptionRequestHistory: async (
|
||||||
userId: number,
|
userId: number,
|
||||||
subscriptionId?: number,
|
subscriptionId?: number,
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ export const serversApi = {
|
|||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Sync servers with RemnaWave
|
// Sync servers with Remnawave
|
||||||
syncServers: async (): Promise<ServerSyncResponse> => {
|
syncServers: async (): Promise<ServerSyncResponse> => {
|
||||||
const response = await apiClient.post('/cabinet/admin/servers/sync');
|
const response = await apiClient.post('/cabinet/admin/servers/sync');
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ export interface TariffDetail {
|
|||||||
daily_price_kopeks: number;
|
daily_price_kopeks: number;
|
||||||
// Режим сброса трафика
|
// Режим сброса трафика
|
||||||
traffic_reset_mode: string | null; // 'DAY', 'WEEK', 'MONTH', 'MONTH_ROLLING', 'NO_RESET', null = глобальная настройка
|
traffic_reset_mode: string | null; // 'DAY', 'WEEK', 'MONTH', 'MONTH_ROLLING', 'NO_RESET', null = глобальная настройка
|
||||||
// Внешний сквад RemnaWave
|
// Внешний сквад Remnawave
|
||||||
external_squad_uuid: string | null;
|
external_squad_uuid: string | null;
|
||||||
created_at: string;
|
created_at: string;
|
||||||
updated_at: string | null;
|
updated_at: string | null;
|
||||||
@@ -126,7 +126,7 @@ export interface TariffCreateRequest {
|
|||||||
daily_price_kopeks?: number;
|
daily_price_kopeks?: number;
|
||||||
// Режим сброса трафика
|
// Режим сброса трафика
|
||||||
traffic_reset_mode?: string | null;
|
traffic_reset_mode?: string | null;
|
||||||
// Внешний сквад RemnaWave
|
// Внешний сквад Remnawave
|
||||||
external_squad_uuid?: string | null;
|
external_squad_uuid?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ export interface TariffUpdateRequest {
|
|||||||
daily_price_kopeks?: number;
|
daily_price_kopeks?: number;
|
||||||
// Режим сброса трафика
|
// Режим сброса трафика
|
||||||
traffic_reset_mode?: string | null;
|
traffic_reset_mode?: string | null;
|
||||||
// Внешний сквад RemnaWave
|
// Внешний сквад Remnawave
|
||||||
external_squad_uuid?: string | null;
|
external_squad_uuid?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,7 +266,7 @@ export const tariffsApi = {
|
|||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get available external squads from RemnaWave
|
// Get available external squads from Remnawave
|
||||||
getAvailableExternalSquads: async (): Promise<ExternalSquadInfo[]> => {
|
getAvailableExternalSquads: async (): Promise<ExternalSquadInfo[]> => {
|
||||||
const response = await apiClient.get('/cabinet/admin/tariffs/available-external-squads');
|
const response = await apiClient.get('/cabinet/admin/tariffs/available-external-squads');
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|||||||
@@ -1207,7 +1207,7 @@
|
|||||||
"broadcasts": "Broadcasts",
|
"broadcasts": "Broadcasts",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
"payments": "Payments",
|
"payments": "Payments",
|
||||||
"remnawave": "RemnaWave",
|
"remnawave": "Remnawave",
|
||||||
"emailTemplates": "Email Templates",
|
"emailTemplates": "Email Templates",
|
||||||
"paymentMethods": "Payment Methods",
|
"paymentMethods": "Payment Methods",
|
||||||
"campaigns": "Campaigns",
|
"campaigns": "Campaigns",
|
||||||
@@ -1605,7 +1605,7 @@
|
|||||||
"notFound": "Payment method not found"
|
"notFound": "Payment method not found"
|
||||||
},
|
},
|
||||||
"remnawave": {
|
"remnawave": {
|
||||||
"title": "RemnaWave",
|
"title": "Remnawave",
|
||||||
"subtitle": "Panel management and statistics",
|
"subtitle": "Panel management and statistics",
|
||||||
"connected": "Connected",
|
"connected": "Connected",
|
||||||
"disconnected": "Not configured",
|
"disconnected": "Not configured",
|
||||||
@@ -1719,9 +1719,9 @@
|
|||||||
"success": "Success",
|
"success": "Success",
|
||||||
"runAutoSyncNow": "Run Auto Sync Now",
|
"runAutoSyncNow": "Run Auto Sync Now",
|
||||||
"fromPanel": "From Panel",
|
"fromPanel": "From Panel",
|
||||||
"fromPanelDesc": "Import users from RemnaWave to bot",
|
"fromPanelDesc": "Import users from Remnawave to bot",
|
||||||
"toPanel": "To Panel",
|
"toPanel": "To Panel",
|
||||||
"toPanelDesc": "Export users from bot to RemnaWave"
|
"toPanelDesc": "Export users from bot to Remnawave"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wheel": {
|
"wheel": {
|
||||||
@@ -2128,7 +2128,7 @@
|
|||||||
"db_sqlite": "SQLite",
|
"db_sqlite": "SQLite",
|
||||||
"db_redis": "Redis",
|
"db_redis": "Redis",
|
||||||
"sys_core": "Core & Debug",
|
"sys_core": "Core & Debug",
|
||||||
"sys_remnawave": "RemnaWave",
|
"sys_remnawave": "Remnawave",
|
||||||
"sys_webapi": "Web API",
|
"sys_webapi": "Web API",
|
||||||
"sys_webhook": "Webhook",
|
"sys_webhook": "Webhook",
|
||||||
"sys_server": "Server status",
|
"sys_server": "Server status",
|
||||||
@@ -2178,7 +2178,7 @@
|
|||||||
"deleteUser": "Delete users"
|
"deleteUser": "Delete users"
|
||||||
},
|
},
|
||||||
"deleteSubscription": {
|
"deleteSubscription": {
|
||||||
"warning": "Selected subscriptions will be permanently deleted from the bot and RemnaWave panel!",
|
"warning": "Selected subscriptions will be permanently deleted from the bot and Remnawave panel!",
|
||||||
"hint": "Users will lose VPN access for deleted subscriptions. This action cannot be undone.",
|
"hint": "Users will lose VPN access for deleted subscriptions. This action cannot be undone.",
|
||||||
"activePaidWarning": "{{count}} of {{total}} selected subscriptions are active paid",
|
"activePaidWarning": "{{count}} of {{total}} selected subscriptions are active paid",
|
||||||
"forceDeleteConfirm": "I confirm deletion of active paid subscriptions"
|
"forceDeleteConfirm": "I confirm deletion of active paid subscriptions"
|
||||||
@@ -2186,7 +2186,7 @@
|
|||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"warning": "Selected users will be permanently deleted from the bot! All their subscriptions, balance, and data will be lost!",
|
"warning": "Selected users will be permanently deleted from the bot! All their subscriptions, balance, and data will be lost!",
|
||||||
"hint": "This action cannot be undone. Users will need to restart the bot to create a new account.",
|
"hint": "This action cannot be undone. Users will need to restart the bot to create a new account.",
|
||||||
"deleteFromPanel": "Also delete from RemnaWave panel"
|
"deleteFromPanel": "Also delete from Remnawave panel"
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"days": "Number of days",
|
"days": "Number of days",
|
||||||
@@ -2370,16 +2370,16 @@
|
|||||||
"importError": "Invalid JSON file format",
|
"importError": "Invalid JSON file format",
|
||||||
"importCreateError": "Failed to create some apps",
|
"importCreateError": "Failed to create some apps",
|
||||||
"noAppsToImport": "No apps to import",
|
"noAppsToImport": "No apps to import",
|
||||||
"remnaWaveToggle": "Toggle RemnaWave source",
|
"remnaWaveToggle": "Toggle Remnawave source",
|
||||||
"refreshRemnaWave": "Refresh from RemnaWave",
|
"refreshRemnaWave": "Refresh from Remnawave",
|
||||||
"remnaWaveMode": "Showing apps from RemnaWave panel. Read-only mode.",
|
"remnaWaveMode": "Showing apps from Remnawave panel. Read-only mode.",
|
||||||
"remnaWaveSettings": "RemnaWave Settings",
|
"remnaWaveSettings": "Remnawave Settings",
|
||||||
"remnaWaveConfigUuid": "Config UUID",
|
"remnaWaveConfigUuid": "Config UUID",
|
||||||
"remnaWaveConfigUuidHint": "UUID of subscription page config from RemnaWave panel",
|
"remnaWaveConfigUuidHint": "UUID of subscription page config from Remnawave panel",
|
||||||
"availableConfigs": "Available configs",
|
"availableConfigs": "Available configs",
|
||||||
"noConfigs": "No configs",
|
"noConfigs": "No configs",
|
||||||
"remnaWaveConnected": "RemnaWave connected",
|
"remnaWaveConnected": "Remnawave connected",
|
||||||
"remnaWaveDisconnected": "RemnaWave disconnected"
|
"remnaWaveDisconnected": "Remnawave disconnected"
|
||||||
},
|
},
|
||||||
"tickets": {
|
"tickets": {
|
||||||
"title": "Ticket Management",
|
"title": "Ticket Management",
|
||||||
@@ -2528,7 +2528,7 @@
|
|||||||
"daysShort": "d.",
|
"daysShort": "d.",
|
||||||
"serversTitle": "Servers",
|
"serversTitle": "Servers",
|
||||||
"externalSquadTitle": "External Squad",
|
"externalSquadTitle": "External Squad",
|
||||||
"externalSquadHint": "Assign a RemnaWave external squad for users on this tariff. When a subscription is created, the user will be automatically added to the selected squad.",
|
"externalSquadHint": "Assign a Remnawave external squad for users on this tariff. When a subscription is created, the user will be automatically added to the selected squad.",
|
||||||
"noExternalSquad": "No external squad",
|
"noExternalSquad": "No external squad",
|
||||||
"externalSquadUsers": "users",
|
"externalSquadUsers": "users",
|
||||||
"serversTabHint": "Select servers available on this tariff.",
|
"serversTabHint": "Select servers available on this tariff.",
|
||||||
@@ -2607,7 +2607,7 @@
|
|||||||
"sync": "Sync",
|
"sync": "Sync",
|
||||||
"syncing": "Syncing...",
|
"syncing": "Syncing...",
|
||||||
"syncNow": "Sync now",
|
"syncNow": "Sync now",
|
||||||
"noServers": "No servers. Sync with RemnaWave.",
|
"noServers": "No servers. Sync with Remnawave.",
|
||||||
"edit": "Edit Server",
|
"edit": "Edit Server",
|
||||||
"originalName": "Original Name",
|
"originalName": "Original Name",
|
||||||
"displayName": "Display Name",
|
"displayName": "Display Name",
|
||||||
|
|||||||
@@ -1086,7 +1086,7 @@
|
|||||||
"promoOffers": "پیشنهادات تبلیغاتی",
|
"promoOffers": "پیشنهادات تبلیغاتی",
|
||||||
"promocodes": "کدهای تخفیف",
|
"promocodes": "کدهای تخفیف",
|
||||||
"promoGroups": "گروههای تخفیف",
|
"promoGroups": "گروههای تخفیف",
|
||||||
"remnawave": "RemnaWave",
|
"remnawave": "Remnawave",
|
||||||
"users": "کاربران",
|
"users": "کاربران",
|
||||||
"trafficUsage": "مصرف ترافیک",
|
"trafficUsage": "مصرف ترافیک",
|
||||||
"updates": "بهروزرسانیها",
|
"updates": "بهروزرسانیها",
|
||||||
@@ -1832,7 +1832,7 @@
|
|||||||
"db_sqlite": "SQLite",
|
"db_sqlite": "SQLite",
|
||||||
"db_redis": "Redis",
|
"db_redis": "Redis",
|
||||||
"sys_core": "هسته و اشکالزدایی",
|
"sys_core": "هسته و اشکالزدایی",
|
||||||
"sys_remnawave": "RemnaWave",
|
"sys_remnawave": "Remnawave",
|
||||||
"sys_webapi": "Web API",
|
"sys_webapi": "Web API",
|
||||||
"sys_webhook": "Webhook",
|
"sys_webhook": "Webhook",
|
||||||
"sys_server": "وضعیت سرور",
|
"sys_server": "وضعیت سرور",
|
||||||
@@ -1957,15 +1957,15 @@
|
|||||||
"importError": "فرمت فایل JSON نامعتبر",
|
"importError": "فرمت فایل JSON نامعتبر",
|
||||||
"importPreview": "پیشنمایش وارد کردن",
|
"importPreview": "پیشنمایش وارد کردن",
|
||||||
"noAppsToImport": "هیچ برنامهای برای وارد کردن نیست",
|
"noAppsToImport": "هیچ برنامهای برای وارد کردن نیست",
|
||||||
"refreshRemnaWave": "بازخوانی از RemnaWave",
|
"refreshRemnaWave": "بازخوانی از Remnawave",
|
||||||
"remnaWaveConfigUuid": "UUID پیکربندی",
|
"remnaWaveConfigUuid": "UUID پیکربندی",
|
||||||
"remnaWaveConfigUuidHint": "UUID پیکربندی صفحه اشتراک از پنل RemnaWave",
|
"remnaWaveConfigUuidHint": "UUID پیکربندی صفحه اشتراک از پنل Remnawave",
|
||||||
"remnaWaveMode": "نمایش برنامهها از پنل RemnaWave. حالت فقط خواندنی.",
|
"remnaWaveMode": "نمایش برنامهها از پنل Remnawave. حالت فقط خواندنی.",
|
||||||
"remnaWaveSettings": "تنظیمات RemnaWave",
|
"remnaWaveSettings": "تنظیمات Remnawave",
|
||||||
"remnaWaveToggle": "تغییر منبع RemnaWave",
|
"remnaWaveToggle": "تغییر منبع Remnawave",
|
||||||
"noConfigs": "هیچ تنظیماتی وجود ندارد",
|
"noConfigs": "هیچ تنظیماتی وجود ندارد",
|
||||||
"remnaWaveConnected": "RemnaWave متصل است",
|
"remnaWaveConnected": "Remnawave متصل است",
|
||||||
"remnaWaveDisconnected": "RemnaWave قطع است"
|
"remnaWaveDisconnected": "Remnawave قطع است"
|
||||||
},
|
},
|
||||||
"tickets": {
|
"tickets": {
|
||||||
"title": "مدیریت تیکتها",
|
"title": "مدیریت تیکتها",
|
||||||
@@ -2107,7 +2107,7 @@
|
|||||||
"daysShort": "روز",
|
"daysShort": "روز",
|
||||||
"serversTitle": "سرورها",
|
"serversTitle": "سرورها",
|
||||||
"externalSquadTitle": "گروه خارجی",
|
"externalSquadTitle": "گروه خارجی",
|
||||||
"externalSquadHint": "یک گروه خارجی RemnaWave برای کاربران این تعرفه تعیین کنید. هنگام ایجاد اشتراک، کاربر به طور خودکار به گروه انتخاب شده اضافه میشود.",
|
"externalSquadHint": "یک گروه خارجی Remnawave برای کاربران این تعرفه تعیین کنید. هنگام ایجاد اشتراک، کاربر به طور خودکار به گروه انتخاب شده اضافه میشود.",
|
||||||
"noExternalSquad": "بدون گروه خارجی",
|
"noExternalSquad": "بدون گروه خارجی",
|
||||||
"externalSquadUsers": "کاربران",
|
"externalSquadUsers": "کاربران",
|
||||||
"serversTabHint": "سرورهای موجود در این تعرفه را انتخاب کنید.",
|
"serversTabHint": "سرورهای موجود در این تعرفه را انتخاب کنید.",
|
||||||
@@ -2186,7 +2186,7 @@
|
|||||||
"sync": "همگامسازی",
|
"sync": "همگامسازی",
|
||||||
"syncing": "در حال همگامسازی...",
|
"syncing": "در حال همگامسازی...",
|
||||||
"syncNow": "همگامسازی الان",
|
"syncNow": "همگامسازی الان",
|
||||||
"noServers": "سروری نیست. با RemnaWave همگامسازی کنید.",
|
"noServers": "سروری نیست. با Remnawave همگامسازی کنید.",
|
||||||
"edit": "ویرایش سرور",
|
"edit": "ویرایش سرور",
|
||||||
"originalName": "نام اصلی",
|
"originalName": "نام اصلی",
|
||||||
"displayName": "نام نمایشی",
|
"displayName": "نام نمایشی",
|
||||||
@@ -3138,7 +3138,7 @@
|
|||||||
"connected": "متصل",
|
"connected": "متصل",
|
||||||
"disconnected": "تنظیم نشده",
|
"disconnected": "تنظیم نشده",
|
||||||
"noData": "بارگذاری دادهها ناموفق بود",
|
"noData": "بارگذاری دادهها ناموفق بود",
|
||||||
"title": "RemnaWave",
|
"title": "Remnawave",
|
||||||
"subtitle": "مدیریت پنل و آمار",
|
"subtitle": "مدیریت پنل و آمار",
|
||||||
"tabs": {
|
"tabs": {
|
||||||
"overview": "نمای کلی",
|
"overview": "نمای کلی",
|
||||||
@@ -3246,9 +3246,9 @@
|
|||||||
"success": "موفق",
|
"success": "موفق",
|
||||||
"runAutoSyncNow": "اجرای همگامسازی خودکار",
|
"runAutoSyncNow": "اجرای همگامسازی خودکار",
|
||||||
"fromPanel": "از پنل",
|
"fromPanel": "از پنل",
|
||||||
"fromPanelDesc": "وارد کردن کاربران از RemnaWave به ربات",
|
"fromPanelDesc": "وارد کردن کاربران از Remnawave به ربات",
|
||||||
"toPanel": "به پنل",
|
"toPanel": "به پنل",
|
||||||
"toPanelDesc": "صادر کردن کاربران از ربات به RemnaWave"
|
"toPanelDesc": "صادر کردن کاربران از ربات به Remnawave"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"theme": {
|
"theme": {
|
||||||
@@ -3824,7 +3824,7 @@
|
|||||||
"deleteUser": "حذف کاربران"
|
"deleteUser": "حذف کاربران"
|
||||||
},
|
},
|
||||||
"deleteSubscription": {
|
"deleteSubscription": {
|
||||||
"warning": "اشتراکهای انتخاب شده برای همیشه از ربات و پنل RemnaWave حذف خواهند شد!",
|
"warning": "اشتراکهای انتخاب شده برای همیشه از ربات و پنل Remnawave حذف خواهند شد!",
|
||||||
"hint": "کاربران دسترسی VPN اشتراکهای حذف شده را از دست خواهند داد. این عملیات قابل بازگشت نیست.",
|
"hint": "کاربران دسترسی VPN اشتراکهای حذف شده را از دست خواهند داد. این عملیات قابل بازگشت نیست.",
|
||||||
"activePaidWarning": "{{count}} از {{total}} اشتراک انتخابشده اشتراکهای فعال پرداختی هستند",
|
"activePaidWarning": "{{count}} از {{total}} اشتراک انتخابشده اشتراکهای فعال پرداختی هستند",
|
||||||
"forceDeleteConfirm": "حذف اشتراکهای فعال پرداختی را تأیید میکنم"
|
"forceDeleteConfirm": "حذف اشتراکهای فعال پرداختی را تأیید میکنم"
|
||||||
@@ -3832,7 +3832,7 @@
|
|||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"warning": "کاربران انتخاب شده برای همیشه از ربات حذف خواهند شد! تمام اشتراکها، موجودی و دادههای آنها از بین خواهد رفت!",
|
"warning": "کاربران انتخاب شده برای همیشه از ربات حذف خواهند شد! تمام اشتراکها، موجودی و دادههای آنها از بین خواهد رفت!",
|
||||||
"hint": "این عملیات قابل بازگشت نیست. کاربران باید ربات را دوباره راهاندازی کنند تا حساب جدید بسازند.",
|
"hint": "این عملیات قابل بازگشت نیست. کاربران باید ربات را دوباره راهاندازی کنند تا حساب جدید بسازند.",
|
||||||
"deleteFromPanel": "همچنین از پنل RemnaWave حذف شود"
|
"deleteFromPanel": "همچنین از پنل Remnawave حذف شود"
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"days": "تعداد روز",
|
"days": "تعداد روز",
|
||||||
|
|||||||
@@ -1229,7 +1229,7 @@
|
|||||||
"broadcasts": "Рассылки",
|
"broadcasts": "Рассылки",
|
||||||
"users": "Пользователи",
|
"users": "Пользователи",
|
||||||
"payments": "Платежи",
|
"payments": "Платежи",
|
||||||
"remnawave": "RemnaWave",
|
"remnawave": "Remnawave",
|
||||||
"emailTemplates": "Email-шаблоны",
|
"emailTemplates": "Email-шаблоны",
|
||||||
"paymentMethods": "Платёжные методы",
|
"paymentMethods": "Платёжные методы",
|
||||||
"campaigns": "Кампании",
|
"campaigns": "Кампании",
|
||||||
@@ -1627,7 +1627,7 @@
|
|||||||
"notFound": "Метод оплаты не найден"
|
"notFound": "Метод оплаты не найден"
|
||||||
},
|
},
|
||||||
"remnawave": {
|
"remnawave": {
|
||||||
"title": "RemnaWave",
|
"title": "Remnawave",
|
||||||
"subtitle": "Управление панелью и статистика",
|
"subtitle": "Управление панелью и статистика",
|
||||||
"connected": "Подключено",
|
"connected": "Подключено",
|
||||||
"disconnected": "Не настроено",
|
"disconnected": "Не настроено",
|
||||||
@@ -1744,9 +1744,9 @@
|
|||||||
"success": "Успешно",
|
"success": "Успешно",
|
||||||
"runAutoSyncNow": "Запустить автосинхронизацию",
|
"runAutoSyncNow": "Запустить автосинхронизацию",
|
||||||
"fromPanel": "Из панели",
|
"fromPanel": "Из панели",
|
||||||
"fromPanelDesc": "Импорт пользователей из RemnaWave в бота",
|
"fromPanelDesc": "Импорт пользователей из Remnawave в бота",
|
||||||
"toPanel": "В панель",
|
"toPanel": "В панель",
|
||||||
"toPanelDesc": "Экспорт пользователей из бота в RemnaWave"
|
"toPanelDesc": "Экспорт пользователей из бота в Remnawave"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wheel": {
|
"wheel": {
|
||||||
@@ -2145,7 +2145,7 @@
|
|||||||
"db_sqlite": "SQLite",
|
"db_sqlite": "SQLite",
|
||||||
"db_redis": "Redis",
|
"db_redis": "Redis",
|
||||||
"sys_core": "Ядро и отладка",
|
"sys_core": "Ядро и отладка",
|
||||||
"sys_remnawave": "RemnaWave",
|
"sys_remnawave": "Remnawave",
|
||||||
"sys_webapi": "Web API",
|
"sys_webapi": "Web API",
|
||||||
"sys_webhook": "Webhook",
|
"sys_webhook": "Webhook",
|
||||||
"sys_server": "Статус сервера",
|
"sys_server": "Статус сервера",
|
||||||
@@ -2355,8 +2355,8 @@
|
|||||||
"Api Key": "API ключ",
|
"Api Key": "API ключ",
|
||||||
"Api Token": "API токен",
|
"Api Token": "API токен",
|
||||||
"Webhook Secret": "Секрет вебхука",
|
"Webhook Secret": "Секрет вебхука",
|
||||||
"Remnawave Url": "URL RemnaWave",
|
"Remnawave Url": "URL Remnawave",
|
||||||
"Remnawave Token": "Токен RemnaWave",
|
"Remnawave Token": "Токен Remnawave",
|
||||||
"Server Status Enabled": "Статус сервера",
|
"Server Status Enabled": "Статус сервера",
|
||||||
"Monitoring Enabled": "Мониторинг",
|
"Monitoring Enabled": "Мониторинг",
|
||||||
"Backup Enabled": "Бэкап",
|
"Backup Enabled": "Бэкап",
|
||||||
@@ -2646,7 +2646,7 @@
|
|||||||
"SQLITE": "SQLite",
|
"SQLITE": "SQLite",
|
||||||
"REDIS": "Redis",
|
"REDIS": "Redis",
|
||||||
"CORE": "Бот",
|
"CORE": "Бот",
|
||||||
"REMNAWAVE": "RemnaWave",
|
"REMNAWAVE": "Remnawave",
|
||||||
"SERVER_STATUS": "Статус сервера",
|
"SERVER_STATUS": "Статус сервера",
|
||||||
"MONITORING": "Мониторинг",
|
"MONITORING": "Мониторинг",
|
||||||
"MAINTENANCE": "Обслуживание",
|
"MAINTENANCE": "Обслуживание",
|
||||||
@@ -2765,16 +2765,16 @@
|
|||||||
"importError": "Неверный формат JSON файла",
|
"importError": "Неверный формат JSON файла",
|
||||||
"importCreateError": "Ошибка при создании приложений",
|
"importCreateError": "Ошибка при создании приложений",
|
||||||
"noAppsToImport": "Нет приложений для импорта",
|
"noAppsToImport": "Нет приложений для импорта",
|
||||||
"remnaWaveToggle": "Переключить источник RemnaWave",
|
"remnaWaveToggle": "Переключить источник Remnawave",
|
||||||
"refreshRemnaWave": "Обновить данные из RemnaWave",
|
"refreshRemnaWave": "Обновить данные из Remnawave",
|
||||||
"remnaWaveMode": "Отображаются приложения из панели RemnaWave. Режим только для чтения.",
|
"remnaWaveMode": "Отображаются приложения из панели Remnawave. Режим только для чтения.",
|
||||||
"remnaWaveSettings": "Настройки RemnaWave",
|
"remnaWaveSettings": "Настройки Remnawave",
|
||||||
"remnaWaveConfigUuid": "UUID конфигурации",
|
"remnaWaveConfigUuid": "UUID конфигурации",
|
||||||
"remnaWaveConfigUuidHint": "UUID конфигурации страницы подписки из панели RemnaWave",
|
"remnaWaveConfigUuidHint": "UUID конфигурации страницы подписки из панели Remnawave",
|
||||||
"availableConfigs": "Доступные конфигурации",
|
"availableConfigs": "Доступные конфигурации",
|
||||||
"noConfigs": "Нет настроенных конфигов",
|
"noConfigs": "Нет настроенных конфигов",
|
||||||
"remnaWaveConnected": "RemnaWave подключён",
|
"remnaWaveConnected": "Remnawave подключён",
|
||||||
"remnaWaveDisconnected": "RemnaWave отключён"
|
"remnaWaveDisconnected": "Remnawave отключён"
|
||||||
},
|
},
|
||||||
"tickets": {
|
"tickets": {
|
||||||
"title": "Управление тикетами",
|
"title": "Управление тикетами",
|
||||||
@@ -2926,7 +2926,7 @@
|
|||||||
"daysShort": "дн.",
|
"daysShort": "дн.",
|
||||||
"serversTitle": "Серверы",
|
"serversTitle": "Серверы",
|
||||||
"externalSquadTitle": "Внешний сквад",
|
"externalSquadTitle": "Внешний сквад",
|
||||||
"externalSquadHint": "Назначьте внешний сквад RemnaWave для пользователей этого тарифа. При создании подписки пользователь будет автоматически добавлен в выбранный сквад.",
|
"externalSquadHint": "Назначьте внешний сквад Remnawave для пользователей этого тарифа. При создании подписки пользователь будет автоматически добавлен в выбранный сквад.",
|
||||||
"noExternalSquad": "Без внешнего сквада",
|
"noExternalSquad": "Без внешнего сквада",
|
||||||
"externalSquadUsers": "пользователей",
|
"externalSquadUsers": "пользователей",
|
||||||
"serversTabHint": "Выберите серверы, доступные на этом тарифе.",
|
"serversTabHint": "Выберите серверы, доступные на этом тарифе.",
|
||||||
@@ -3005,7 +3005,7 @@
|
|||||||
"sync": "Синхронизировать",
|
"sync": "Синхронизировать",
|
||||||
"syncing": "Синхронизация...",
|
"syncing": "Синхронизация...",
|
||||||
"syncNow": "Синхронизировать сейчас",
|
"syncNow": "Синхронизировать сейчас",
|
||||||
"noServers": "Нет серверов. Синхронизируйте с RemnaWave.",
|
"noServers": "Нет серверов. Синхронизируйте с Remnawave.",
|
||||||
"edit": "Редактировать сервер",
|
"edit": "Редактировать сервер",
|
||||||
"originalName": "Оригинальное название",
|
"originalName": "Оригинальное название",
|
||||||
"displayName": "Отображаемое название",
|
"displayName": "Отображаемое название",
|
||||||
@@ -3976,7 +3976,7 @@
|
|||||||
"deleteUser": "Удалить пользователей"
|
"deleteUser": "Удалить пользователей"
|
||||||
},
|
},
|
||||||
"deleteSubscription": {
|
"deleteSubscription": {
|
||||||
"warning": "Выбранные подписки будут безвозвратно удалены из бота и панели RemnaWave!",
|
"warning": "Выбранные подписки будут безвозвратно удалены из бота и панели Remnawave!",
|
||||||
"hint": "Пользователи потеряют доступ к VPN по удалённым подпискам. Это действие нельзя отменить.",
|
"hint": "Пользователи потеряют доступ к VPN по удалённым подпискам. Это действие нельзя отменить.",
|
||||||
"activePaidWarning": "{{count}} из {{total}} выбранных подписок: активные платные",
|
"activePaidWarning": "{{count}} из {{total}} выбранных подписок: активные платные",
|
||||||
"forceDeleteConfirm": "Подтверждаю удаление активных платных подписок"
|
"forceDeleteConfirm": "Подтверждаю удаление активных платных подписок"
|
||||||
@@ -3984,7 +3984,7 @@
|
|||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"warning": "Выбранные пользователи будут безвозвратно удалены из бота! Все их подписки, баланс и данные будут потеряны!",
|
"warning": "Выбранные пользователи будут безвозвратно удалены из бота! Все их подписки, баланс и данные будут потеряны!",
|
||||||
"hint": "Это действие нельзя отменить. Пользователям придётся заново запустить бота для создания нового аккаунта.",
|
"hint": "Это действие нельзя отменить. Пользователям придётся заново запустить бота для создания нового аккаунта.",
|
||||||
"deleteFromPanel": "Также удалить из панели RemnaWave"
|
"deleteFromPanel": "Также удалить из панели Remnawave"
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"days": "Количество дней",
|
"days": "Количество дней",
|
||||||
|
|||||||
@@ -1086,7 +1086,7 @@
|
|||||||
"promoOffers": "促销优惠",
|
"promoOffers": "促销优惠",
|
||||||
"promocodes": "促销码",
|
"promocodes": "促销码",
|
||||||
"promoGroups": "折扣组",
|
"promoGroups": "折扣组",
|
||||||
"remnawave": "RemnaWave",
|
"remnawave": "Remnawave",
|
||||||
"users": "用户",
|
"users": "用户",
|
||||||
"trafficUsage": "流量使用",
|
"trafficUsage": "流量使用",
|
||||||
"updates": "更新",
|
"updates": "更新",
|
||||||
@@ -1873,7 +1873,7 @@
|
|||||||
"db_sqlite": "SQLite",
|
"db_sqlite": "SQLite",
|
||||||
"db_redis": "Redis",
|
"db_redis": "Redis",
|
||||||
"sys_core": "核心与调试",
|
"sys_core": "核心与调试",
|
||||||
"sys_remnawave": "RemnaWave",
|
"sys_remnawave": "Remnawave",
|
||||||
"sys_webapi": "Web API",
|
"sys_webapi": "Web API",
|
||||||
"sys_webhook": "Webhook",
|
"sys_webhook": "Webhook",
|
||||||
"sys_server": "服务器状态",
|
"sys_server": "服务器状态",
|
||||||
@@ -1991,12 +1991,12 @@
|
|||||||
"importError": "无效的JSON文件格式",
|
"importError": "无效的JSON文件格式",
|
||||||
"importPreview": "导入预览",
|
"importPreview": "导入预览",
|
||||||
"noAppsToImport": "没有可导入的应用",
|
"noAppsToImport": "没有可导入的应用",
|
||||||
"refreshRemnaWave": "从RemnaWave刷新",
|
"refreshRemnaWave": "从Remnawave刷新",
|
||||||
"remnaWaveConfigUuid": "配置UUID",
|
"remnaWaveConfigUuid": "配置UUID",
|
||||||
"remnaWaveConfigUuidHint": "来自RemnaWave面板的订阅页面配置UUID",
|
"remnaWaveConfigUuidHint": "来自Remnawave面板的订阅页面配置UUID",
|
||||||
"remnaWaveMode": "显示来自RemnaWave面板的应用。只读模式。",
|
"remnaWaveMode": "显示来自Remnawave面板的应用。只读模式。",
|
||||||
"remnaWaveSettings": "RemnaWave设置",
|
"remnaWaveSettings": "Remnawave设置",
|
||||||
"remnaWaveToggle": "切换RemnaWave源",
|
"remnaWaveToggle": "切换Remnawave源",
|
||||||
"tabs": {
|
"tabs": {
|
||||||
"basic": "基本",
|
"basic": "基本",
|
||||||
"installation": "安装",
|
"installation": "安装",
|
||||||
@@ -2005,8 +2005,8 @@
|
|||||||
"additional": "附加"
|
"additional": "附加"
|
||||||
},
|
},
|
||||||
"noConfigs": "未配置任何配置",
|
"noConfigs": "未配置任何配置",
|
||||||
"remnaWaveConnected": "RemnaWave 已连接",
|
"remnaWaveConnected": "Remnawave 已连接",
|
||||||
"remnaWaveDisconnected": "RemnaWave 未连接"
|
"remnaWaveDisconnected": "Remnawave 未连接"
|
||||||
},
|
},
|
||||||
"tickets": {
|
"tickets": {
|
||||||
"title": "工单管理",
|
"title": "工单管理",
|
||||||
@@ -2147,7 +2147,7 @@
|
|||||||
"daysShort": "天",
|
"daysShort": "天",
|
||||||
"serversTitle": "服务器",
|
"serversTitle": "服务器",
|
||||||
"externalSquadTitle": "外部小组",
|
"externalSquadTitle": "外部小组",
|
||||||
"externalSquadHint": "为此套餐的用户分配RemnaWave外部小组。创建订阅时,用户将自动添加到所选小组。",
|
"externalSquadHint": "为此套餐的用户分配Remnawave外部小组。创建订阅时,用户将自动添加到所选小组。",
|
||||||
"noExternalSquad": "无外部小组",
|
"noExternalSquad": "无外部小组",
|
||||||
"externalSquadUsers": "用户",
|
"externalSquadUsers": "用户",
|
||||||
"serversTabHint": "选择此套餐上可用的服务器。",
|
"serversTabHint": "选择此套餐上可用的服务器。",
|
||||||
@@ -2226,7 +2226,7 @@
|
|||||||
"sync": "同步",
|
"sync": "同步",
|
||||||
"syncing": "同步中...",
|
"syncing": "同步中...",
|
||||||
"syncNow": "立即同步",
|
"syncNow": "立即同步",
|
||||||
"noServers": "暂无服务器。请与RemnaWave同步。",
|
"noServers": "暂无服务器。请与Remnawave同步。",
|
||||||
"edit": "编辑服务器",
|
"edit": "编辑服务器",
|
||||||
"originalName": "原始名称",
|
"originalName": "原始名称",
|
||||||
"displayName": "显示名称",
|
"displayName": "显示名称",
|
||||||
@@ -3146,7 +3146,7 @@
|
|||||||
"connected": "已连接",
|
"connected": "已连接",
|
||||||
"disconnected": "未配置",
|
"disconnected": "未配置",
|
||||||
"noData": "加载数据失败",
|
"noData": "加载数据失败",
|
||||||
"title": "RemnaWave",
|
"title": "Remnawave",
|
||||||
"subtitle": "面板管理和统计",
|
"subtitle": "面板管理和统计",
|
||||||
"tabs": {
|
"tabs": {
|
||||||
"overview": "概览",
|
"overview": "概览",
|
||||||
@@ -3254,9 +3254,9 @@
|
|||||||
"success": "成功",
|
"success": "成功",
|
||||||
"runAutoSyncNow": "立即运行自动同步",
|
"runAutoSyncNow": "立即运行自动同步",
|
||||||
"fromPanel": "从面板",
|
"fromPanel": "从面板",
|
||||||
"fromPanelDesc": "从RemnaWave导入用户到机器人",
|
"fromPanelDesc": "从Remnawave导入用户到机器人",
|
||||||
"toPanel": "到面板",
|
"toPanel": "到面板",
|
||||||
"toPanelDesc": "从机器人导出用户到RemnaWave"
|
"toPanelDesc": "从机器人导出用户到Remnawave"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"roles": {
|
"roles": {
|
||||||
@@ -3823,7 +3823,7 @@
|
|||||||
"deleteUser": "删除用户"
|
"deleteUser": "删除用户"
|
||||||
},
|
},
|
||||||
"deleteSubscription": {
|
"deleteSubscription": {
|
||||||
"warning": "选中的订阅将从机器人和RemnaWave面板中永久删除!",
|
"warning": "选中的订阅将从机器人和Remnawave面板中永久删除!",
|
||||||
"hint": "用户将失去已删除订阅的VPN访问权限。此操作无法撤销。",
|
"hint": "用户将失去已删除订阅的VPN访问权限。此操作无法撤销。",
|
||||||
"activePaidWarning": "所选订阅中有 {{count}} / {{total}} 是有效的付费订阅",
|
"activePaidWarning": "所选订阅中有 {{count}} / {{total}} 是有效的付费订阅",
|
||||||
"forceDeleteConfirm": "我确认删除有效的付费订阅"
|
"forceDeleteConfirm": "我确认删除有效的付费订阅"
|
||||||
@@ -3831,7 +3831,7 @@
|
|||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"warning": "选中的用户将从机器人中永久删除!他们的所有订阅、余额和数据将丢失!",
|
"warning": "选中的用户将从机器人中永久删除!他们的所有订阅、余额和数据将丢失!",
|
||||||
"hint": "此操作无法撤销。用户需要重新启动机器人以创建新账户。",
|
"hint": "此操作无法撤销。用户需要重新启动机器人以创建新账户。",
|
||||||
"deleteFromPanel": "同时从RemnaWave面板删除"
|
"deleteFromPanel": "同时从Remnawave面板删除"
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"days": "天数",
|
"days": "天数",
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export default function AdminApps() {
|
|||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
const { capabilities } = usePlatform();
|
const { capabilities } = usePlatform();
|
||||||
|
|
||||||
// RemnaWave status
|
// Remnawave status
|
||||||
const { data: status } = useQuery({
|
const { data: status } = useQuery({
|
||||||
queryKey: ['remnawave-status'],
|
queryKey: ['remnawave-status'],
|
||||||
queryFn: adminAppsApi.getRemnaWaveStatus,
|
queryFn: adminAppsApi.getRemnaWaveStatus,
|
||||||
@@ -60,8 +60,8 @@ export default function AdminApps() {
|
|||||||
/>
|
/>
|
||||||
<span className="text-sm font-medium text-dark-200">
|
<span className="text-sm font-medium text-dark-200">
|
||||||
{status?.enabled
|
{status?.enabled
|
||||||
? t('admin.apps.remnaWaveConnected', 'RemnaWave connected')
|
? t('admin.apps.remnaWaveConnected', 'Remnawave connected')
|
||||||
: t('admin.apps.remnaWaveDisconnected', 'RemnaWave not connected')}
|
: t('admin.apps.remnaWaveDisconnected', 'Remnawave not connected')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{status?.config_uuid && (
|
{status?.config_uuid && (
|
||||||
|
|||||||
@@ -1122,7 +1122,7 @@ function SyncTab({
|
|||||||
title={t('admin.remnawave.sync.fromPanel', 'Sync from Panel')}
|
title={t('admin.remnawave.sync.fromPanel', 'Sync from Panel')}
|
||||||
description={t(
|
description={t(
|
||||||
'admin.remnawave.sync.fromPanelDesc',
|
'admin.remnawave.sync.fromPanelDesc',
|
||||||
'Import users from RemnaWave panel to bot',
|
'Import users from Remnawave panel to bot',
|
||||||
)}
|
)}
|
||||||
onAction={onSyncFromPanel}
|
onAction={onSyncFromPanel}
|
||||||
isLoading={loadingStates.fromPanel}
|
isLoading={loadingStates.fromPanel}
|
||||||
@@ -1132,7 +1132,7 @@ function SyncTab({
|
|||||||
title={t('admin.remnawave.sync.toPanel', 'Sync to Panel')}
|
title={t('admin.remnawave.sync.toPanel', 'Sync to Panel')}
|
||||||
description={t(
|
description={t(
|
||||||
'admin.remnawave.sync.toPanelDesc',
|
'admin.remnawave.sync.toPanelDesc',
|
||||||
'Export users from bot to RemnaWave panel',
|
'Export users from bot to Remnawave panel',
|
||||||
)}
|
)}
|
||||||
onAction={onSyncToPanel}
|
onAction={onSyncToPanel}
|
||||||
isLoading={loadingStates.toPanel}
|
isLoading={loadingStates.toPanel}
|
||||||
@@ -1498,7 +1498,7 @@ export default function AdminRemnawave() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-xl font-semibold text-dark-100">
|
<h1 className="text-xl font-semibold text-dark-100">
|
||||||
{t('admin.remnawave.title', 'RemnaWave')}
|
{t('admin.remnawave.title', 'Remnawave')}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-sm text-dark-400">
|
<p className="text-sm text-dark-400">
|
||||||
{t('admin.remnawave.subtitle', 'Panel management and statistics')}
|
{t('admin.remnawave.subtitle', 'Panel management and statistics')}
|
||||||
|
|||||||
@@ -438,7 +438,7 @@ export default function Subscription() {
|
|||||||
queryClient.invalidateQueries({ queryKey: ['subscription'] });
|
queryClient.invalidateQueries({ queryKey: ['subscription'] });
|
||||||
queryClient.invalidateQueries({ queryKey: ['connection-link', subscriptionId] });
|
queryClient.invalidateQueries({ queryKey: ['connection-link', subscriptionId] });
|
||||||
queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
|
queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
|
||||||
// RemnaWave resets device HWIDs on revoke — make sure the cabinet
|
// Remnawave resets device HWIDs on revoke — make sure the cabinet
|
||||||
// re-reads the now-empty device list instead of showing the stale cache.
|
// re-reads the now-empty device list instead of showing the stale cache.
|
||||||
queryClient.invalidateQueries({ queryKey: ['devices', subscriptionId] });
|
queryClient.invalidateQueries({ queryKey: ['devices', subscriptionId] });
|
||||||
haptic.notification('success');
|
haptic.notification('success');
|
||||||
|
|||||||
@@ -538,7 +538,7 @@ export interface LocalizedText {
|
|||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemnaWave format types
|
// Remnawave format types
|
||||||
export interface RemnawaveButtonClient {
|
export interface RemnawaveButtonClient {
|
||||||
url?: string;
|
url?: string;
|
||||||
link?: string;
|
link?: string;
|
||||||
@@ -581,7 +581,7 @@ export interface AppConfig {
|
|||||||
supportUrl?: string;
|
supportUrl?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
// RemnaWave
|
// Remnawave
|
||||||
isRemnawave?: boolean;
|
isRemnawave?: boolean;
|
||||||
svgLibrary?: Record<string, string | { svgString: string }>;
|
svgLibrary?: Record<string, string | { svgString: string }>;
|
||||||
baseTranslations?: Record<string, LocalizedText>;
|
baseTranslations?: Record<string, LocalizedText>;
|
||||||
|
|||||||
Reference in New Issue
Block a user