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')}
+
+ }
+ onClick={copyAll}
+ aria-label={t('subscription.copyAllConfigs')}
+ title={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": "主題",