Parcourir la source

i18n: sync 12 locales with en-US — add missing Hosts/subscription keys

MHSanaei il y a 10 heures
Parent
commit
5038fa1cec

+ 115 - 3
internal/web/translation/ar-EG.json

@@ -97,7 +97,8 @@
     "unlimited": "غير محدود",
     "noExpiry": "بدون انتهاء",
     "copyAllConfigs": "نسخ جميع الإعدادات",
-    "copyAllConfigsCopied": "تم نسخ جميع الإعدادات"
+    "copyAllConfigsCopied": "تم نسخ جميع الإعدادات",
+    "email": "البريد"
   },
   "menu": {
     "theme": "الثيم",
@@ -113,7 +114,8 @@
     "apiDocs": "توثيق API",
     "logout": "تسجيل خروج",
     "link": "إدارة",
-    "donate": "تبرع"
+    "donate": "تبرع",
+    "hosts": "المضيفات"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "انتهت مهلة الاتصال — تعذّر الوصول إلى الخادم",
       "smtpErrorRelay": "الخادم يرفض الإرسال من هذا العنوان",
       "smtpErrorEof": "تم إغلاق الاتصال من قبل الخادم",
-      "smtpErrorUnknown": "خطأ SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "خطأ SMTP: {{ .Error }}",
+      "remarkTemplate": "قالب الملاحظة",
+      "remarkTemplateDesc": "عند تعيينه، يحل هذا محل نموذج الملاحظة لكل رابط اشتراك — اكتب صيغتك الخاصة باستخدام رموز المتغيرات (استخدم الزر لإدراجها). اتركه فارغاً لاستخدام النموذج أعلاه."
     },
     "xray": {
       "title": "إعدادات Xray",
@@ -1680,6 +1684,114 @@
         "ipPool": "نطاق IP Pool",
         "poolSize": "حجم المجموعة"
       }
