diff --git a/frontend/src/pages/sub/SubPage.tsx b/frontend/src/pages/sub/SubPage.tsx index 041313502..26d188dca 100644 --- a/frontend/src/pages/sub/SubPage.tsx +++ b/frontend/src/pages/sub/SubPage.tsx @@ -111,6 +111,13 @@ export default function SubPage() { if (ok) messageApi.success(t('copied')); }, [t, messageApi]); + const copyAll = useCallback(async () => { + if (links.length === 0) return; + const allLinks = links.join('\n'); + const ok = await ClipboardManager.copyText(allLinks); + if (ok) messageApi.success(t('subscription.copyAllConfigsCopied')); + }, [t, messageApi]); + const open = useCallback((url: string) => { if (!url) return; window.open(url, '_blank'); @@ -393,6 +400,18 @@ export default function SubPage() { <> {t('pages.inbounds.copyLink')}
+
+ {t('subscription.copyAllConfigs')} +
+
+
{links.map((link, idx) => { const parts = parseLinkParts(link, linkEmails[idx] || ''); const fallback = `Link ${idx + 1}`; diff --git a/internal/web/translation/ar-EG.json b/internal/web/translation/ar-EG.json index b5bbfc8fe..eed401bc5 100644 --- a/internal/web/translation/ar-EG.json +++ b/internal/web/translation/ar-EG.json @@ -95,7 +95,9 @@ "active": "نشط", "inactive": "غير نشط", "unlimited": "غير محدود", - "noExpiry": "بدون انتهاء" + "noExpiry": "بدون انتهاء", + "copyAllConfigs": "نسخ جميع الإعدادات", + "copyAllConfigsCopied": "تم نسخ جميع الإعدادات" }, "menu": { "theme": "الثيم", diff --git a/internal/web/translation/en-US.json b/internal/web/translation/en-US.json index 4154e14e0..1cbacbff1 100644 --- a/internal/web/translation/en-US.json +++ b/internal/web/translation/en-US.json @@ -95,7 +95,9 @@ "active": "Active", "inactive": "Inactive", "unlimited": "Unlimited", - "noExpiry": "No expiry" + "noExpiry": "No expiry", + "copyAllConfigs": "Copy All Configs", + "copyAllConfigsCopied": "All configs copied" }, "menu": { "theme": "Theme", diff --git a/internal/web/translation/es-ES.json b/internal/web/translation/es-ES.json index fe00a3fc9..4b6732b23 100644 --- a/internal/web/translation/es-ES.json +++ b/internal/web/translation/es-ES.json @@ -95,7 +95,9 @@ "active": "Activo", "inactive": "Inactivo", "unlimited": "Ilimitado", - "noExpiry": "Sin caducidad" + "noExpiry": "Sin caducidad", + "copyAllConfigs": "Copiar Todas las Configuraciones", + "copyAllConfigsCopied": "Todas las configuraciones copiadas" }, "menu": { "theme": "Tema", diff --git a/internal/web/translation/fa-IR.json b/internal/web/translation/fa-IR.json index 0fa9f3d21..1c2739988 100644 --- a/internal/web/translation/fa-IR.json +++ b/internal/web/translation/fa-IR.json @@ -95,7 +95,9 @@ "active": "فعال", "inactive": "غیرفعال", "unlimited": "نامحدود", - "noExpiry": "بدون انقضا" + "noExpiry": "بدون انقضا", + "copyAllConfigs": "کپی همه کانفیگ‌ها", + "copyAllConfigsCopied": "همه کانفیگ‌ها کپی شدند" }, "menu": { "theme": "تم", diff --git a/internal/web/translation/id-ID.json b/internal/web/translation/id-ID.json index f334179f7..8e84a62c7 100644 --- a/internal/web/translation/id-ID.json +++ b/internal/web/translation/id-ID.json @@ -95,7 +95,9 @@ "active": "Aktif", "inactive": "Nonaktif", "unlimited": "Tanpa batas", - "noExpiry": "Tanpa kedaluwarsa" + "noExpiry": "Tanpa kedaluwarsa", + "copyAllConfigs": "Salin Semua Konfigurasi", + "copyAllConfigsCopied": "Semua konfigurasi tersalin" }, "menu": { "theme": "Tema", diff --git a/internal/web/translation/ja-JP.json b/internal/web/translation/ja-JP.json index 5309a8899..85d9f3770 100644 --- a/internal/web/translation/ja-JP.json +++ b/internal/web/translation/ja-JP.json @@ -95,7 +95,9 @@ "active": "有効", "inactive": "無効", "unlimited": "無制限", - "noExpiry": "期限なし" + "noExpiry": "期限なし", + "copyAllConfigs": "すべての設定をコピー", + "copyAllConfigsCopied": "すべての設定をコピーしました" }, "menu": { "theme": "テーマ", diff --git a/internal/web/translation/pt-BR.json b/internal/web/translation/pt-BR.json index d2f8a4cc5..942b968e8 100644 --- a/internal/web/translation/pt-BR.json +++ b/internal/web/translation/pt-BR.json @@ -95,7 +95,9 @@ "active": "Ativo", "inactive": "Inativo", "unlimited": "Ilimitado", - "noExpiry": "Sem validade" + "noExpiry": "Sem validade", + "copyAllConfigs": "Copiar Todas as Configurações", + "copyAllConfigsCopied": "Todas as configurações copiadas" }, "menu": { "theme": "Tema", diff --git a/internal/web/translation/ru-RU.json b/internal/web/translation/ru-RU.json index 542b74a47..e7ec1b736 100644 --- a/internal/web/translation/ru-RU.json +++ b/internal/web/translation/ru-RU.json @@ -95,7 +95,9 @@ "active": "Активна", "inactive": "Неактивна", "unlimited": "Неограниченно", - "noExpiry": "Бессрочно" + "noExpiry": "Бессрочно", + "copyAllConfigs": "Копировать все конфигурации", + "copyAllConfigsCopied": "Все конфигурации скопированы" }, "menu": { "theme": "Тема", diff --git a/internal/web/translation/tr-TR.json b/internal/web/translation/tr-TR.json index 4d5ab5e9a..9710abbcc 100644 --- a/internal/web/translation/tr-TR.json +++ b/internal/web/translation/tr-TR.json @@ -95,7 +95,9 @@ "active": "Aktif", "inactive": "Pasif", "unlimited": "Sınırsız", - "noExpiry": "Süresiz" + "noExpiry": "Süresiz", + "copyAllConfigs": "Tüm Yapılandırmaları Kopyala", + "copyAllConfigsCopied": "Tüm yapılandırmalar kopyalandı" }, "menu": { "theme": "Tema", diff --git a/internal/web/translation/uk-UA.json b/internal/web/translation/uk-UA.json index bfca9cf10..e2efa3bc5 100644 --- a/internal/web/translation/uk-UA.json +++ b/internal/web/translation/uk-UA.json @@ -95,7 +95,9 @@ "active": "Активна", "inactive": "Неактивна", "unlimited": "Безліміт", - "noExpiry": "Без строку" + "noExpiry": "Без строку", + "copyAllConfigs": "Копіювати всі конфігурації", + "copyAllConfigsCopied": "Всі конфігурації скопійовано" }, "menu": { "theme": "Тема", diff --git a/internal/web/translation/vi-VN.json b/internal/web/translation/vi-VN.json index 18c879aca..26f6e1218 100644 --- a/internal/web/translation/vi-VN.json +++ b/internal/web/translation/vi-VN.json @@ -95,7 +95,9 @@ "active": "Hoạt động", "inactive": "Không hoạt động", "unlimited": "Không giới hạn", - "noExpiry": "Không hết hạn" + "noExpiry": "Không hết hạn", + "copyAllConfigs": "Sao chép tất cả cấu hình", + "copyAllConfigsCopied": "Đã sao chép tất cả cấu hình" }, "menu": { "theme": "Chủ đề", diff --git a/internal/web/translation/zh-CN.json b/internal/web/translation/zh-CN.json index 5e7b3fc87..ced2ae348 100644 --- a/internal/web/translation/zh-CN.json +++ b/internal/web/translation/zh-CN.json @@ -95,7 +95,9 @@ "active": "启用", "inactive": "停用", "unlimited": "无限制", - "noExpiry": "无到期" + "noExpiry": "无到期", + "copyAllConfigs": "复制全部配置", + "copyAllConfigsCopied": "已复制全部配置" }, "menu": { "theme": "主题", diff --git a/internal/web/translation/zh-TW.json b/internal/web/translation/zh-TW.json index c005ad6fd..4d28ed63c 100644 --- a/internal/web/translation/zh-TW.json +++ b/internal/web/translation/zh-TW.json @@ -95,7 +95,9 @@ "active": "啟用", "inactive": "停用", "unlimited": "無限制", - "noExpiry": "無到期" + "noExpiry": "無到期", + "copyAllConfigs": "複製全部配置", + "copyAllConfigsCopied": "已複製全部配置" }, "menu": { "theme": "主題",