+    },
+    "hosts": {
+      "addHost": "إضافة مضيف",
+      "editHost": "تعديل المضيف",
+      "selectInbound": "اختر وارداً",
+      "selectedCount": "{count} محدد",
+      "summary": {
+        "total": "الإجمالي",
+        "enabled": "مفعّل",
+        "disabled": "معطّل"
+      },
+      "moveUp": "تحريك لأعلى",
+      "moveDown": "تحريك لأسفل",
+      "bulkEnable": "تفعيل",
+      "bulkDisable": "تعطيل",
+      "bulkDelete": "حذف",
+      "bulkDeleteConfirm": "حذف {count} مضيف محدد؟",
+      "deleteConfirmTitle": "حذف المضيف \"{name}\"؟",
+      "sections": {
+        "basic": "أساسي",
+        "security": "الأمان",
+        "advanced": "متقدم",
+        "general": "عام",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "ملاحظة",
+        "serverDescription": "الوصف",
+        "inbound": "الوارد",
+        "address": "العنوان",
+        "port": "المنفذ",
+        "endpoint": "النهاية",
+        "enable": "مفعل",
+        "actions": "الإجراءات",
+        "security": "الأمان",
+        "sni": "SNI",
+        "overrideSniFromAddress": "استخدم العنوان كـ SNI",
+        "keepSniBlank": "اترك SNI فارغاً",
+        "hostHeader": "ترويسة Host",
+        "path": "المسار",
+        "alpn": "ALPN",
+        "fingerprint": "بصمة",
+        "pins": "SHA-256 للشهادة المثبّتة",
+        "verifyPeerCertByName": "التحقق من شهادة النظير بالاسم",
+        "allowInsecure": "السماح بغير الآمن",
+        "echConfigList": "قائمة إعدادات ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "مسار VLESS",
+        "mihomoIpVersion": "إصدار IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "خلط المضيف",
+        "tags": "وسوم",
+        "nodeGuids": "النودز",
+        "excludeFromSubTypes": "استبعاد من الصيغ"
+      },
+      "hints": {
+        "address": "اتركه فارغاً ليرث عنوان الوارد نفسه.",
+        "port": "0 يرث منفذ الوارد.",
+        "tags": "غير مرئي للمستخدمين النهائيين؛ يُرسل مع اشتراك RAW فقط. أحرف كبيرة وأرقام و _ و : فقط.",
+        "nodeGuids": "اختر النودز التي تم تحليلها من هذا المضيف. تعيين بصري فقط.",
+        "serverDescription": "ملاحظة اختيارية تظهر تحت الملاحظة.",
+        "allowInsecure": "تخطّي التحقق من شهادة TLS (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "المنافذ/النطاقات الموجَّهة عبر VLESS، مثل 53,443,1000-2000. اتركه فارغاً لعدم وجود أي منها.",
+        "remark": "تسمية بسيطة لهذا المضيف. تظهر كاسم للإعداد فقط عندما لا يكون للوارد ملاحظة خاصة به."
+      },
+      "remarkVars": {
+        "title": "متغيرات القالب",
+        "intro": "اضغط على متغير لإضافته. يتم استبداله لكل عميل عند إنشاء الاشتراك.",
+        "preview": "معاينة",
+        "groups": {
+          "client": "العميل",
+          "traffic": "حركة المرور",
+          "time": "الوقت والحالة"
+        },
+        "descEMAIL": "بريد العميل",
+        "descINBOUND": "اسم الإعداد: ملاحظة المضيف عند تعيينها، وإلا ملاحظة الوارد",
+        "descHOST": "ملاحظة المضيف",
+        "descID": "UUID العميل",
+        "descSHORT_ID": "أول 8 أحرف من الـ UUID",
+        "descTELEGRAM_ID": "معرّف تلغرام للعميل (فارغ إذا لم يُحدَّد)",
+        "descSUB_ID": "معرّف الاشتراك",
+        "descCOMMENT": "تعليق العميل",
+        "descTRAFFIC_USED": "حركة المرور المستخدمة (قابلة للقراءة)",
+        "descTRAFFIC_LEFT": "حركة المرور المتبقية (مخفية إذا كانت غير محدودة)",
+        "descTRAFFIC_TOTAL": "إجمالي حركة المرور (مخفي إذا كان غير محدود)",
+        "descTRAFFIC_USED_BYTES": "حركة المرور المستخدمة بالبايت",
+        "descTRAFFIC_LEFT_BYTES": "حركة المرور المتبقية بالبايت",
+        "descTRAFFIC_TOTAL_BYTES": "إجمالي حركة المرور بالبايت",
+        "descUP": "حركة مرور الرفع",
+        "descDOWN": "حركة مرور التنزيل",
+        "descSTATUS": "نشط / منتهٍ / معطّل / مستنفد",
+        "descDAYS_LEFT": "الأيام حتى الانتهاء (مخفية إذا كانت غير محدودة)",
+        "descEXPIRE_DATE": "تاريخ الانتهاء (YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "الانتهاء كطابع زمني Unix (بالثواني)",
+        "descCREATED_UNIX": "وقت الإنشاء كطابع زمني Unix (بالثواني)",
+        "descRESET_DAYS": "فترة إعادة تعيين حركة المرور بالأيام"
+      },
+      "toasts": {
+        "list": "فشل تحميل المضيفات",
+        "obtain": "فشل تحميل المضيف",
+        "add": "إضافة مضيف",
+        "update": "تحديث المضيف",
+        "delete": "حذف المضيف",
+        "badTag": "وسم غير صالح",
+        "badVlessRoute": "استخدم منافذ/نطاقات مثل 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/es-ES.json

@@ -97,7 +97,8 @@
     "unlimited": "Ilimitado",
     "noExpiry": "Sin caducidad",
     "copyAllConfigs": "Copiar Todas las Configuraciones",
-    "copyAllConfigsCopied": "Todas las configuraciones copiadas"
+    "copyAllConfigsCopied": "Todas las configuraciones copiadas",
+    "email": "Email"
   },
   "menu": {
     "theme": "Tema",
@@ -113,7 +114,8 @@
     "apiDocs": "Documentación de la API",
     "logout": "Cerrar Sesión",
     "link": "Gestionar",
-    "donate": "Donar"
+    "donate": "Donar",
+    "hosts": "Hosts"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Tiempo de conexión agotado: servidor inaccesible",
       "smtpErrorRelay": "El servidor rechaza el envío desde esta dirección",
       "smtpErrorEof": "Conexión cerrada por el servidor",
-      "smtpErrorUnknown": "Error de SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "Error de SMTP: {{ .Error }}",
+      "remarkTemplate": "Plantilla de notas",
+      "remarkTemplateDesc": "Cuando se define, esto reemplaza el modelo de notas para cada enlace de suscripción — escribe tu propio formato con los tokens de variable (usa el botón para insertarlos). Déjalo vacío para usar el modelo anterior."
     },
     "xray": {
       "title": "Xray Configuración",
@@ -1680,6 +1684,114 @@
         "ipPool": "Subred del grupo de IP",
         "poolSize": "Tamaño del grupo"
       }
+    },
+    "hosts": {
+      "addHost": "Agregar host",
+      "editHost": "Editar host",
+      "selectInbound": "Selecciona un inbound",
+      "selectedCount": "{count} seleccionado(s)",
+      "summary": {
+        "total": "Total",
+        "enabled": "Habilitados",
+        "disabled": "Deshabilitados"
+      },
+      "moveUp": "Subir",
+      "moveDown": "Bajar",
+      "bulkEnable": "Habilitar",
+      "bulkDisable": "Deshabilitar",
+      "bulkDelete": "Eliminar",
+      "bulkDeleteConfirm": "¿Eliminar {count} host(s) seleccionado(s)?",
+      "deleteConfirmTitle": "¿Eliminar el host \"{name}\"?",
+      "sections": {
+        "basic": "Básico",
+        "security": "Seguridad",
+        "advanced": "Avanzado",
+        "general": "General",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Notas",
+        "serverDescription": "Descripción",
+        "inbound": "Inbound",
+        "address": "Dirección",
+        "port": "Puerto",
+        "endpoint": "Punto final",
+        "enable": "Habilitar",
+        "actions": "Acciones",
+        "security": "Seguridad",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Usar la dirección como SNI",
+        "keepSniBlank": "Dejar el SNI en blanco",
+        "hostHeader": "Cabecera Host",
+        "path": "Ruta",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "SHA-256 del cert. fijado",
+        "verifyPeerCertByName": "Verificar cert. del par por nombre",
+        "allowInsecure": "Permitir inseguro",
+        "echConfigList": "Lista de config. ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Máscara final",
+        "vlessRoute": "Ruta VLESS",
+        "mihomoIpVersion": "Versión de IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Barajar host",
+        "tags": "Etiquetas",
+        "nodeGuids": "Nodos",
+        "excludeFromSubTypes": "Excluir de formatos"
+      },
+      "hints": {
+        "address": "Déjalo en blanco para heredar la dirección propia del inbound.",
+        "port": "0 hereda el puerto del inbound.",
+        "tags": "No visible para los usuarios finales; se envía solo con la suscripción RAW. Solo letras mayúsculas, dígitos, _ y :.",
+        "nodeGuids": "Elige los nodos que se resolvieron desde este host. Solo asignación visual.",
+        "serverDescription": "Nota opcional que se muestra bajo las notas.",
+        "allowInsecure": "Omitir la verificación del certificado TLS (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "Puertos/rangos enrutados a través de VLESS, p. ej. 53,443,1000-2000. Déjalo en blanco para ninguno.",
+        "remark": "Una etiqueta simple para este host. Se muestra como nombre de la configuración solo cuando el inbound no tiene notas propias."
+      },
+      "remarkVars": {
+        "title": "Variables de plantilla",
+        "intro": "Haz clic en una variable para añadirla. Se sustituye por cliente al generar la suscripción.",
+        "preview": "Vista previa",
+        "groups": {
+          "client": "Cliente",
+          "traffic": "Tráfico",
+          "time": "Tiempo y estado"
+        },
+        "descEMAIL": "Email del cliente",
+        "descINBOUND": "Nombre de la configuración: las notas del host cuando están definidas, de lo contrario las notas del inbound",
+        "descHOST": "Notas del host",
+        "descID": "UUID del cliente",
+        "descSHORT_ID": "Primeros 8 caracteres del UUID",
+        "descTELEGRAM_ID": "ID de Telegram del cliente (vacío si no está definido)",
+        "descSUB_ID": "ID de suscripción",
+        "descCOMMENT": "Comentario del cliente",
+        "descTRAFFIC_USED": "Tráfico usado (legible)",
+        "descTRAFFIC_LEFT": "Tráfico restante (oculto si es ilimitado)",
+        "descTRAFFIC_TOTAL": "Tráfico total (oculto si es ilimitado)",
+        "descTRAFFIC_USED_BYTES": "Tráfico usado en bytes",
+        "descTRAFFIC_LEFT_BYTES": "Tráfico restante en bytes",
+        "descTRAFFIC_TOTAL_BYTES": "Tráfico total en bytes",
+        "descUP": "Tráfico de subida",
+        "descDOWN": "Tráfico de bajada",
+        "descSTATUS": "activo / expirado / deshabilitado / agotado",
+        "descDAYS_LEFT": "Días hasta la expiración (oculto si es ilimitado)",
+        "descEXPIRE_DATE": "Fecha de expiración (AAAA-MM-DD)",
+        "descEXPIRE_UNIX": "Expiración como marca de tiempo Unix (segundos)",
+        "descCREATED_UNIX": "Hora de creación como marca de tiempo Unix (segundos)",
+        "descRESET_DAYS": "Periodo de reinicio de tráfico en días"
+      },
+      "toasts": {
+        "list": "Error al cargar los hosts",
+        "obtain": "Error al cargar el host",
+        "add": "Agregar host",
+        "update": "Actualizar host",
+        "delete": "Eliminar host",
+        "badTag": "Etiqueta no válida",
+        "badVlessRoute": "Usa puertos/rangos como 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 110 - 1
internal/web/translation/fa-IR.json

@@ -114,7 +114,8 @@
     "apiDocs": "مستندات API",
     "logout": "خروج",
     "link": "مدیریت",
-    "donate": "حمایت مالی"
+    "donate": "حمایت مالی",
+    "hosts": "میزبان‌ها"
   },
   "pages": {
     "login": {
@@ -1683,6 +1684,114 @@
         "ipPool": "زیرشبکه استخر آی‌پی",
         "poolSize": "اندازه استخر"
       }
+    },
+    "hosts": {
+      "addHost": "افزودن میزبان",
+      "editHost": "ویرایش میزبان",
+      "selectInbound": "یک اینباند انتخاب کنید",
+      "selectedCount": "{count} انتخاب‌شده",
+      "summary": {
+        "total": "کل",
+        "enabled": "فعال",
+        "disabled": "غیرفعال"
+      },
+      "moveUp": "انتقال به بالا",
+      "moveDown": "انتقال به پایین",
+      "bulkEnable": "فعال‌سازی",
+      "bulkDisable": "غیرفعال‌سازی",
+      "bulkDelete": "حذف",
+      "bulkDeleteConfirm": "{count} میزبان انتخاب‌شده حذف شود؟",
+      "deleteConfirmTitle": "میزبان «{name}» حذف شود؟",
+      "sections": {
+        "basic": "پایه",
+        "security": "امنیت",
+        "advanced": "پیشرفته",
+        "general": "عمومی",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "نام",
+        "serverDescription": "توضیحات",
+        "inbound": "اینباند",
+        "address": "آدرس",
+        "port": "پورت",
+        "endpoint": "نقطه پایانی",
+        "enable": "فعال",
+        "actions": "عملیات",
+        "security": "امنیت",
+        "sni": "SNI",
+        "overrideSniFromAddress": "استفاده از آدرس به‌عنوان SNI",
+        "keepSniBlank": "SNI خالی بماند",
+        "hostHeader": "هدر Host",
+        "path": "مسیر",
+        "alpn": "ALPN",
+        "fingerprint": "اثرانگشت",
+        "pins": "SHA-256 پین‌شدهٔ گواهی",
+        "verifyPeerCertByName": "بررسی گواهی همتا بر اساس نام",
+        "allowInsecure": "اجازهٔ اتصال ناامن",
+        "echConfigList": "فهرست پیکربندی ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "ماسک نهایی",
+        "vlessRoute": "مسیر VLESS",
+        "mihomoIpVersion": "نسخه IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "درهم‌سازی میزبان",
+        "tags": "برچسب‌ها",
+        "nodeGuids": "نودها",
+        "excludeFromSubTypes": "حذف از فرمت‌ها"
+      },
+      "hints": {
+        "address": "برای ارث‌بری آدرس خودِ اینباند خالی بگذارید.",
+        "port": "مقدار ۰ پورت اینباند را به ارث می‌برد.",
+        "tags": "برای کاربران نهایی قابل مشاهده نیست؛ فقط با اشتراک RAW ارسال می‌شود. تنها حروف بزرگ، ارقام، _ و : مجاز است.",
+        "nodeGuids": "نودهایی را که از این میزبان resolve می‌شوند انتخاب کنید. صرفاً انتساب نمایشی است.",
+        "serverDescription": "یادداشت اختیاری که زیر نام نمایش داده می‌شود.",
+        "allowInsecure": "رد کردن بررسی گواهی TLS (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "پورت‌ها/بازه‌هایی که از طریق VLESS مسیریابی می‌شوند، مثلاً 53,443,1000-2000. برای هیچ‌کدام خالی بگذارید.",
+        "remark": "یک برچسب ساده برای این میزبان. تنها زمانی به‌عنوان نام کانفیگ نمایش داده می‌شود که اینباند نام مخصوص خود را نداشته باشد."
+      },
+      "remarkVars": {
+        "title": "متغیرهای قالب",
+        "intro": "برای افزودن یک متغیر روی آن کلیک کنید. هنگام ساخت اشتراک، برای هر کاربر جایگزین می‌شود.",
+        "preview": "پیش‌نمایش",
+        "groups": {
+          "client": "کاربر",
+          "traffic": "ترافیک",
+          "time": "زمان و وضعیت"
+        },
+        "descEMAIL": "ایمیل کاربر",
+        "descINBOUND": "نام کانفیگ: نام میزبان در صورت تنظیم، در غیر این صورت نام اینباند",
+        "descHOST": "نام میزبان",
+        "descID": "UUID کاربر",
+        "descSHORT_ID": "۸ کاراکتر اول UUID",
+        "descTELEGRAM_ID": "شناسهٔ تلگرام کاربر (در صورت عدم تنظیم خالی)",
+        "descSUB_ID": "شناسهٔ اشتراک",
+        "descCOMMENT": "توضیحات کاربر",
+        "descTRAFFIC_USED": "ترافیک مصرف‌شده (قابل خواندن برای انسان)",
+        "descTRAFFIC_LEFT": "ترافیک باقی‌مانده (در صورت نامحدود بودن پنهان می‌شود)",
+        "descTRAFFIC_TOTAL": "ترافیک کل (در صورت نامحدود بودن پنهان می‌شود)",
+        "descTRAFFIC_USED_BYTES": "ترافیک مصرف‌شده به بایت",
+        "descTRAFFIC_LEFT_BYTES": "ترافیک باقی‌مانده به بایت",
+        "descTRAFFIC_TOTAL_BYTES": "ترافیک کل به بایت",
+        "descUP": "ترافیک آپلود",
+        "descDOWN": "ترافیک دانلود",
+        "descSTATUS": "فعال / منقضی‌شده / غیرفعال / مصرف‌شده",
+        "descDAYS_LEFT": "روزهای باقی‌مانده تا انقضا (در صورت نامحدود بودن پنهان می‌شود)",
+        "descEXPIRE_DATE": "تاریخ انقضا (YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "انقضا به‌صورت مهر زمانی Unix (ثانیه)",
+        "descCREATED_UNIX": "زمان ایجاد به‌صورت مهر زمانی Unix (ثانیه)",
+        "descRESET_DAYS": "دورهٔ بازنشانی ترافیک به روز"
+      },
+      "toasts": {
+        "list": "بارگذاری میزبان‌ها ناموفق",
+        "obtain": "بارگذاری میزبان ناموفق",
+        "add": "افزودن میزبان",
+        "update": "به‌روزرسانی میزبان",
+        "delete": "حذف میزبان",
+        "badTag": "برچسب نامعتبر",
+        "badVlessRoute": "از پورت‌ها/بازه‌هایی مانند 53,443,1000-2000 استفاده کنید"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/id-ID.json

@@ -97,7 +97,8 @@
     "unlimited": "Tanpa batas",
     "noExpiry": "Tanpa kedaluwarsa",
     "copyAllConfigs": "Salin Semua Konfigurasi",
-    "copyAllConfigsCopied": "Semua konfigurasi tersalin"
+    "copyAllConfigsCopied": "Semua konfigurasi tersalin",
+    "email": "Email"
   },
   "menu": {
     "theme": "Tema",
@@ -113,7 +114,8 @@
     "apiDocs": "Dokumentasi API",
     "logout": "Keluar",
     "link": "Kelola",
-    "donate": "Donasi"
+    "donate": "Donasi",
+    "hosts": "Host"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Koneksi waktu habis — host tidak dapat dijangkau",
       "smtpErrorRelay": "Server menolak pengiriman dari alamat ini",
       "smtpErrorEof": "Koneksi ditutup oleh server",
-      "smtpErrorUnknown": "Kesalahan SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "Kesalahan SMTP: {{ .Error }}",
+      "remarkTemplate": "Templat Catatan",
+      "remarkTemplateDesc": "Jika diatur, ini menggantikan model catatan untuk setiap tautan langganan — tulis format Anda sendiri dengan token variabel (gunakan tombol untuk menyisipkannya). Biarkan kosong untuk memakai model di atas."
     },
     "xray": {
       "title": "Konfigurasi Xray",
@@ -1680,6 +1684,114 @@
         "ipPool": "Subnet Kumpulan IP",
         "poolSize": "Ukuran Kolam"
       }
+    },
+    "hosts": {
+      "addHost": "Tambah Host",
+      "editHost": "Ubah Host",
+      "selectInbound": "Pilih sebuah inbound",
+      "selectedCount": "{count} dipilih",
+      "summary": {
+        "total": "Total",
+        "enabled": "Aktif",
+        "disabled": "Nonaktif"
+      },
+      "moveUp": "Naik",
+      "moveDown": "Turun",
+      "bulkEnable": "Aktifkan",
+      "bulkDisable": "Nonaktifkan",
+      "bulkDelete": "Hapus",
+      "bulkDeleteConfirm": "Hapus {count} host yang dipilih?",
+      "deleteConfirmTitle": "Hapus host \"{name}\"?",
+      "sections": {
+        "basic": "Dasar",
+        "security": "Keamanan",
+        "advanced": "Lanjutan",
+        "general": "Umum",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Catatan",
+        "serverDescription": "Deskripsi",
+        "inbound": "Inbound",
+        "address": "Alamat",
+        "port": "Port",
+        "endpoint": "Endpoint",
+        "enable": "Aktifkan",
+        "actions": "Aksi",
+        "security": "Keamanan",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Gunakan alamat sebagai SNI",
+        "keepSniBlank": "Biarkan SNI kosong",
+        "hostHeader": "Header Host",
+        "path": "Path",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "SHA-256 sertifikat tersemat",
+        "verifyPeerCertByName": "Verifikasi sertifikat peer berdasarkan nama",
+        "allowInsecure": "Izinkan tidak aman",
+        "echConfigList": "Daftar konfig ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "Rute VLESS",
+        "mihomoIpVersion": "Versi IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Acak host",
+        "tags": "Tag",
+        "nodeGuids": "Node",
+        "excludeFromSubTypes": "Kecualikan dari format"
+      },
+      "hints": {
+        "address": "Biarkan kosong untuk mewarisi alamat inbound itu sendiri.",
+        "port": "0 mewarisi port inbound.",
+        "tags": "Tidak terlihat oleh pengguna akhir; hanya dikirim dengan langganan RAW. Hanya huruf kapital, angka, _ dan :.",
+        "nodeGuids": "Pilih node yang teresolusi dari host ini. Hanya penetapan visual.",
+        "serverDescription": "Catatan opsional yang ditampilkan di bawah catatan.",
+        "allowInsecure": "Lewati verifikasi sertifikat TLS (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "Port/rentang yang dirutekan melalui VLESS, mis. 53,443,1000-2000. Biarkan kosong jika tidak ada.",
+        "remark": "Label sederhana untuk host ini. Ditampilkan sebagai nama konfigurasi hanya ketika inbound tidak memiliki catatan tersendiri."
+      },
+      "remarkVars": {
+        "title": "Variabel Templat",
+        "intro": "Klik sebuah variabel untuk menambahkannya. Variabel diganti per klien saat langganan dibuat.",
+        "preview": "Pratinjau",
+        "groups": {
+          "client": "Klien",
+          "traffic": "Trafik",
+          "time": "Waktu & status"
+        },
+        "descEMAIL": "Email klien",
+        "descINBOUND": "Nama konfigurasi: catatan host bila diatur, jika tidak catatan inbound",
+        "descHOST": "Catatan host",
+        "descID": "UUID klien",
+        "descSHORT_ID": "8 karakter pertama dari UUID",
+        "descTELEGRAM_ID": "ID Telegram klien (kosong jika tidak diatur)",
+        "descSUB_ID": "ID langganan",
+        "descCOMMENT": "Komentar klien",
+        "descTRAFFIC_USED": "Trafik terpakai (mudah dibaca)",
+        "descTRAFFIC_LEFT": "Trafik tersisa (disembunyikan jika tanpa batas)",
+        "descTRAFFIC_TOTAL": "Total trafik (disembunyikan jika tanpa batas)",
+        "descTRAFFIC_USED_BYTES": "Trafik terpakai dalam byte",
+        "descTRAFFIC_LEFT_BYTES": "Trafik tersisa dalam byte",
+        "descTRAFFIC_TOTAL_BYTES": "Total trafik dalam byte",
+        "descUP": "Trafik unggah",
+        "descDOWN": "Trafik unduh",
+        "descSTATUS": "aktif / kedaluwarsa / nonaktif / habis",
+        "descDAYS_LEFT": "Hari hingga kedaluwarsa (disembunyikan jika tanpa batas)",
+        "descEXPIRE_DATE": "Tanggal kedaluwarsa (YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "Kedaluwarsa sebagai timestamp Unix (detik)",
+        "descCREATED_UNIX": "Waktu pembuatan sebagai timestamp Unix (detik)",
+        "descRESET_DAYS": "Periode reset trafik dalam hari"
+      },
+      "toasts": {
+        "list": "Gagal memuat host",
+        "obtain": "Gagal memuat host",
+        "add": "Tambah host",
+        "update": "Perbarui host",
+        "delete": "Hapus host",
+        "badTag": "Tag tidak valid",
+        "badVlessRoute": "Gunakan port/rentang seperti 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/ja-JP.json

@@ -97,7 +97,8 @@
     "unlimited": "無制限",
     "noExpiry": "期限なし",
     "copyAllConfigs": "すべての設定をコピー",
-    "copyAllConfigsCopied": "すべての設定をコピーしました"
+    "copyAllConfigsCopied": "すべての設定をコピーしました",
+    "email": "メール"
   },
   "menu": {
     "theme": "テーマ",
@@ -113,7 +114,8 @@
     "apiDocs": "API ドキュメント",
     "logout": "ログアウト",
     "link": "リンク管理",
-    "donate": "寄付"
+    "donate": "寄付",
+    "hosts": "ホスト"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "接続がタイムアウトしました — ホストに到達できません",
       "smtpErrorRelay": "サーバーはこのアドレスからの送信を拒否しています",
       "smtpErrorEof": "サーバーによって接続が閉じられました",
-      "smtpErrorUnknown": "SMTPエラー: {{ .Error }}"
+      "smtpErrorUnknown": "SMTPエラー: {{ .Error }}",
+      "remarkTemplate": "備考テンプレート",
+      "remarkTemplateDesc": "設定すると、すべてのサブスクリプションリンクの備考モデルを置き換えます — 変数トークンを使って独自の形式を記述してください(ボタンで挿入できます)。空欄にすると上記のモデルが使用されます。"
     },
     "xray": {
       "title": "Xray 設定",
@@ -1680,6 +1684,114 @@
         "ipPool": "IPプールサブネット",
         "poolSize": "プールサイズ"
       }
+    },
+    "hosts": {
+      "addHost": "ホストを追加",
+      "editHost": "ホストを編集",
+      "selectInbound": "インバウンドを選択",
+      "selectedCount": "{count} 選択中",
+      "summary": {
+        "total": "合計",
+        "enabled": "有効",
+        "disabled": "無効"
+      },
+      "moveUp": "上へ",
+      "moveDown": "下へ",
+      "bulkEnable": "有効化",
+      "bulkDisable": "無効化",
+      "bulkDelete": "削除",
+      "bulkDeleteConfirm": "選択した {count} 件のホストを削除しますか?",
+      "deleteConfirmTitle": "ホスト「{name}」を削除しますか?",
+      "sections": {
+        "basic": "基本",
+        "security": "セキュリティ",
+        "advanced": "詳細",
+        "general": "一般",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "備考",
+        "serverDescription": "説明",
+        "inbound": "インバウンド",
+        "address": "アドレス",
+        "port": "ポート",
+        "endpoint": "エンドポイント",
+        "enable": "有効化",
+        "actions": "操作",
+        "security": "セキュリティ",
+        "sni": "SNI",
+        "overrideSniFromAddress": "アドレスを SNI として使用",
+        "keepSniBlank": "SNI を空のままにする",
+        "hostHeader": "Host ヘッダー",
+        "path": "パス",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "ピン留め証明書 SHA-256",
+        "verifyPeerCertByName": "名前でピア証明書を検証",
+        "allowInsecure": "安全でない接続を許可",
+        "echConfigList": "ECH config リスト",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "VLESS ルート",
+        "mihomoIpVersion": "IP バージョン",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "ホストをシャッフル",
+        "tags": "タグ",
+        "nodeGuids": "ノード",
+        "excludeFromSubTypes": "形式から除外"
+      },
+      "hints": {
+        "address": "空欄にするとインバウンド自身のアドレスを継承します。",
+        "port": "0 にするとインバウンドのポートを継承します。",
+        "tags": "エンドユーザーには表示されません。RAW サブスクリプションでのみ送信されます。大文字、数字、_ と : のみ使用できます。",
+        "nodeGuids": "このホストから解決されたノードを選択します。視覚的な割り当てのみです。",
+        "serverDescription": "備考の下に表示される任意のメモ。",
+        "allowInsecure": "TLS 証明書の検証をスキップします(allowInsecure / skip-cert-verify)。",
+        "vlessRoute": "VLESS 経由でルーティングするポート/範囲。例: 53,443,1000-2000。なしの場合は空欄にします。",
+        "remark": "このホストのプレーンなラベル。インバウンド自身に備考がない場合にのみ設定名として表示されます。"
+      },
+      "remarkVars": {
+        "title": "テンプレート変数",
+        "intro": "変数をクリックすると追加されます。サブスクリプション生成時にクライアントごとに置き換えられます。",
+        "preview": "プレビュー",
+        "groups": {
+          "client": "クライアント",
+          "traffic": "トラフィック",
+          "time": "時刻とステータス"
+        },
+        "descEMAIL": "クライアントのメール",
+        "descINBOUND": "設定名: ホストの備考が設定されている場合はそれ、それ以外はインバウンドの備考",
+        "descHOST": "ホストの備考",
+        "descID": "クライアント UUID",
+        "descSHORT_ID": "UUID の最初の 8 文字",
+        "descTELEGRAM_ID": "クライアントの Telegram ID(未設定の場合は空)",
+        "descSUB_ID": "サブスクリプション ID",
+        "descCOMMENT": "クライアントのコメント",
+        "descTRAFFIC_USED": "使用済みトラフィック(人間が読みやすい形式)",
+        "descTRAFFIC_LEFT": "残りトラフィック(無制限の場合は非表示)",
+        "descTRAFFIC_TOTAL": "合計トラフィック(無制限の場合は非表示)",
+        "descTRAFFIC_USED_BYTES": "使用済みトラフィック(バイト)",
+        "descTRAFFIC_LEFT_BYTES": "残りトラフィック(バイト)",
+        "descTRAFFIC_TOTAL_BYTES": "合計トラフィック(バイト)",
+        "descUP": "アップロードトラフィック",
+        "descDOWN": "ダウンロードトラフィック",
+        "descSTATUS": "active / expired / disabled / depleted",
+        "descDAYS_LEFT": "有効期限までの日数(無制限の場合は非表示)",
+        "descEXPIRE_DATE": "有効期限(YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "有効期限の Unix タイムスタンプ(秒)",
+        "descCREATED_UNIX": "作成時刻の Unix タイムスタンプ(秒)",
+        "descRESET_DAYS": "トラフィックリセット周期(日数)"
+      },
+      "toasts": {
+        "list": "ホストの読み込みに失敗しました",
+        "obtain": "ホストの読み込みに失敗しました",
+        "add": "ホストを追加",
+        "update": "ホストを更新",
+        "delete": "ホストを削除",
+        "badTag": "無効なタグ",
+        "badVlessRoute": "53,443,1000-2000 のようにポート/範囲を指定してください"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/pt-BR.json

@@ -97,7 +97,8 @@
     "unlimited": "Ilimitado",
     "noExpiry": "Sem validade",
     "copyAllConfigs": "Copiar Todas as Configurações",
-    "copyAllConfigsCopied": "Todas as configurações copiadas"
+    "copyAllConfigsCopied": "Todas as configurações copiadas",
+    "email": "Email"
   },
   "menu": {
     "theme": "Tema",
@@ -113,7 +114,8 @@
     "apiDocs": "Documentação da API",
     "logout": "Sair",
     "link": "Gerenciar",
-    "donate": "Doar"
+    "donate": "Doar",
+    "hosts": "Hosts"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Tempo de conexão esgotado — host inacessível",
       "smtpErrorRelay": "O servidor rejeita o envio a partir deste endereço",
       "smtpErrorEof": "Conexão encerrada pelo servidor",
-      "smtpErrorUnknown": "Erro de SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "Erro de SMTP: {{ .Error }}",
+      "remarkTemplate": "Modelo de Observação",
+      "remarkTemplateDesc": "Quando definido, isto substitui o modelo de observação de cada link de assinatura — escreva seu próprio formato com os tokens de variáveis (use o botão para inseri-los). Deixe vazio para usar o modelo acima."
     },
     "xray": {
       "title": "Configurações Xray",
@@ -1680,6 +1684,114 @@
         "ipPool": "Sub-rede do Pool de IP",
         "poolSize": "Tamanho do Pool"
       }
+    },
+    "hosts": {
+      "addHost": "Adicionar Host",
+      "editHost": "Editar Host",
+      "selectInbound": "Selecione uma entrada",
+      "selectedCount": "{count} selecionado(s)",
+      "summary": {
+        "total": "Total",
+        "enabled": "Ativados",
+        "disabled": "Desativados"
+      },
+      "moveUp": "Mover para cima",
+      "moveDown": "Mover para baixo",
+      "bulkEnable": "Ativar",
+      "bulkDisable": "Desativar",
+      "bulkDelete": "Excluir",
+      "bulkDeleteConfirm": "Excluir {count} host(s) selecionado(s)?",
+      "deleteConfirmTitle": "Excluir o host \"{name}\"?",
+      "sections": {
+        "basic": "Básico",
+        "security": "Segurança",
+        "advanced": "Avançado",
+        "general": "Geral",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Observação",
+        "serverDescription": "Descrição",
+        "inbound": "Entrada",
+        "address": "Endereço",
+        "port": "Porta",
+        "endpoint": "Endpoint",
+        "enable": "Ativado",
+        "actions": "Ações",
+        "security": "Segurança",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Usar endereço como SNI",
+        "keepSniBlank": "Manter SNI em branco",
+        "hostHeader": "Cabeçalho Host",
+        "path": "Caminho",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "SHA-256 do certificado fixado",
+        "verifyPeerCertByName": "Verificar certificado do par pelo nome",
+        "allowInsecure": "Permitir inseguro",
+        "echConfigList": "Lista de configurações ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "Rota VLESS",
+        "mihomoIpVersion": "Versão de IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Embaralhar host",
+        "tags": "Tags",
+        "nodeGuids": "Nós",
+        "excludeFromSubTypes": "Excluir dos formatos"
+      },
+      "hints": {
+        "address": "Deixe em branco para herdar o próprio endereço da entrada.",
+        "port": "0 herda a porta da entrada.",
+        "tags": "Não visível aos usuários finais; enviado apenas na assinatura RAW. Apenas letras maiúsculas, dígitos, _ e :.",
+        "nodeGuids": "Escolha os nós que foram resolvidos a partir deste host. Apenas atribuição visual.",
+        "serverDescription": "Nota opcional exibida abaixo da observação.",
+        "allowInsecure": "Ignorar a verificação do certificado TLS (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "Portas/intervalos roteados via VLESS, ex.: 53,443,1000-2000. Deixe em branco para nenhum.",
+        "remark": "Um rótulo simples para este host. Mostrado como nome da configuração apenas quando a entrada não tem observação própria."
+      },
+      "remarkVars": {
+        "title": "Variáveis de Modelo",
+        "intro": "Clique em uma variável para adicioná-la. Ela é substituída por cliente quando a assinatura é gerada.",
+        "preview": "Pré-visualização",
+        "groups": {
+          "client": "Cliente",
+          "traffic": "Tráfego",
+          "time": "Tempo e status"
+        },
+        "descEMAIL": "Email do cliente",
+        "descINBOUND": "Nome da configuração: a observação do host quando definida, caso contrário a observação da entrada",
+        "descHOST": "Observação do host",
+        "descID": "UUID do cliente",
+        "descSHORT_ID": "Primeiros 8 caracteres do UUID",
+        "descTELEGRAM_ID": "ID do Telegram do cliente (vazio se não definido)",
+        "descSUB_ID": "ID da assinatura",
+        "descCOMMENT": "Comentário do cliente",
+        "descTRAFFIC_USED": "Tráfego usado (legível por humanos)",
+        "descTRAFFIC_LEFT": "Tráfego restante (oculto se ilimitado)",
+        "descTRAFFIC_TOTAL": "Tráfego total (oculto se ilimitado)",
+        "descTRAFFIC_USED_BYTES": "Tráfego usado em bytes",
+        "descTRAFFIC_LEFT_BYTES": "Tráfego restante em bytes",
+        "descTRAFFIC_TOTAL_BYTES": "Tráfego total em bytes",
+        "descUP": "Tráfego de upload",
+        "descDOWN": "Tráfego de download",
+        "descSTATUS": "ativo / expirado / desativado / esgotado",
+        "descDAYS_LEFT": "Dias até a expiração (oculto se ilimitado)",
+        "descEXPIRE_DATE": "Data de expiração (AAAA-MM-DD)",
+        "descEXPIRE_UNIX": "Expiração como timestamp Unix (segundos)",
+        "descCREATED_UNIX": "Data de criação como timestamp Unix (segundos)",
+        "descRESET_DAYS": "Período de redefinição de tráfego em dias"
+      },
+      "toasts": {
+        "list": "Falha ao carregar os hosts",
+        "obtain": "Falha ao carregar o host",
+        "add": "Adicionar host",
+        "update": "Atualizar host",
+        "delete": "Excluir host",
+        "badTag": "Tag inválida",
+        "badVlessRoute": "Use portas/intervalos como 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/ru-RU.json

@@ -97,7 +97,8 @@
     "unlimited": "Неограниченно",
     "noExpiry": "Бессрочно",
     "copyAllConfigs": "Копировать все конфигурации",
-    "copyAllConfigsCopied": "Все конфигурации скопированы"
+    "copyAllConfigsCopied": "Все конфигурации скопированы",
+    "email": "Email"
   },
   "menu": {
     "theme": "Тема",
@@ -113,7 +114,8 @@
     "apiDocs": "Документация API",
     "logout": "Выход",
     "link": "Управление",
-    "donate": "Поддержать"
+    "donate": "Поддержать",
+    "hosts": "Хосты"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Таймаут соединения — хост недоступен",
       "smtpErrorRelay": "Сервер отклоняет отправку с этого адреса",
       "smtpErrorEof": "Соединение закрыто сервером",
-      "smtpErrorUnknown": "Ошибка SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "Ошибка SMTP: {{ .Error }}",
+      "remarkTemplate": "Шаблон примечания",
+      "remarkTemplateDesc": "Если задан, заменяет модель примечания для каждой ссылки подписки — задайте собственный формат с помощью токенов переменных (используйте кнопку для их вставки). Оставьте пустым, чтобы использовать модель выше."
     },
     "xray": {
       "title": "Настройки Xray",
@@ -1680,6 +1684,114 @@
         "ipPool": "Подсеть пула IP",
         "poolSize": "Размер пула"
       }
+    },
+    "hosts": {
+      "addHost": "Добавить хост",
+      "editHost": "Изменить хост",
+      "selectInbound": "Выберите входящее",
+      "selectedCount": "{count} выбрано",
+      "summary": {
+        "total": "Всего",
+        "enabled": "Включено",
+        "disabled": "Отключено"
+      },
+      "moveUp": "Вверх",
+      "moveDown": "Вниз",
+      "bulkEnable": "Включить",
+      "bulkDisable": "Отключить",
+      "bulkDelete": "Удалить",
+      "bulkDeleteConfirm": "Удалить выбранные хосты ({count})?",
+      "deleteConfirmTitle": "Удалить хост \"{name}\"?",
+      "sections": {
+        "basic": "Основное",
+        "security": "Безопасность",
+        "advanced": "Дополнительно",
+        "general": "Общие",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Примечание",
+        "serverDescription": "Описание",
+        "inbound": "Входящее",
+        "address": "Адрес",
+        "port": "Порт",
+        "endpoint": "Конечная точка",
+        "enable": "Включить",
+        "actions": "Действия",
+        "security": "Безопасность",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Использовать адрес как SNI",
+        "keepSniBlank": "Оставить SNI пустым",
+        "hostHeader": "Заголовок Host",
+        "path": "Путь",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "Закреплённый SHA-256 сертификата",
+        "verifyPeerCertByName": "Проверять сертификат пира по имени",
+        "allowInsecure": "Разрешить небезопасное",
+        "echConfigList": "Список конфигураций ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "Маршрут VLESS",
+        "mihomoIpVersion": "Версия IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Перемешивать хост",
+        "tags": "Теги",
+        "nodeGuids": "Узлы",
+        "excludeFromSubTypes": "Исключить из форматов"
+      },
+      "hints": {
+        "address": "Оставьте пустым, чтобы унаследовать собственный адрес входящего.",
+        "port": "0 наследует порт входящего.",
+        "tags": "Не видны конечным пользователям; отправляются только с RAW-подпиской. Только заглавные буквы, цифры, _ и :.",
+        "nodeGuids": "Выберите узлы, которые разрешаются с этого хоста. Только визуальное назначение.",
+        "serverDescription": "Необязательная заметка, отображаемая под примечанием.",
+        "allowInsecure": "Пропустить проверку TLS-сертификата (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "Порты/диапазоны, маршрутизируемые через VLESS, напр. 53,443,1000-2000. Оставьте пустым, чтобы отключить.",
+        "remark": "Обычная метка для этого хоста. Используется как имя конфигурации, только если у входящего нет собственного примечания."
+      },
+      "remarkVars": {
+        "title": "Переменные шаблона",
+        "intro": "Нажмите на переменную, чтобы добавить её. Она заменяется для каждого клиента при генерации подписки.",
+        "preview": "Предпросмотр",
+        "groups": {
+          "client": "Клиент",
+          "traffic": "Трафик",
+          "time": "Время и статус"
+        },
+        "descEMAIL": "Email клиента",
+        "descINBOUND": "Имя конфигурации: примечание хоста, если задано, иначе примечание входящего",
+        "descHOST": "Примечание хоста",
+        "descID": "UUID клиента",
+        "descSHORT_ID": "Первые 8 символов UUID",
+        "descTELEGRAM_ID": "Telegram ID клиента (пусто, если не задан)",
+        "descSUB_ID": "ID подписки",
+        "descCOMMENT": "Комментарий клиента",
+        "descTRAFFIC_USED": "Использованный трафик (в читаемом виде)",
+        "descTRAFFIC_LEFT": "Оставшийся трафик (скрыт при безлимите)",
+        "descTRAFFIC_TOTAL": "Всего трафика (скрыт при безлимите)",
+        "descTRAFFIC_USED_BYTES": "Использованный трафик в байтах",
+        "descTRAFFIC_LEFT_BYTES": "Оставшийся трафик в байтах",
+        "descTRAFFIC_TOTAL_BYTES": "Всего трафика в байтах",
+        "descUP": "Исходящий трафик",
+        "descDOWN": "Входящий трафик",
+        "descSTATUS": "активен / истёк / отключён / исчерпан",
+        "descDAYS_LEFT": "Дней до окончания (скрыто при безлимите)",
+        "descEXPIRE_DATE": "Дата окончания (ГГГГ-ММ-ДД)",
+        "descEXPIRE_UNIX": "Окончание в виде Unix-метки времени (секунды)",
+        "descCREATED_UNIX": "Время создания в виде Unix-метки времени (секунды)",
+        "descRESET_DAYS": "Период сброса трафика в днях"
+      },
+      "toasts": {
+        "list": "Не удалось загрузить хосты",
+        "obtain": "Не удалось загрузить хост",
+        "add": "Добавить хост",
+        "update": "Обновить хост",
+        "delete": "Удалить хост",
+        "badTag": "Недопустимый тег",
+        "badVlessRoute": "Используйте порты/диапазоны, например 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/tr-TR.json

@@ -97,7 +97,8 @@
     "unlimited": "Sınırsız",
     "noExpiry": "Süresiz",
     "copyAllConfigs": "Tüm Yapılandırmaları Kopyala",
-    "copyAllConfigsCopied": "Tüm yapılandırmalar kopyalandı"
+    "copyAllConfigsCopied": "Tüm yapılandırmalar kopyalandı",
+    "email": "E-posta"
   },
   "menu": {
     "theme": "Tema",
@@ -113,7 +114,8 @@
     "apiDocs": "API Belgeleri",
     "logout": "Çıkış Yap",
     "link": "Yönet",
-    "donate": "Bağış Yap"
+    "donate": "Bağış Yap",
+    "hosts": "Host'lar"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Bağlantı zaman aşımına uğradı — sunucuya ulaşılamıyor",
       "smtpErrorRelay": "Sunucu bu adresten gönderimi reddediyor",
       "smtpErrorEof": "Bağlantı sunucu tarafından kapatıldı",
-      "smtpErrorUnknown": "SMTP hatası: {{ .Error }}"
+      "smtpErrorUnknown": "SMTP hatası: {{ .Error }}",
+      "remarkTemplate": "Açıklama Şablonu",
+      "remarkTemplateDesc": "Ayarlandığında, her abonelik bağlantısının açıklama modelinin yerini alır — değişken belirteçleriyle kendi formatınızı yazın (eklemek için düğmeyi kullanın). Yukarıdaki modeli kullanmak için boş bırakın."
     },
     "xray": {
       "title": "Xray Yapılandırmaları",
@@ -1680,6 +1684,114 @@
         "ipPool": "IP Havuzu Alt Ağı",
         "poolSize": "Havuz Boyutu"
       }
+    },
+    "hosts": {
+      "addHost": "Host Ekle",
+      "editHost": "Host'u Düzenle",
+      "selectInbound": "Bir gelen bağlantı seçin",
+      "selectedCount": "{count} seçildi",
+      "summary": {
+        "total": "Toplam",
+        "enabled": "Etkin",
+        "disabled": "Devre Dışı"
+      },
+      "moveUp": "Yukarı Taşı",
+      "moveDown": "Aşağı Taşı",
+      "bulkEnable": "Etkinleştir",
+      "bulkDisable": "Devre Dışı Bırak",
+      "bulkDelete": "Sil",
+      "bulkDeleteConfirm": "Seçili {count} host silinsin mi?",
+      "deleteConfirmTitle": "\"{name}\" host'u silinsin mi?",
+      "sections": {
+        "basic": "Temel",
+        "security": "Güvenlik",
+        "advanced": "Gelişmiş",
+        "general": "Genel",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Açıklama",
+        "serverDescription": "Tanım",
+        "inbound": "Gelen Bağlantı",
+        "address": "Adres",
+        "port": "Port",
+        "endpoint": "Uç Nokta",
+        "enable": "Etkin",
+        "actions": "İşlemler",
+        "security": "Güvenlik",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Adresi SNI olarak kullan",
+        "keepSniBlank": "SNI'yi boş bırak",
+        "hostHeader": "Host başlığı",
+        "path": "Yol",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "Sabitlenmiş sertifika SHA-256",
+        "verifyPeerCertByName": "Peer sertifikasını ada göre doğrula",
+        "allowInsecure": "Güvensize izin ver",
+        "echConfigList": "ECH yapılandırma listesi",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "VLESS yönlendirme",
+        "mihomoIpVersion": "IP sürümü",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Host'u karıştır",
+        "tags": "Etiketler",
+        "nodeGuids": "Düğümler",
+        "excludeFromSubTypes": "Formatlardan hariç tut"
+      },
+      "hints": {
+        "address": "Gelen bağlantının kendi adresini devralmak için boş bırakın.",
+        "port": "0 değeri gelen bağlantının portunu devralır.",
+        "tags": "Son kullanıcılara görünmez; yalnızca RAW abonelikle gönderilir. Yalnızca büyük harf, rakam, _ ve : kullanılabilir.",
+        "nodeGuids": "Bu host'tan çözümlenen düğümleri seçin. Yalnızca görsel atama.",
+        "serverDescription": "Açıklamanın altında gösterilen isteğe bağlı not.",
+        "allowInsecure": "TLS sertifika doğrulamasını atla (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "VLESS üzerinden yönlendirilen portlar/aralıklar, örn. 53,443,1000-2000. Hiçbiri için boş bırakın.",
+        "remark": "Bu host için düz bir etiket. Yalnızca gelen bağlantının kendi açıklaması yoksa yapılandırma adı olarak gösterilir."
+      },
+      "remarkVars": {
+        "title": "Şablon Değişkenleri",
+        "intro": "Eklemek için bir değişkene tıklayın. Abonelik oluşturulduğunda her kullanıcı için değiştirilir.",
+        "preview": "Önizleme",
+        "groups": {
+          "client": "Kullanıcı",
+          "traffic": "Trafik",
+          "time": "Zaman ve durum"
+        },
+        "descEMAIL": "Kullanıcı e-postası",
+        "descINBOUND": "Yapılandırma adı: ayarlanmışsa host'un açıklaması, aksi halde gelen bağlantının açıklaması",
+        "descHOST": "Host açıklaması",
+        "descID": "Kullanıcı UUID'si",
+        "descSHORT_ID": "UUID'nin ilk 8 karakteri",
+        "descTELEGRAM_ID": "Kullanıcının Telegram ID'si (ayarlı değilse boş)",
+        "descSUB_ID": "Abonelik kimliği",
+        "descCOMMENT": "Kullanıcı yorumu",
+        "descTRAFFIC_USED": "Kullanılan trafik (okunabilir biçim)",
+        "descTRAFFIC_LEFT": "Kalan trafik (sınırsızsa gizlenir)",
+        "descTRAFFIC_TOTAL": "Toplam trafik (sınırsızsa gizlenir)",
+        "descTRAFFIC_USED_BYTES": "Kullanılan trafik (byte)",
+        "descTRAFFIC_LEFT_BYTES": "Kalan trafik (byte)",
+        "descTRAFFIC_TOTAL_BYTES": "Toplam trafik (byte)",
+        "descUP": "Yükleme trafiği",
+        "descDOWN": "İndirme trafiği",
+        "descSTATUS": "aktif / süresi dolmuş / devre dışı / tükenmiş",
+        "descDAYS_LEFT": "Süre dolana kadar kalan gün (sınırsızsa gizlenir)",
+        "descEXPIRE_DATE": "Son kullanma tarihi (YYYY-AA-GG)",
+        "descEXPIRE_UNIX": "Son kullanma Unix zaman damgası olarak (saniye)",
+        "descCREATED_UNIX": "Oluşturulma zamanı Unix zaman damgası olarak (saniye)",
+        "descRESET_DAYS": "Trafik sıfırlama periyodu (gün)"
+      },
+      "toasts": {
+        "list": "Host'lar yüklenemedi",
+        "obtain": "Host yüklenemedi",
+        "add": "Host ekle",
+        "update": "Host'u güncelle",
+        "delete": "Host'u sil",
+        "badTag": "Geçersiz etiket",
+        "badVlessRoute": "53,443,1000-2000 gibi portlar/aralıklar kullanın"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/uk-UA.json

@@ -97,7 +97,8 @@
     "unlimited": "Безліміт",
     "noExpiry": "Без строку",
     "copyAllConfigs": "Копіювати всі конфігурації",
-    "copyAllConfigsCopied": "Всі конфігурації скопійовано"
+    "copyAllConfigsCopied": "Всі конфігурації скопійовано",
+    "email": "Email"
   },
   "menu": {
     "theme": "Тема",
@@ -113,7 +114,8 @@
     "apiDocs": "Документація API",
     "logout": "Вийти",
     "link": "Керувати",
-    "donate": "Підтримати"
+    "donate": "Підтримати",
+    "hosts": "Хости"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Час очікування з'єднання вичерпано — хост недоступний",
       "smtpErrorRelay": "Сервер відхиляє надсилання з цієї адреси",
       "smtpErrorEof": "З'єднання закрито сервером",
-      "smtpErrorUnknown": "Помилка SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "Помилка SMTP: {{ .Error }}",
+      "remarkTemplate": "Шаблон примітки",
+      "remarkTemplateDesc": "Якщо задано, це замінює модель примітки для кожного посилання підписки — напишіть власний формат із токенами змінних (використовуйте кнопку для їх вставлення). Залиште порожнім, щоб використовувати модель вище."
     },
     "xray": {
       "title": "Xray конфігурації",
@@ -1680,6 +1684,114 @@
         "ipPool": "Підмережа IP-пулу",
         "poolSize": "Розмір пулу"
       }
+    },
+    "hosts": {
+      "addHost": "Додати хост",
+      "editHost": "Редагувати хост",
+      "selectInbound": "Виберіть вхідний",
+      "selectedCount": "Обрано {count}",
+      "summary": {
+        "total": "Усього",
+        "enabled": "Увімкнено",
+        "disabled": "Вимкнено"
+      },
+      "moveUp": "Вгору",
+      "moveDown": "Вниз",
+      "bulkEnable": "Увімкнути",
+      "bulkDisable": "Вимкнути",
+      "bulkDelete": "Видалити",
+      "bulkDeleteConfirm": "Видалити {count} обраних хост(ів)?",
+      "deleteConfirmTitle": "Видалити хост \"{name}\"?",
+      "sections": {
+        "basic": "Основні",
+        "security": "Безпека",
+        "advanced": "Розширені",
+        "general": "Загальні",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Примітка",
+        "serverDescription": "Опис",
+        "inbound": "Вхідний",
+        "address": "Адреса",
+        "port": "Порт",
+        "endpoint": "Кінцева точка",
+        "enable": "Увімкнути",
+        "actions": "Дії",
+        "security": "Безпека",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Використовувати адресу як SNI",
+        "keepSniBlank": "Залишити SNI порожнім",
+        "hostHeader": "Заголовок Host",
+        "path": "Шлях",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "Закріплений SHA-256 сертифіката",
+        "verifyPeerCertByName": "Перевіряти сертифікат пира за іменем",
+        "allowInsecure": "Дозволити небезпечне",
+        "echConfigList": "Список конфігурацій ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Фінальна маска",
+        "vlessRoute": "Маршрут VLESS",
+        "mihomoIpVersion": "Версія IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Перемішувати host",
+        "tags": "Теги",
+        "nodeGuids": "Вузли",
+        "excludeFromSubTypes": "Виключити з форматів"
+      },
+      "hints": {
+        "address": "Залиште порожнім, щоб успадкувати власну адресу вхідного.",
+        "port": "0 успадковує порт вхідного.",
+        "tags": "Не видно кінцевим користувачам; надсилається лише з RAW-підпискою. Лише великі літери, цифри, _ та :.",
+        "nodeGuids": "Виберіть вузли, які розв'язуються з цього хоста. Лише візуальне призначення.",
+        "serverDescription": "Необов'язкова примітка, що показується під приміткою.",
+        "allowInsecure": "Пропускати перевірку TLS-сертифіката (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "Порти/діапазони, що маршрутизуються через VLESS, напр. 53,443,1000-2000. Залиште порожнім, щоб не використовувати.",
+        "remark": "Звичайна мітка для цього хоста. Показується як назва конфігурації лише тоді, коли вхідний не має власної примітки."
+      },
+      "remarkVars": {
+        "title": "Змінні шаблону",
+        "intro": "Натисніть на змінну, щоб додати її. Вона замінюється для кожного клієнта під час генерації підписки.",
+        "preview": "Попередній перегляд",
+        "groups": {
+          "client": "Клієнт",
+          "traffic": "Трафік",
+          "time": "Час і статус"
+        },
+        "descEMAIL": "Email клієнта",
+        "descINBOUND": "Назва конфігурації: примітка хоста, якщо задана, інакше примітка вхідного",
+        "descHOST": "Примітка хоста",
+        "descID": "UUID клієнта",
+        "descSHORT_ID": "Перші 8 символів UUID",
+        "descTELEGRAM_ID": "Telegram ID клієнта (порожньо, якщо не задано)",
+        "descSUB_ID": "ID підписки",
+        "descCOMMENT": "Коментар клієнта",
+        "descTRAFFIC_USED": "Використаний трафік (у зручному форматі)",
+        "descTRAFFIC_LEFT": "Залишок трафіку (прихований, якщо безлімітний)",
+        "descTRAFFIC_TOTAL": "Загальний трафік (прихований, якщо безлімітний)",
+        "descTRAFFIC_USED_BYTES": "Використаний трафік у байтах",
+        "descTRAFFIC_LEFT_BYTES": "Залишок трафіку у байтах",
+        "descTRAFFIC_TOTAL_BYTES": "Загальний трафік у байтах",
+        "descUP": "Вихідний трафік",
+        "descDOWN": "Вхідний трафік",
+        "descSTATUS": "active / expired / disabled / depleted",
+        "descDAYS_LEFT": "Днів до закінчення (прихований, якщо безлімітний)",
+        "descEXPIRE_DATE": "Дата закінчення (YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "Закінчення як мітка часу Unix (секунди)",
+        "descCREATED_UNIX": "Час створення як мітка часу Unix (секунди)",
+        "descRESET_DAYS": "Період скидання трафіку в днях"
+      },
+      "toasts": {
+        "list": "Не вдалося завантажити хости",
+        "obtain": "Не вдалося завантажити хост",
+        "add": "Додати хост",
+        "update": "Оновити хост",
+        "delete": "Видалити хост",
+        "badTag": "Недійсний тег",
+        "badVlessRoute": "Використовуйте порти/діапазони, напр. 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/vi-VN.json

@@ -97,7 +97,8 @@
     "unlimited": "Không giới 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"
+    "copyAllConfigsCopied": "Đã sao chép tất cả cấu hình",
+    "email": "Email"
   },
   "menu": {
     "theme": "Chủ đề",
@@ -113,7 +114,8 @@
     "apiDocs": "Tài liệu API",
     "logout": "Đăng xuất",
     "link": "Quản lý",
-    "donate": "Quyên góp"
+    "donate": "Quyên góp",
+    "hosts": "Hosts"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "Hết thời gian kết nối — không thể truy cập máy chủ",
       "smtpErrorRelay": "Máy chủ từ chối gửi từ địa chỉ này",
       "smtpErrorEof": "Kết nối đã bị máy chủ đóng",
-      "smtpErrorUnknown": "Lỗi SMTP: {{ .Error }}"
+      "smtpErrorUnknown": "Lỗi SMTP: {{ .Error }}",
+      "remarkTemplate": "Mẫu ghi chú",
+      "remarkTemplateDesc": "Khi được đặt, mục này thay thế mô hình ghi chú cho mọi liên kết đăng ký — hãy viết định dạng riêng của bạn bằng các token biến (dùng nút để chèn chúng). Để trống để dùng mô hình ở trên."
     },
     "xray": {
       "title": "Cài đặt Xray",
@@ -1680,6 +1684,114 @@
         "ipPool": "Mạng con nhóm IP",
         "poolSize": "Kích thước bể bơi"
       }
+    },
+    "hosts": {
+      "addHost": "Thêm Host",
+      "editHost": "Sửa Host",
+      "selectInbound": "Chọn một inbound",
+      "selectedCount": "Đã chọn {count}",
+      "summary": {
+        "total": "Tổng",
+        "enabled": "Đã kích hoạt",
+        "disabled": "Đã tắt"
+      },
+      "moveUp": "Lên",
+      "moveDown": "Xuống",
+      "bulkEnable": "Kích hoạt",
+      "bulkDisable": "Tắt",
+      "bulkDelete": "Xóa",
+      "bulkDeleteConfirm": "Xóa {count} host đã chọn?",
+      "deleteConfirmTitle": "Xóa host \"{name}\"?",
+      "sections": {
+        "basic": "Cơ bản",
+        "security": "Bảo mật",
+        "advanced": "Nâng cao",
+        "general": "Chung",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "Ghi chú",
+        "serverDescription": "Mô tả",
+        "inbound": "Inbound",
+        "address": "Địa chỉ",
+        "port": "Cổng",
+        "endpoint": "Endpoint",
+        "enable": "Kích hoạt",
+        "actions": "Hành động",
+        "security": "Bảo mật",
+        "sni": "SNI",
+        "overrideSniFromAddress": "Dùng địa chỉ làm SNI",
+        "keepSniBlank": "Để trống SNI",
+        "hostHeader": "Host header",
+        "path": "Đường dẫn",
+        "alpn": "ALPN",
+        "fingerprint": "Fingerprint",
+        "pins": "SHA-256 chứng chỉ đã ghim",
+        "verifyPeerCertByName": "Xác minh chứng chỉ peer theo tên",
+        "allowInsecure": "Cho phép không an toàn",
+        "echConfigList": "Danh sách cấu hình ECH",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "Đường VLESS",
+        "mihomoIpVersion": "Phiên bản IP",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "Xáo trộn host",
+        "tags": "Tag",
+        "nodeGuids": "Nút",
+        "excludeFromSubTypes": "Loại trừ khỏi định dạng"
+      },
+      "hints": {
+        "address": "Để trống để kế thừa địa chỉ của chính inbound.",
+        "port": "0 sẽ kế thừa cổng của inbound.",
+        "tags": "Không hiển thị cho người dùng cuối; chỉ gửi kèm đăng ký RAW. Chỉ chữ in hoa, chữ số, _ và :.",
+        "nodeGuids": "Chọn các nút được phân giải từ host này. Chỉ là gán trực quan.",
+        "serverDescription": "Ghi chú tùy chọn hiển thị bên dưới ghi chú.",
+        "allowInsecure": "Bỏ qua xác minh chứng chỉ TLS (allowInsecure / skip-cert-verify).",
+        "vlessRoute": "Cổng/dải cổng định tuyến qua VLESS, ví dụ 53,443,1000-2000. Để trống nếu không dùng.",
+        "remark": "Nhãn đơn giản cho host này. Chỉ hiển thị làm tên cấu hình khi inbound không có ghi chú riêng."
+      },
+      "remarkVars": {
+        "title": "Biến mẫu",
+        "intro": "Nhấp vào một biến để thêm. Biến được thay thế cho từng client khi tạo đăng ký.",
+        "preview": "Xem trước",
+        "groups": {
+          "client": "Khách hàng",
+          "traffic": "Lưu lượng",
+          "time": "Thời gian & trạng thái"
+        },
+        "descEMAIL": "Email khách hàng",
+        "descINBOUND": "Tên cấu hình: ghi chú của host nếu được đặt, nếu không thì ghi chú của inbound",
+        "descHOST": "Ghi chú host",
+        "descID": "UUID khách hàng",
+        "descSHORT_ID": "8 ký tự đầu của UUID",
+        "descTELEGRAM_ID": "ID Telegram của khách hàng (rỗng nếu chưa đặt)",
+        "descSUB_ID": "ID đăng ký",
+        "descCOMMENT": "Bình luận khách hàng",
+        "descTRAFFIC_USED": "Lưu lượng đã dùng (dễ đọc)",
+        "descTRAFFIC_LEFT": "Lưu lượng còn lại (ẩn nếu không giới hạn)",
+        "descTRAFFIC_TOTAL": "Tổng lưu lượng (ẩn nếu không giới hạn)",
+        "descTRAFFIC_USED_BYTES": "Lưu lượng đã dùng tính bằng byte",
+        "descTRAFFIC_LEFT_BYTES": "Lưu lượng còn lại tính bằng byte",
+        "descTRAFFIC_TOTAL_BYTES": "Tổng lưu lượng tính bằng byte",
+        "descUP": "Lưu lượng tải lên",
+        "descDOWN": "Lưu lượng tải xuống",
+        "descSTATUS": "active / expired / disabled / depleted",
+        "descDAYS_LEFT": "Số ngày đến khi hết hạn (ẩn nếu không giới hạn)",
+        "descEXPIRE_DATE": "Ngày hết hạn (YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "Hết hạn dạng dấu thời gian Unix (giây)",
+        "descCREATED_UNIX": "Thời điểm tạo dạng dấu thời gian Unix (giây)",
+        "descRESET_DAYS": "Chu kỳ đặt lại lưu lượng tính theo ngày"
+      },
+      "toasts": {
+        "list": "Không tải được danh sách host",
+        "obtain": "Không tải được host",
+        "add": "Thêm host",
+        "update": "Cập nhật host",
+        "delete": "Xóa host",
+        "badTag": "Tag không hợp lệ",
+        "badVlessRoute": "Dùng cổng/dải cổng như 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/zh-CN.json

@@ -97,7 +97,8 @@
     "unlimited": "无限制",
     "noExpiry": "无到期",
     "copyAllConfigs": "复制全部配置",
-    "copyAllConfigsCopied": "已复制全部配置"
+    "copyAllConfigsCopied": "已复制全部配置",
+    "email": "邮箱"
   },
   "menu": {
     "theme": "主题",
@@ -113,7 +114,8 @@
     "apiDocs": "API 文档",
     "logout": "退出登录",
     "link": "管理",
-    "donate": "捐赠"
+    "donate": "捐赠",
+    "hosts": "主机"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "连接超时——主机无法访问",
       "smtpErrorRelay": "服务器拒绝从此地址发送",
       "smtpErrorEof": "连接被服务器关闭",
-      "smtpErrorUnknown": "SMTP 错误:{{ .Error }}"
+      "smtpErrorUnknown": "SMTP 错误:{{ .Error }}",
+      "remarkTemplate": "备注模板",
+      "remarkTemplateDesc": "设置后,将替换每个订阅链接的备注模型 — 使用变量标记编写您自己的格式(用按钮插入它们)。留空则使用上方的模型。"
     },
     "xray": {
       "title": "Xray 配置",
@@ -1680,6 +1684,114 @@
         "ipPool": "IP 池子网",
         "poolSize": "池大小"
       }
+    },
+    "hosts": {
+      "addHost": "添加主机",
+      "editHost": "编辑主机",
+      "selectInbound": "选择一个入站",
+      "selectedCount": "已选 {count} 项",
+      "summary": {
+        "total": "总计",
+        "enabled": "已启用",
+        "disabled": "已禁用"
+      },
+      "moveUp": "上移",
+      "moveDown": "下移",
+      "bulkEnable": "启用",
+      "bulkDisable": "禁用",
+      "bulkDelete": "删除",
+      "bulkDeleteConfirm": "删除选中的 {count} 个主机?",
+      "deleteConfirmTitle": "删除主机 \"{name}\"?",
+      "sections": {
+        "basic": "基本",
+        "security": "安全",
+        "advanced": "高级",
+        "general": "常规",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "备注",
+        "serverDescription": "描述",
+        "inbound": "入站",
+        "address": "地址",
+        "port": "端口",
+        "endpoint": "端点",
+        "enable": "启用",
+        "actions": "操作",
+        "security": "安全",
+        "sni": "SNI",
+        "overrideSniFromAddress": "使用地址作为 SNI",
+        "keepSniBlank": "保持 SNI 为空",
+        "hostHeader": "Host 头",
+        "path": "路径",
+        "alpn": "ALPN",
+        "fingerprint": "指纹",
+        "pins": "固定证书 SHA-256",
+        "verifyPeerCertByName": "按名称验证对端证书",
+        "allowInsecure": "允许不安全连接",
+        "echConfigList": "ECH 配置列表",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "VLESS 路由",
+        "mihomoIpVersion": "IP 版本",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "随机打乱 Host",
+        "tags": "标签",
+        "nodeGuids": "节点",
+        "excludeFromSubTypes": "从格式中排除"
+      },
+      "hints": {
+        "address": "留空则继承入站自身的地址。",
+        "port": "填 0 则继承入站的端口。",
+        "tags": "对终端用户不可见;仅随 RAW 订阅发送。只能包含大写字母、数字、_ 和 :。",
+        "nodeGuids": "选择从此主机解析的节点。仅用于可视化关联。",
+        "serverDescription": "可选备注,显示在备注下方。",
+        "allowInsecure": "跳过 TLS 证书验证(allowInsecure / skip-cert-verify)。",
+        "vlessRoute": "通过 VLESS 路由的端口/范围,例如 53,443,1000-2000。留空表示不路由。",
+        "remark": "此主机的纯文本标签。仅当入站没有自己的备注时,才作为配置名称显示。"
+      },
+      "remarkVars": {
+        "title": "模板变量",
+        "intro": "点击变量即可添加。生成订阅时会按客户端逐一替换。",
+        "preview": "预览",
+        "groups": {
+          "client": "客户端",
+          "traffic": "流量",
+          "time": "时间与状态"
+        },
+        "descEMAIL": "客户端邮箱",
+        "descINBOUND": "配置名称:已设置时为主机的备注,否则为入站的备注",
+        "descHOST": "主机备注",
+        "descID": "客户端 UUID",
+        "descSHORT_ID": "UUID 的前 8 个字符",
+        "descTELEGRAM_ID": "客户端的 Telegram ID(未设置则为空)",
+        "descSUB_ID": "订阅 ID",
+        "descCOMMENT": "客户端备注",
+        "descTRAFFIC_USED": "已用流量(易读格式)",
+        "descTRAFFIC_LEFT": "剩余流量(无限制时隐藏)",
+        "descTRAFFIC_TOTAL": "总流量(无限制时隐藏)",
+        "descTRAFFIC_USED_BYTES": "已用流量(字节)",
+        "descTRAFFIC_LEFT_BYTES": "剩余流量(字节)",
+        "descTRAFFIC_TOTAL_BYTES": "总流量(字节)",
+        "descUP": "上传流量",
+        "descDOWN": "下载流量",
+        "descSTATUS": "active / expired / disabled / depleted",
+        "descDAYS_LEFT": "距到期天数(无限制时隐藏)",
+        "descEXPIRE_DATE": "到期日期(YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "到期时间的 Unix 时间戳(秒)",
+        "descCREATED_UNIX": "创建时间的 Unix 时间戳(秒)",
+        "descRESET_DAYS": "流量重置周期(天)"
+      },
+      "toasts": {
+        "list": "加载主机失败",
+        "obtain": "加载主机失败",
+        "add": "添加主机",
+        "update": "更新主机",
+        "delete": "删除主机",
+        "badTag": "无效的标签",
+        "badVlessRoute": "请使用端口/范围格式,如 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {

+ 115 - 3
internal/web/translation/zh-TW.json

@@ -97,7 +97,8 @@
     "unlimited": "無限制",
     "noExpiry": "無到期",
     "copyAllConfigs": "複製全部配置",
-    "copyAllConfigsCopied": "已複製全部配置"
+    "copyAllConfigsCopied": "已複製全部配置",
+    "email": "電子郵件"
   },
   "menu": {
     "theme": "主題",
@@ -113,7 +114,8 @@
     "apiDocs": "API 文件",
     "logout": "退出登入",
     "link": "管理",
-    "donate": "捐贈"
+    "donate": "捐贈",
+    "hosts": "Hosts"
   },
   "pages": {
     "login": {
@@ -1284,7 +1286,9 @@
       "smtpErrorTimeout": "連線逾時 — 無法連線至主機",
       "smtpErrorRelay": "伺服器拒絕從此地址傳送",
       "smtpErrorEof": "連線已被伺服器關閉",
-      "smtpErrorUnknown": "SMTP 錯誤:{{ .Error }}"
+      "smtpErrorUnknown": "SMTP 錯誤:{{ .Error }}",
+      "remarkTemplate": "備註範本",
+      "remarkTemplateDesc": "設定後,這將取代每個訂閱連結的備註模型——使用變數標記撰寫您自己的格式(使用按鈕來插入)。留空則使用上方的模型。"
     },
     "xray": {
       "title": "Xray 配置",
@@ -1680,6 +1684,114 @@
         "ipPool": "IP 池子網",
         "poolSize": "池大小"
       }
+    },
+    "hosts": {
+      "addHost": "新增 Host",
+      "editHost": "編輯 Host",
+      "selectInbound": "選擇一個入站",
+      "selectedCount": "已選 {count} 項",
+      "summary": {
+        "total": "總數",
+        "enabled": "已啟用",
+        "disabled": "已停用"
+      },
+      "moveUp": "上移",
+      "moveDown": "下移",
+      "bulkEnable": "啟用",
+      "bulkDisable": "停用",
+      "bulkDelete": "刪除",
+      "bulkDeleteConfirm": "刪除所選的 {count} 個 Host?",
+      "deleteConfirmTitle": "刪除 Host「{name}」?",
+      "sections": {
+        "basic": "基本",
+        "security": "安全",
+        "advanced": "進階",
+        "general": "一般",
+        "clash": "Clash (mihomo)"
+      },
+      "fields": {
+        "remark": "備註",
+        "serverDescription": "描述",
+        "inbound": "入站",
+        "address": "地址",
+        "port": "連接埠",
+        "endpoint": "端點",
+        "enable": "啟用",
+        "actions": "操作",
+        "security": "安全",
+        "sni": "SNI",
+        "overrideSniFromAddress": "使用地址作為 SNI",
+        "keepSniBlank": "保持 SNI 留空",
+        "hostHeader": "Host 標頭",
+        "path": "路徑",
+        "alpn": "ALPN",
+        "fingerprint": "指紋",
+        "pins": "釘選憑證 SHA-256",
+        "verifyPeerCertByName": "依名稱驗證對端憑證",
+        "allowInsecure": "允許不安全連線",
+        "echConfigList": "ECH 設定清單",
+        "muxParams": "Mux",
+        "sockoptParams": "Sockopt",
+        "finalMask": "Final Mask",
+        "vlessRoute": "VLESS 路由",
+        "mihomoIpVersion": "IP 版本",
+        "mihomoX25519": "Mihomo X25519",
+        "shuffleHost": "隨機排序 Host",
+        "tags": "標籤",
+        "nodeGuids": "節點",
+        "excludeFromSubTypes": "從格式中排除"
+      },
+      "hints": {
+        "address": "留空以繼承入站本身的地址。",
+        "port": "0 表示繼承入站的連接埠。",
+        "tags": "對終端使用者不可見;僅隨 RAW 訂閱傳送。只能使用大寫字母、數字、_ 和 :。",
+        "nodeGuids": "選擇由此 Host 解析而來的節點。僅為視覺上的指派。",
+        "serverDescription": "顯示於備註下方的選填註記。",
+        "allowInsecure": "略過 TLS 憑證驗證(allowInsecure / skip-cert-verify)。",
+        "vlessRoute": "透過 VLESS 路由的連接埠/範圍,例如 53,443,1000-2000。留空表示無。",
+        "remark": "此 Host 的純文字標籤。僅當入站本身沒有備註時,才作為配置名稱顯示。"
+      },
+      "remarkVars": {
+        "title": "範本變數",
+        "intro": "點擊變數以加入。產生訂閱時會針對每個客戶端進行替換。",
+        "preview": "預覽",
+        "groups": {
+          "client": "客戶端",
+          "traffic": "流量",
+          "time": "時間與狀態"
+        },
+        "descEMAIL": "客戶端電子郵件",
+        "descINBOUND": "配置名稱:設定時為 Host 的備註,否則為入站的備註",
+        "descHOST": "Host 備註",
+        "descID": "客戶端 UUID",
+        "descSHORT_ID": "UUID 的前 8 個字元",
+        "descTELEGRAM_ID": "客戶端的 Telegram ID(未設定則為空)",
+        "descSUB_ID": "訂閱 ID",
+        "descCOMMENT": "客戶端備註",
+        "descTRAFFIC_USED": "已用流量(易讀格式)",
+        "descTRAFFIC_LEFT": "剩餘流量(無限制時隱藏)",
+        "descTRAFFIC_TOTAL": "總流量(無限制時隱藏)",
+        "descTRAFFIC_USED_BYTES": "已用流量(位元組)",
+        "descTRAFFIC_LEFT_BYTES": "剩餘流量(位元組)",
+        "descTRAFFIC_TOTAL_BYTES": "總流量(位元組)",
+        "descUP": "上傳流量",
+        "descDOWN": "下載流量",
+        "descSTATUS": "active / expired / disabled / depleted",
+        "descDAYS_LEFT": "距到期天數(無限制時隱藏)",
+        "descEXPIRE_DATE": "到期日期(YYYY-MM-DD)",
+        "descEXPIRE_UNIX": "到期時間(Unix 時間戳記,秒)",
+        "descCREATED_UNIX": "建立時間(Unix 時間戳記,秒)",
+        "descRESET_DAYS": "流量重置週期(天)"
+      },
+      "toasts": {
+        "list": "載入 Host 失敗",
+        "obtain": "載入 Host 失敗",
+        "add": "新增 Host",
+        "update": "更新 Host",
+        "delete": "刪除 Host",
+        "badTag": "無效的標籤",
+        "badVlessRoute": "請使用連接埠/範圍,例如 53,443,1000-2000"
+      }
     }
   },
   "tgbot": {