From 7e553410a5372f89836de48def01abe0093e3b13 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Mon, 18 May 2026 10:27:51 +0200 Subject: [PATCH] i18n: backfill 99 missing keys across all 12 non-English locales Brings every translation file up to parity with en-US.json so the Clients page, the fallback-children inbound section, the new refresh verb, the Nodes panel-version label and a handful of older holes stop falling through to the English fallback. New strings span: - pages.clients.* (labels, confirmations, toasts, emailMethods) - pages.inbounds.portFallback.* (Reality fallback inbound section) - pages.nodes.panelVersion, menu.clients, refresh Technical identifiers (Auth, UUID, Flow, Reverse tag) are intentionally left untranslated since they correspond to xray-core field names. Co-Authored-By: Claude Opus 4.7 --- web/translation/ar-EG.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/es-ES.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/fa-IR.json | 108 +++++++++++++++++++++++++++++++++++- web/translation/id-ID.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/ja-JP.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/pt-BR.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/ru-RU.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/tr-TR.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/uk-UA.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/vi-VN.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/zh-CN.json | 111 ++++++++++++++++++++++++++++++++++++- web/translation/zh-TW.json | 111 ++++++++++++++++++++++++++++++++++++- 12 files changed, 1294 insertions(+), 35 deletions(-) diff --git a/web/translation/ar-EG.json b/web/translation/ar-EG.json index 0b37172b..df01eaf8 100644 --- a/web/translation/ar-EG.json +++ b/web/translation/ar-EG.json @@ -99,7 +99,8 @@ "xray": "إعدادات Xray", "apiDocs": "توثيق API", "logout": "تسجيل خروج", - "link": "إدارة" + "link": "إدارة", + "clients": "العملاء" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "رأس الطلب", "responseHeader": "رأس الرد" } + }, + "portFallback": { + "title": "العناصر الاحتياطية", + "help": "حدد الاتصالات الواردة التي يجب أن تستقبل حركة المرور التي لا تتطابق مع اتصال VLESS-TLS الوارد. يجب أن يستمع كل عنصر فرعي على 127.0.0.1 لاستقبال الاتصالات المُحوَّلة.", + "child": "الاتصال الوارد", + "path": "المسار" } }, "client": { @@ -450,7 +457,8 @@ "test": "اختبار الاتصال", "fillRequired": "الاسم والعنوان والبورت وتوكن API كلهم مطلوبين", "probeFailed": "فشل الفحص" - } + }, + "panelVersion": "إصدار اللوحة" }, "settings": { "title": "إعدادات البانل", @@ -800,6 +808,102 @@ "ipPool": "نطاق IP Pool", "poolSize": "حجم المجموعة" } + }, + "clients": { + "add": "إضافة عميل", + "edit": "تعديل العميل", + "submitAdd": "إضافة عميل", + "submitEdit": "حفظ التغييرات", + "clientCount": "عدد العملاء", + "bulk": "إضافة مجمعة", + "copyFromInbound": "نسخ العملاء من الاتصال الوارد", + "copyToInbound": "نسخ العملاء إلى", + "copySelected": "نسخ المحدد", + "copySource": "المصدر", + "copyEmailPreview": "معاينة البريد الناتج", + "copySelectSourceFirst": "يرجى تحديد اتصال وارد مصدر أولاً.", + "copyResult": "نتيجة النسخ", + "copyResultSuccess": "تم النسخ بنجاح", + "copyResultNone": "لا شيء للنسخ: لم يتم تحديد عملاء أو أن المصدر فارغ", + "copyResultErrors": "أخطاء النسخ", + "copyFlowLabel": "Flow للعملاء الجدد (VLESS)", + "copyFlowHint": "يُطبَّق على جميع العملاء المنسوخين. اتركه فارغًا للتخطي.", + "selectAll": "تحديد الكل", + "clearAll": "مسح الكل", + "method": "الطريقة", + "first": "أول", + "last": "آخر", + "ipLog": "سجل IP", + "prefix": "بادئة", + "postfix": "لاحقة", + "delayedStart": "البدء بعد أول استخدام", + "expireDays": "المدة", + "days": "يوم", + "renew": "تجديد تلقائي", + "renewDesc": "تجديد تلقائي بعد انتهاء الصلاحية. (0 = تعطيل) (الوحدة: يوم)", + "title": "العملاء", + "actions": "الإجراءات", + "totalGB": "مجموع المرسل/المستقبل (جيجابايت)", + "expiryTime": "انتهاء الصلاحية", + "addClients": "إضافة عملاء", + "limitIp": "حد عناوين IP", + "password": "كلمة المرور", + "subId": "معرّف الاشتراك", + "online": "متصل", + "email": "البريد الإلكتروني", + "comment": "ملاحظة", + "traffic": "حركة المرور", + "offline": "غير متصل", + "addTitle": "إضافة عميل", + "qrCode": "رمز QR", + "moreInformation": "مزيد من المعلومات", + "delete": "حذف", + "reset": "إعادة ضبط حركة المرور", + "editTitle": "تعديل العميل", + "client": "العميل", + "enabled": "مفعّل", + "remaining": "المتبقي", + "duration": "المدة", + "attachedInbounds": "الاتصالات الواردة المرتبطة", + "selectInbound": "حدد اتصالاً واردًا واحدًا أو أكثر", + "noSubId": "هذا العميل ليس لديه subId، لا يوجد رابط قابل للمشاركة.", + "noLinks": "لا توجد روابط للمشاركة — قم بإرفاق هذا العميل بأحد الاتصالات الواردة الداعمة للبروتوكول أولاً.", + "link": "رابط", + "resetNotPossible": "قم بإرفاق هذا العميل بأحد الاتصالات الواردة أولاً.", + "general": "عام", + "resetAllTraffics": "إعادة ضبط حركة مرور كل العملاء", + "resetAllTrafficsTitle": "إعادة ضبط حركة مرور كل العملاء؟", + "resetAllTrafficsContent": "يُعاد ضبط عدّاد الإرسال/الاستقبال لكل عميل إلى الصفر. لا تتأثر الحصص ومواعيد الانتهاء. لا يمكن التراجع.", + "empty": "لا يوجد عملاء بعد — أضف واحدًا للبدء.", + "deleteConfirmTitle": "حذف العميل {email}؟", + "deleteConfirmContent": "سيؤدي هذا إلى إزالة العميل من جميع الاتصالات الواردة المرتبطة وحذف سجل حركة مروره. لا يمكن التراجع.", + "deleteSelected": "حذف ({count})", + "bulkDeleteConfirmTitle": "حذف {count} عميل؟", + "bulkDeleteConfirmContent": "سيتم إزالة كل عميل محدد من جميع الاتصالات الواردة المرتبطة وحذف سجل حركة مروره. لا يمكن التراجع.", + "delDepleted": "حذف المنتهية", + "delDepletedConfirmTitle": "حذف العملاء المنتهية حصصهم؟", + "delDepletedConfirmContent": "يُحذف كل عميل استُنفِدت حصة حركة مروره أو انتهت صلاحيته. لا يمكن التراجع.", + "auth": "Auth", + "hysteriaAuth": "Auth (Hysteria)", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Reverse tag اختياري", + "telegramId": "معرّف مستخدم تلغرام", + "telegramIdPlaceholder": "معرّف مستخدم تلغرام رقمي (0 = لا شيء)", + "created": "تاريخ الإنشاء", + "updated": "تاريخ التحديث", + "ipLimit": "حد IP", + "toasts": { + "deleted": "تم حذف العميل", + "trafficReset": "تمت إعادة ضبط حركة المرور", + "allTrafficsReset": "تمت إعادة ضبط حركة مرور كل العملاء", + "bulkDeleted": "تم حذف {count} عميل", + "bulkDeletedMixed": "تم حذف {ok}, وفشل {failed}", + "bulkCreated": "تم إنشاء {count} عميل", + "bulkCreatedMixed": "تم إنشاء {ok}, وفشل {failed}", + "delDepleted": "تم حذف {count} عميل منتهٍ" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "اختار عميل للإدخال {{ .Inbound }}", "chooseInbound": "اختار الإدخال" } - } + }, + "refresh": "تحديث" } diff --git a/web/translation/es-ES.json b/web/translation/es-ES.json index 664b4718..7d6bef8a 100644 --- a/web/translation/es-ES.json +++ b/web/translation/es-ES.json @@ -99,7 +99,8 @@ "xray": "Ajustes Xray", "apiDocs": "Documentación de la API", "logout": "Cerrar Sesión", - "link": "Gestionar" + "link": "Gestionar", + "clients": "Clientes" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "Encabezado de solicitud", "responseHeader": "Encabezado de respuesta" } + }, + "portFallback": { + "title": "Inbounds de respaldo", + "help": "Selecciona los inbounds que deben recibir el tráfico que este inbound VLESS-TLS no coincida. Cada hijo debe escuchar en 127.0.0.1 para recibir las conexiones reenviadas.", + "child": "Inbound", + "path": "Ruta" } }, "client": { @@ -450,7 +457,8 @@ "test": "Probar conexión", "fillRequired": "El nombre, la dirección, el puerto y el token de API son obligatorios", "probeFailed": "Sondeo fallido" - } + }, + "panelVersion": "Versión del panel" }, "settings": { "title": "Configuraciones", @@ -800,6 +808,102 @@ "ipPool": "Subred del grupo de IP", "poolSize": "Tamaño del grupo" } + }, + "clients": { + "add": "Añadir cliente", + "edit": "Editar cliente", + "submitAdd": "Añadir cliente", + "submitEdit": "Guardar cambios", + "clientCount": "Número de clientes", + "bulk": "Añadir en lote", + "copyFromInbound": "Copiar clientes desde inbound", + "copyToInbound": "Copiar clientes a", + "copySelected": "Copiar selección", + "copySource": "Origen", + "copyEmailPreview": "Vista previa del correo resultante", + "copySelectSourceFirst": "Selecciona primero un inbound de origen.", + "copyResult": "Resultado de la copia", + "copyResultSuccess": "Copiado correctamente", + "copyResultNone": "Nada que copiar: no hay clientes seleccionados o el origen está vacío", + "copyResultErrors": "Errores de copia", + "copyFlowLabel": "Flow para clientes nuevos (VLESS)", + "copyFlowHint": "Se aplica a todos los clientes copiados. Déjalo vacío para omitir.", + "selectAll": "Seleccionar todo", + "clearAll": "Limpiar todo", + "method": "Método", + "first": "Primero", + "last": "Último", + "ipLog": "Registro de IP", + "prefix": "Prefijo", + "postfix": "Sufijo", + "delayedStart": "Iniciar tras el primer uso", + "expireDays": "Duración", + "days": "Día(s)", + "renew": "Renovación automática", + "renewDesc": "Renovación automática tras la expiración. (0 = desactivado) (unidad: día)", + "title": "Clientes", + "actions": "Acciones", + "totalGB": "Total enviado/recibido (GB)", + "expiryTime": "Expiración", + "addClients": "Añadir clientes", + "limitIp": "Límite de IP", + "password": "Contraseña", + "subId": "ID de suscripción", + "online": "En línea", + "email": "Correo", + "comment": "Comentario", + "traffic": "Tráfico", + "offline": "Desconectado", + "addTitle": "Añadir cliente", + "qrCode": "Código QR", + "moreInformation": "Más información", + "delete": "Eliminar", + "reset": "Restablecer tráfico", + "editTitle": "Editar cliente", + "client": "Cliente", + "enabled": "Habilitado", + "remaining": "Restante", + "duration": "Duración", + "attachedInbounds": "Inbounds asociados", + "selectInbound": "Selecciona uno o más inbounds", + "noSubId": "Este cliente no tiene subId, no hay enlace compartible.", + "noLinks": "No hay enlaces compartibles — asocia primero este cliente a un inbound con protocolo válido.", + "link": "Enlace", + "resetNotPossible": "Asocia primero este cliente a un inbound.", + "general": "General", + "resetAllTraffics": "Restablecer tráfico de todos los clientes", + "resetAllTrafficsTitle": "¿Restablecer tráfico de todos los clientes?", + "resetAllTrafficsContent": "El contador de subida/bajada de cada cliente vuelve a cero. Las cuotas y la expiración no se modifican. Esta acción no se puede deshacer.", + "empty": "Aún no hay clientes — añade uno para empezar.", + "deleteConfirmTitle": "¿Eliminar al cliente {email}?", + "deleteConfirmContent": "Esto elimina al cliente de cada inbound asociado y descarta su registro de tráfico. No se puede deshacer.", + "deleteSelected": "Eliminar ({count})", + "bulkDeleteConfirmTitle": "¿Eliminar {count} clientes?", + "bulkDeleteConfirmContent": "Cada cliente seleccionado se elimina de los inbounds asociados y se descarta su registro de tráfico. No se puede deshacer.", + "delDepleted": "Eliminar agotados", + "delDepletedConfirmTitle": "¿Eliminar clientes agotados?", + "delDepletedConfirmContent": "Elimina todos los clientes con cuota agotada o expirados. No se puede deshacer.", + "auth": "Auth", + "hysteriaAuth": "Auth de Hysteria", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Reverse tag opcional", + "telegramId": "ID de usuario de Telegram", + "telegramIdPlaceholder": "ID numérico de usuario de Telegram (0 = ninguno)", + "created": "Creado", + "updated": "Actualizado", + "ipLimit": "Límite de IP", + "toasts": { + "deleted": "Cliente eliminado", + "trafficReset": "Tráfico restablecido", + "allTrafficsReset": "Tráfico de todos los clientes restablecido", + "bulkDeleted": "{count} clientes eliminados", + "bulkDeletedMixed": "{ok} eliminados, {failed} fallidos", + "bulkCreated": "{count} clientes creados", + "bulkCreatedMixed": "{ok} creados, {failed} fallidos", + "delDepleted": "{count} clientes agotados eliminados" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Elige un Cliente para Inbound {{ .Inbound }}", "chooseInbound": "Elige un Inbound" } - } + }, + "refresh": "Actualizar" } diff --git a/web/translation/fa-IR.json b/web/translation/fa-IR.json index c6eb8100..8a37a99d 100644 --- a/web/translation/fa-IR.json +++ b/web/translation/fa-IR.json @@ -99,7 +99,8 @@ "xray": "پیکربندی ایکس‌ری", "apiDocs": "مستندات API", "logout": "خروج", - "link": "مدیریت" + "link": "مدیریت", + "clients": "کلاینت‌ها" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "سربرگ درخواست", "responseHeader": "سربرگ پاسخ" } + }, + "portFallback": { + "title": "فرزندان فال‌بک", + "help": "اینباندهایی را که باید ترافیک نامطابق این اینباند VLESS-TLS را دریافت کنند انتخاب کنید. هر فرزند باید روی 127.0.0.1 گوش دهد تا اتصالات ارجاع‌شده را بپذیرد.", + "child": "اینباند", + "path": "مسیر" } }, "client": { @@ -801,6 +808,102 @@ "ipPool": "زیرشبکه استخر آی‌پی", "poolSize": "اندازه استخر" } + }, + "clients": { + "add": "افزودن کلاینت", + "edit": "ویرایش کلاینت", + "submitAdd": "افزودن کلاینت", + "submitEdit": "ذخیره تغییرات", + "clientCount": "تعداد کلاینت‌ها", + "bulk": "افزودن گروهی", + "copyFromInbound": "کپی کلاینت‌ها از اینباند", + "copyToInbound": "کپی کلاینت‌ها به", + "copySelected": "کپی انتخاب‌شده‌ها", + "copySource": "منبع", + "copyEmailPreview": "پیش‌نمایش ایمیل خروجی", + "copySelectSourceFirst": "ابتدا یک اینباند مبدأ انتخاب کنید.", + "copyResult": "نتیجه کپی", + "copyResultSuccess": "با موفقیت کپی شد", + "copyResultNone": "چیزی برای کپی نیست: کلاینتی انتخاب نشده یا منبع خالی است", + "copyResultErrors": "خطاهای کپی", + "copyFlowLabel": "Flow برای کلاینت‌های جدید (VLESS)", + "copyFlowHint": "روی همه کلاینت‌های کپی‌شده اعمال می‌شود. خالی بگذارید تا رد شود.", + "selectAll": "انتخاب همه", + "clearAll": "پاک کردن همه", + "method": "روش", + "first": "اول", + "last": "آخر", + "ipLog": "گزارش IP", + "prefix": "پیشوند", + "postfix": "پسوند", + "delayedStart": "شروع پس از اولین استفاده", + "expireDays": "مدت", + "days": "روز", + "renew": "تمدید خودکار", + "renewDesc": "تمدید خودکار پس از انقضا. (۰ = غیرفعال) (واحد: روز)", + "title": "کلاینت‌ها", + "actions": "عملیات", + "totalGB": "مجموع ارسال/دریافت (گیگابایت)", + "expiryTime": "انقضا", + "addClients": "افزودن کلاینت‌ها", + "limitIp": "محدودیت IP", + "password": "رمز عبور", + "subId": "شناسه اشتراک", + "online": "آنلاین", + "email": "ایمیل", + "comment": "توضیحات", + "traffic": "ترافیک", + "offline": "آفلاین", + "addTitle": "افزودن کلاینت", + "qrCode": "کد QR", + "moreInformation": "اطلاعات بیشتر", + "delete": "حذف", + "reset": "بازنشانی ترافیک", + "editTitle": "ویرایش کلاینت", + "client": "کلاینت", + "enabled": "فعال", + "remaining": "باقی‌مانده", + "duration": "مدت", + "attachedInbounds": "اینباندهای متصل", + "selectInbound": "یک یا چند اینباند انتخاب کنید", + "noSubId": "این کلاینت subId ندارد، لینک اشتراک‌گذاری وجود ندارد.", + "noLinks": "لینکی برای اشتراک‌گذاری نیست — ابتدا این کلاینت را به یک اینباند با پروتکل سازگار متصل کنید.", + "link": "لینک", + "resetNotPossible": "ابتدا این کلاینت را به یک اینباند متصل کنید.", + "general": "عمومی", + "resetAllTraffics": "بازنشانی ترافیک همه کلاینت‌ها", + "resetAllTrafficsTitle": "بازنشانی ترافیک همه کلاینت‌ها؟", + "resetAllTrafficsContent": "شمارنده ارسال/دریافت همه کلاینت‌ها به صفر می‌رسد. سهمیه و تاریخ انقضا تغییری نمی‌کند. این عمل غیرقابل بازگشت است.", + "empty": "هنوز کلاینتی نیست — برای شروع یکی اضافه کنید.", + "deleteConfirmTitle": "حذف کلاینت {email}؟", + "deleteConfirmContent": "این کلاینت از تمام اینباندهای متصل حذف و سابقه ترافیک آن پاک می‌شود. این عمل غیرقابل بازگشت است.", + "deleteSelected": "حذف ({count})", + "bulkDeleteConfirmTitle": "حذف {count} کلاینت؟", + "bulkDeleteConfirmContent": "هر کلاینت انتخاب‌شده از تمام اینباندهای متصل حذف و سابقه ترافیک آن پاک می‌شود. این عمل غیرقابل بازگشت است.", + "delDepleted": "حذف اتمام‌یافته‌ها", + "delDepletedConfirmTitle": "حذف کلاینت‌های اتمام‌یافته؟", + "delDepletedConfirmContent": "هر کلاینتی که سهمیه ترافیک‌اش تمام شده یا تاریخ انقضایش گذشته است حذف می‌شود. این عمل غیرقابل بازگشت است.", + "auth": "Auth", + "hysteriaAuth": "Auth (هیستریا)", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Reverse tag اختیاری", + "telegramId": "شناسه کاربر تلگرام", + "telegramIdPlaceholder": "شناسه عددی کاربر تلگرام (۰ = هیچ)", + "created": "ساخته‌شده", + "updated": "به‌روزشده", + "ipLimit": "محدودیت IP", + "toasts": { + "deleted": "کلاینت حذف شد", + "trafficReset": "ترافیک بازنشانی شد", + "allTrafficsReset": "ترافیک همه کلاینت‌ها بازنشانی شد", + "bulkDeleted": "{count} کلاینت حذف شد", + "bulkDeletedMixed": "{ok} حذف، {failed} ناموفق", + "bulkCreated": "{count} کلاینت ساخته شد", + "bulkCreatedMixed": "{ok} ساخته شد، {failed} ناموفق", + "delDepleted": "{count} کلاینت اتمام‌یافته حذف شد" + } } }, "tgbot": { @@ -978,5 +1081,6 @@ "chooseClient": "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید", "chooseInbound": "یک ورودی انتخاب کنید" } - } + }, + "refresh": "تازه‌سازی" } diff --git a/web/translation/id-ID.json b/web/translation/id-ID.json index 297c3bce..762b366c 100644 --- a/web/translation/id-ID.json +++ b/web/translation/id-ID.json @@ -99,7 +99,8 @@ "xray": "Konfigurasi Xray", "apiDocs": "Dokumentasi API", "logout": "Keluar", - "link": "Kelola" + "link": "Kelola", + "clients": "Klien" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "Header Permintaan", "responseHeader": "Header Respons" } + }, + "portFallback": { + "title": "Inbound cadangan", + "help": "Pilih inbound yang harus menangkap lalu lintas yang tidak cocok pada inbound VLESS-TLS ini. Setiap anak harus mendengarkan di 127.0.0.1 untuk menerima koneksi yang diteruskan.", + "child": "Inbound", + "path": "Path" } }, "client": { @@ -450,7 +457,8 @@ "test": "Tes koneksi", "fillRequired": "Nama, alamat, port, dan token API wajib diisi", "probeFailed": "Probe gagal" - } + }, + "panelVersion": "Versi panel" }, "settings": { "title": "Pengaturan Panel", @@ -800,6 +808,102 @@ "ipPool": "Subnet Kumpulan IP", "poolSize": "Ukuran Kolam" } + }, + "clients": { + "add": "Tambah klien", + "edit": "Ubah klien", + "submitAdd": "Tambah klien", + "submitEdit": "Simpan perubahan", + "clientCount": "Jumlah klien", + "bulk": "Tambah massal", + "copyFromInbound": "Salin klien dari inbound", + "copyToInbound": "Salin klien ke", + "copySelected": "Salin terpilih", + "copySource": "Sumber", + "copyEmailPreview": "Pratinjau email hasil", + "copySelectSourceFirst": "Pilih inbound sumber terlebih dahulu.", + "copyResult": "Hasil salinan", + "copyResultSuccess": "Berhasil disalin", + "copyResultNone": "Tidak ada yang disalin: tidak ada klien terpilih atau sumber kosong", + "copyResultErrors": "Kesalahan salin", + "copyFlowLabel": "Flow untuk klien baru (VLESS)", + "copyFlowHint": "Diterapkan ke semua klien yang disalin. Kosongkan untuk dilewati.", + "selectAll": "Pilih semua", + "clearAll": "Hapus semua", + "method": "Metode", + "first": "Pertama", + "last": "Terakhir", + "ipLog": "Log IP", + "prefix": "Awalan", + "postfix": "Akhiran", + "delayedStart": "Mulai setelah penggunaan pertama", + "expireDays": "Durasi", + "days": "Hari", + "renew": "Perpanjangan otomatis", + "renewDesc": "Perpanjangan otomatis setelah kedaluwarsa. (0 = nonaktif) (satuan: hari)", + "title": "Klien", + "actions": "Aksi", + "totalGB": "Total Kirim/Terima (GB)", + "expiryTime": "Kedaluwarsa", + "addClients": "Tambah klien", + "limitIp": "Batas IP", + "password": "Kata sandi", + "subId": "ID Langganan", + "online": "Online", + "email": "Email", + "comment": "Komentar", + "traffic": "Lalu lintas", + "offline": "Offline", + "addTitle": "Tambah klien", + "qrCode": "Kode QR", + "moreInformation": "Informasi lebih lanjut", + "delete": "Hapus", + "reset": "Reset lalu lintas", + "editTitle": "Ubah klien", + "client": "Klien", + "enabled": "Aktif", + "remaining": "Sisa", + "duration": "Durasi", + "attachedInbounds": "Inbound terlampir", + "selectInbound": "Pilih satu atau lebih inbound", + "noSubId": "Klien ini tidak punya subId, tidak ada tautan yang bisa dibagikan.", + "noLinks": "Tidak ada tautan yang bisa dibagikan — lampirkan klien ini ke inbound yang mendukung protokol terlebih dahulu.", + "link": "Tautan", + "resetNotPossible": "Lampirkan klien ini ke inbound terlebih dahulu.", + "general": "Umum", + "resetAllTraffics": "Reset lalu lintas semua klien", + "resetAllTrafficsTitle": "Reset lalu lintas semua klien?", + "resetAllTrafficsContent": "Penghitung kirim/terima setiap klien turun ke nol. Kuota dan kedaluwarsa tidak terpengaruh. Tidak dapat dibatalkan.", + "empty": "Belum ada klien — tambahkan satu untuk memulai.", + "deleteConfirmTitle": "Hapus klien {email}?", + "deleteConfirmContent": "Tindakan ini menghapus klien dari setiap inbound terlampir dan menghapus catatan lalu lintasnya. Tidak dapat dibatalkan.", + "deleteSelected": "Hapus ({count})", + "bulkDeleteConfirmTitle": "Hapus {count} klien?", + "bulkDeleteConfirmContent": "Setiap klien yang dipilih dihapus dari semua inbound terlampir dan catatan lalu lintasnya dihapus. Tidak dapat dibatalkan.", + "delDepleted": "Hapus yang habis", + "delDepletedConfirmTitle": "Hapus klien yang habis?", + "delDepletedConfirmContent": "Hapus setiap klien yang kuota lalu lintasnya habis atau yang masa berlakunya telah berakhir. Tidak dapat dibatalkan.", + "auth": "Auth", + "hysteriaAuth": "Auth Hysteria", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Reverse tag opsional", + "telegramId": "ID pengguna Telegram", + "telegramIdPlaceholder": "ID numerik pengguna Telegram (0 = tidak ada)", + "created": "Dibuat", + "updated": "Diperbarui", + "ipLimit": "Batas IP", + "toasts": { + "deleted": "Klien dihapus", + "trafficReset": "Lalu lintas direset", + "allTrafficsReset": "Lalu lintas semua klien direset", + "bulkDeleted": "{count} klien dihapus", + "bulkDeletedMixed": "{ok} dihapus, {failed} gagal", + "bulkCreated": "{count} klien dibuat", + "bulkCreatedMixed": "{ok} dibuat, {failed} gagal", + "delDepleted": "{count} klien habis dihapus" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Pilih Klien untuk Inbound {{ .Inbound }}", "chooseInbound": "Pilih Inbound" } - } + }, + "refresh": "Segarkan" } diff --git a/web/translation/ja-JP.json b/web/translation/ja-JP.json index 4c562752..4bb63783 100644 --- a/web/translation/ja-JP.json +++ b/web/translation/ja-JP.json @@ -99,7 +99,8 @@ "xray": "Xray設定", "apiDocs": "API ドキュメント", "logout": "ログアウト", - "link": "リンク管理" + "link": "リンク管理", + "clients": "クライアント" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "リクエストヘッダー", "responseHeader": "レスポンスヘッダー" } + }, + "portFallback": { + "title": "フォールバック子", + "help": "この VLESS-TLS インバウンドが一致しないトラフィックを受け取るインバウンドを選択してください。各子インバウンドは転送された接続を受信するために 127.0.0.1 でリッスンする必要があります。", + "child": "インバウンド", + "path": "パス" } }, "client": { @@ -450,7 +457,8 @@ "test": "接続テスト", "fillRequired": "名前、アドレス、ポート、APIトークンは必須です", "probeFailed": "プローブに失敗しました" - } + }, + "panelVersion": "パネルのバージョン" }, "settings": { "title": "パネル設定", @@ -800,6 +808,102 @@ "ipPool": "IPプールサブネット", "poolSize": "プールサイズ" } + }, + "clients": { + "add": "クライアントを追加", + "edit": "クライアントを編集", + "submitAdd": "クライアントを追加", + "submitEdit": "変更を保存", + "clientCount": "クライアント数", + "bulk": "一括追加", + "copyFromInbound": "インバウンドからクライアントをコピー", + "copyToInbound": "コピー先", + "copySelected": "選択をコピー", + "copySource": "コピー元", + "copyEmailPreview": "生成されるメールのプレビュー", + "copySelectSourceFirst": "まずコピー元のインバウンドを選択してください。", + "copyResult": "コピー結果", + "copyResultSuccess": "コピーに成功しました", + "copyResultNone": "コピーする対象がありません。クライアントが選択されていないか、コピー元が空です", + "copyResultErrors": "コピーエラー", + "copyFlowLabel": "新規クライアントの Flow (VLESS)", + "copyFlowHint": "コピーされる全クライアントに適用されます。空欄でスキップします。", + "selectAll": "すべて選択", + "clearAll": "すべてクリア", + "method": "メソッド", + "first": "最初", + "last": "最後", + "ipLog": "IP ログ", + "prefix": "プレフィックス", + "postfix": "サフィックス", + "delayedStart": "初回使用から開始", + "expireDays": "期間", + "days": "日", + "renew": "自動更新", + "renewDesc": "有効期限切れ後に自動更新します。(0 = 無効) (単位: 日)", + "title": "クライアント", + "actions": "操作", + "totalGB": "送受信合計 (GB)", + "expiryTime": "有効期限", + "addClients": "クライアントを追加", + "limitIp": "IP 制限", + "password": "パスワード", + "subId": "サブスクリプション ID", + "online": "オンライン", + "email": "メール", + "comment": "コメント", + "traffic": "トラフィック", + "offline": "オフライン", + "addTitle": "クライアントを追加", + "qrCode": "QR コード", + "moreInformation": "詳細情報", + "delete": "削除", + "reset": "トラフィックをリセット", + "editTitle": "クライアントを編集", + "client": "クライアント", + "enabled": "有効", + "remaining": "残量", + "duration": "期間", + "attachedInbounds": "関連付けされたインバウンド", + "selectInbound": "1 つ以上のインバウンドを選択", + "noSubId": "このクライアントには subId がなく、共有可能なリンクはありません。", + "noLinks": "共有可能なリンクがありません — まずこのクライアントを対応するプロトコルのインバウンドに関連付けてください。", + "link": "リンク", + "resetNotPossible": "まずこのクライアントをインバウンドに関連付けてください。", + "general": "一般", + "resetAllTraffics": "すべてのクライアントのトラフィックをリセット", + "resetAllTrafficsTitle": "すべてのクライアントのトラフィックをリセットしますか?", + "resetAllTrafficsContent": "すべてのクライアントの送受信カウンターがゼロにリセットされます。クォータと有効期限には影響しません。元に戻せません。", + "empty": "クライアントはまだいません — 1 つ追加して始めましょう。", + "deleteConfirmTitle": "クライアント {email} を削除しますか?", + "deleteConfirmContent": "クライアントを関連付けされたすべてのインバウンドから削除し、トラフィック記録も破棄します。元に戻せません。", + "deleteSelected": "削除 ({count})", + "bulkDeleteConfirmTitle": "{count} 件のクライアントを削除しますか?", + "bulkDeleteConfirmContent": "選択された各クライアントを関連付けされたすべてのインバウンドから削除し、トラフィック記録も破棄します。元に戻せません。", + "delDepleted": "使い切ったクライアントを削除", + "delDepletedConfirmTitle": "使い切ったクライアントを削除しますか?", + "delDepletedConfirmContent": "トラフィック上限に達したか有効期限が切れたクライアントをすべて削除します。元に戻せません。", + "auth": "Auth", + "hysteriaAuth": "Auth (Hysteria)", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "任意の Reverse tag", + "telegramId": "Telegram ユーザー ID", + "telegramIdPlaceholder": "数値の Telegram ユーザー ID (0 = なし)", + "created": "作成日", + "updated": "更新日", + "ipLimit": "IP 制限", + "toasts": { + "deleted": "クライアントを削除しました", + "trafficReset": "トラフィックをリセットしました", + "allTrafficsReset": "すべてのクライアントのトラフィックをリセットしました", + "bulkDeleted": "{count} 件のクライアントを削除しました", + "bulkDeletedMixed": "{ok} 件削除、{failed} 件失敗", + "bulkCreated": "{count} 件のクライアントを作成しました", + "bulkCreatedMixed": "{ok} 件作成、{failed} 件失敗", + "delDepleted": "使い切った {count} 件のクライアントを削除しました" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "インバウンド {{ .Inbound }} のクライアントを選択", "chooseInbound": "インバウンドを選択" } - } + }, + "refresh": "更新" } diff --git a/web/translation/pt-BR.json b/web/translation/pt-BR.json index cc5ceaba..6b813ca1 100644 --- a/web/translation/pt-BR.json +++ b/web/translation/pt-BR.json @@ -99,7 +99,8 @@ "xray": "Xray Configs", "apiDocs": "Documentação da API", "logout": "Sair", - "link": "Gerenciar" + "link": "Gerenciar", + "clients": "Clientes" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "Cabeçalho da Requisição", "responseHeader": "Cabeçalho da Resposta" } + }, + "portFallback": { + "title": "Inbounds de fallback", + "help": "Selecione os inbounds que devem receber o tráfego que este inbound VLESS-TLS não atender. Cada filho precisa escutar em 127.0.0.1 para receber as conexões encaminhadas.", + "child": "Inbound", + "path": "Caminho" } }, "client": { @@ -450,7 +457,8 @@ "test": "Testar conexão", "fillRequired": "Nome, endereço, porta e token da API são obrigatórios", "probeFailed": "Falha na sondagem" - } + }, + "panelVersion": "Versão do painel" }, "settings": { "title": "Configurações do Painel", @@ -800,6 +808,102 @@ "ipPool": "Sub-rede do Pool de IP", "poolSize": "Tamanho do Pool" } + }, + "clients": { + "add": "Adicionar cliente", + "edit": "Editar cliente", + "submitAdd": "Adicionar cliente", + "submitEdit": "Salvar alterações", + "clientCount": "Número de clientes", + "bulk": "Adicionar em lote", + "copyFromInbound": "Copiar clientes do inbound", + "copyToInbound": "Copiar clientes para", + "copySelected": "Copiar selecionados", + "copySource": "Origem", + "copyEmailPreview": "Prévia do e-mail resultante", + "copySelectSourceFirst": "Selecione primeiro um inbound de origem.", + "copyResult": "Resultado da cópia", + "copyResultSuccess": "Copiado com sucesso", + "copyResultNone": "Nada a copiar: nenhum cliente selecionado ou a origem está vazia", + "copyResultErrors": "Erros de cópia", + "copyFlowLabel": "Flow para os novos clientes (VLESS)", + "copyFlowHint": "Aplicado a todos os clientes copiados. Deixe em branco para ignorar.", + "selectAll": "Selecionar tudo", + "clearAll": "Limpar tudo", + "method": "Método", + "first": "Primeiro", + "last": "Último", + "ipLog": "Registro de IP", + "prefix": "Prefixo", + "postfix": "Sufixo", + "delayedStart": "Iniciar após o primeiro uso", + "expireDays": "Duração", + "days": "Dia(s)", + "renew": "Renovação automática", + "renewDesc": "Renovação automática após a expiração. (0 = desativar) (unidade: dia)", + "title": "Clientes", + "actions": "Ações", + "totalGB": "Total enviado/recebido (GB)", + "expiryTime": "Expiração", + "addClients": "Adicionar clientes", + "limitIp": "Limite de IP", + "password": "Senha", + "subId": "ID da assinatura", + "online": "Online", + "email": "E-mail", + "comment": "Comentário", + "traffic": "Tráfego", + "offline": "Offline", + "addTitle": "Adicionar cliente", + "qrCode": "Código QR", + "moreInformation": "Mais informações", + "delete": "Excluir", + "reset": "Redefinir tráfego", + "editTitle": "Editar cliente", + "client": "Cliente", + "enabled": "Habilitado", + "remaining": "Restante", + "duration": "Duração", + "attachedInbounds": "Inbounds associados", + "selectInbound": "Selecione um ou mais inbounds", + "noSubId": "Este cliente não tem subId, sem link compartilhável.", + "noLinks": "Sem links compartilháveis — associe primeiro este cliente a um inbound compatível com o protocolo.", + "link": "Link", + "resetNotPossible": "Associe primeiro este cliente a um inbound.", + "general": "Geral", + "resetAllTraffics": "Redefinir o tráfego de todos os clientes", + "resetAllTrafficsTitle": "Redefinir o tráfego de todos os clientes?", + "resetAllTrafficsContent": "Os contadores de envio/recebimento de cada cliente vão a zero. Cota e expiração não são afetadas. Não é possível desfazer.", + "empty": "Ainda não há clientes — adicione um para começar.", + "deleteConfirmTitle": "Excluir o cliente {email}?", + "deleteConfirmContent": "Isto remove o cliente de cada inbound associado e descarta o registro de tráfego. Não é possível desfazer.", + "deleteSelected": "Excluir ({count})", + "bulkDeleteConfirmTitle": "Excluir {count} clientes?", + "bulkDeleteConfirmContent": "Cada cliente selecionado é removido dos inbounds associados e o registro de tráfego é descartado. Não é possível desfazer.", + "delDepleted": "Excluir esgotados", + "delDepletedConfirmTitle": "Excluir clientes esgotados?", + "delDepletedConfirmContent": "Remove todos os clientes cuja cota de tráfego foi esgotada ou cuja expiração já passou. Não é possível desfazer.", + "auth": "Auth", + "hysteriaAuth": "Auth do Hysteria", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Reverse tag opcional", + "telegramId": "ID de usuário do Telegram", + "telegramIdPlaceholder": "ID numérico de usuário do Telegram (0 = nenhum)", + "created": "Criado", + "updated": "Atualizado", + "ipLimit": "Limite de IP", + "toasts": { + "deleted": "Cliente excluído", + "trafficReset": "Tráfego redefinido", + "allTrafficsReset": "Tráfego de todos os clientes redefinido", + "bulkDeleted": "{count} clientes excluídos", + "bulkDeletedMixed": "{ok} excluídos, {failed} com falha", + "bulkCreated": "{count} clientes criados", + "bulkCreatedMixed": "{ok} criados, {failed} com falha", + "delDepleted": "{count} clientes esgotados excluídos" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Escolha um cliente para Inbound {{ .Inbound }}", "chooseInbound": "Escolha um Inbound" } - } + }, + "refresh": "Atualizar" } diff --git a/web/translation/ru-RU.json b/web/translation/ru-RU.json index a258e5ad..ebed2683 100644 --- a/web/translation/ru-RU.json +++ b/web/translation/ru-RU.json @@ -99,7 +99,8 @@ "xray": "Настройки Xray", "apiDocs": "Документация API", "logout": "Выход", - "link": "Управление" + "link": "Управление", + "clients": "Клиенты" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "Заголовок запроса", "responseHeader": "Заголовок ответа" } + }, + "portFallback": { + "title": "Резервные входящие", + "help": "Выберите входящие, которые должны принимать трафик, не соответствующий этому входящему VLESS-TLS. Каждый дочерний элемент должен слушать на 127.0.0.1 для приёма перенаправленных соединений.", + "child": "Входящий", + "path": "Путь" } }, "client": { @@ -450,7 +457,8 @@ "test": "Проверить соединение", "fillRequired": "Имя, адрес, порт и токен API обязательны", "probeFailed": "Проверка не удалась" - } + }, + "panelVersion": "Версия панели" }, "settings": { "title": "Настройки", @@ -800,6 +808,102 @@ "ipPool": "Подсеть пула IP", "poolSize": "Размер пула" } + }, + "clients": { + "add": "Добавить клиента", + "edit": "Изменить клиента", + "submitAdd": "Добавить клиента", + "submitEdit": "Сохранить изменения", + "clientCount": "Количество клиентов", + "bulk": "Массовое добавление", + "copyFromInbound": "Скопировать клиентов из входящего", + "copyToInbound": "Скопировать клиентов в", + "copySelected": "Скопировать выбранное", + "copySource": "Источник", + "copyEmailPreview": "Предпросмотр результирующего email", + "copySelectSourceFirst": "Сначала выберите исходный входящий.", + "copyResult": "Результат копирования", + "copyResultSuccess": "Скопировано успешно", + "copyResultNone": "Нечего копировать: клиенты не выбраны или источник пуст", + "copyResultErrors": "Ошибки копирования", + "copyFlowLabel": "Flow для новых клиентов (VLESS)", + "copyFlowHint": "Применяется ко всем скопированным клиентам. Оставьте пустым, чтобы пропустить.", + "selectAll": "Выбрать всё", + "clearAll": "Очистить всё", + "method": "Метод", + "first": "Первый", + "last": "Последний", + "ipLog": "Журнал IP", + "prefix": "Префикс", + "postfix": "Постфикс", + "delayedStart": "Старт после первого использования", + "expireDays": "Длительность", + "days": "Дни", + "renew": "Автопродление", + "renewDesc": "Автоматическое продление после окончания. (0 = отключено) (единица: день)", + "title": "Клиенты", + "actions": "Действия", + "totalGB": "Всего отправлено/получено (ГБ)", + "expiryTime": "Срок действия", + "addClients": "Добавить клиентов", + "limitIp": "Лимит IP", + "password": "Пароль", + "subId": "ID подписки", + "online": "В сети", + "email": "Email", + "comment": "Комментарий", + "traffic": "Трафик", + "offline": "Не в сети", + "addTitle": "Добавить клиента", + "qrCode": "QR-код", + "moreInformation": "Подробнее", + "delete": "Удалить", + "reset": "Сбросить трафик", + "editTitle": "Изменить клиента", + "client": "Клиент", + "enabled": "Включён", + "remaining": "Остаток", + "duration": "Длительность", + "attachedInbounds": "Привязанные входящие", + "selectInbound": "Выберите один или несколько входящих", + "noSubId": "У этого клиента нет subId, ссылка для общего доступа недоступна.", + "noLinks": "Нет ссылок для общего доступа — сначала привяжите клиента к входящему с поддерживаемым протоколом.", + "link": "Ссылка", + "resetNotPossible": "Сначала привяжите этого клиента к входящему.", + "general": "Общее", + "resetAllTraffics": "Сбросить трафик всех клиентов", + "resetAllTrafficsTitle": "Сбросить трафик всех клиентов?", + "resetAllTrafficsContent": "Счётчики отправки/приёма всех клиентов сбрасываются в ноль. Квоты и срок действия не затрагиваются. Это действие нельзя отменить.", + "empty": "Клиентов пока нет — добавьте первого, чтобы начать.", + "deleteConfirmTitle": "Удалить клиента {email}?", + "deleteConfirmContent": "Клиент будет удалён из всех привязанных входящих, а его запись трафика будет уничтожена. Это действие нельзя отменить.", + "deleteSelected": "Удалить ({count})", + "bulkDeleteConfirmTitle": "Удалить {count} клиентов?", + "bulkDeleteConfirmContent": "Каждый выбранный клиент удаляется из всех привязанных входящих, его запись трафика уничтожается. Это действие нельзя отменить.", + "delDepleted": "Удалить исчерпанных", + "delDepletedConfirmTitle": "Удалить исчерпанных клиентов?", + "delDepletedConfirmContent": "Удаляются все клиенты, у которых исчерпана квота трафика или истёк срок. Это действие нельзя отменить.", + "auth": "Auth", + "hysteriaAuth": "Auth для Hysteria", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Необязательный Reverse tag", + "telegramId": "ID пользователя Telegram", + "telegramIdPlaceholder": "Числовой ID пользователя Telegram (0 = нет)", + "created": "Создан", + "updated": "Обновлён", + "ipLimit": "Лимит IP", + "toasts": { + "deleted": "Клиент удалён", + "trafficReset": "Трафик сброшен", + "allTrafficsReset": "Трафик всех клиентов сброшен", + "bulkDeleted": "Удалено клиентов: {count}", + "bulkDeletedMixed": "Удалено: {ok}, не удалось: {failed}", + "bulkCreated": "Создано клиентов: {count}", + "bulkCreatedMixed": "Создано: {ok}, не удалось: {failed}", + "delDepleted": "Удалено исчерпанных клиентов: {count}" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Выберите клиента для входящего подключения {{ .Inbound }}", "chooseInbound": "Выберите входящее подключение" } - } + }, + "refresh": "Обновить" } diff --git a/web/translation/tr-TR.json b/web/translation/tr-TR.json index 3993163b..fd9e6ae8 100644 --- a/web/translation/tr-TR.json +++ b/web/translation/tr-TR.json @@ -99,7 +99,8 @@ "xray": "Xray Yapılandırmaları", "apiDocs": "API Belgeleri", "logout": "Çıkış Yap", - "link": "Yönet" + "link": "Yönet", + "clients": "İstemciler" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "İstek Başlığı", "responseHeader": "Yanıt Başlığı" } + }, + "portFallback": { + "title": "Yedek inbound'lar", + "help": "Bu VLESS-TLS inbound'unun eşleşmediği trafiği almasını istediğiniz inbound'ları seçin. Yönlendirilen bağlantıları alabilmek için her alt inbound 127.0.0.1 üzerinde dinlemelidir.", + "child": "Inbound", + "path": "Yol" } }, "client": { @@ -450,7 +457,8 @@ "test": "Bağlantıyı test et", "fillRequired": "Ad, adres, port ve API token gereklidir", "probeFailed": "Test başarısız" - } + }, + "panelVersion": "Panel sürümü" }, "settings": { "title": "Panel Ayarları", @@ -800,6 +808,102 @@ "ipPool": "IP Havuzu Alt Ağı", "poolSize": "Havuz Boyutu" } + }, + "clients": { + "add": "İstemci ekle", + "edit": "İstemciyi düzenle", + "submitAdd": "İstemci ekle", + "submitEdit": "Değişiklikleri kaydet", + "clientCount": "İstemci sayısı", + "bulk": "Toplu ekle", + "copyFromInbound": "Inbound'dan istemcileri kopyala", + "copyToInbound": "İstemcileri kopyalanacak yer", + "copySelected": "Seçileni kopyala", + "copySource": "Kaynak", + "copyEmailPreview": "Oluşacak e-posta önizlemesi", + "copySelectSourceFirst": "Önce bir kaynak inbound seçin.", + "copyResult": "Kopya sonucu", + "copyResultSuccess": "Başarıyla kopyalandı", + "copyResultNone": "Kopyalanacak bir şey yok: istemci seçilmemiş veya kaynak boş", + "copyResultErrors": "Kopyalama hataları", + "copyFlowLabel": "Yeni istemciler için Flow (VLESS)", + "copyFlowHint": "Kopyalanan tüm istemcilere uygulanır. Atlamak için boş bırakın.", + "selectAll": "Tümünü seç", + "clearAll": "Tümünü temizle", + "method": "Yöntem", + "first": "İlk", + "last": "Son", + "ipLog": "IP günlüğü", + "prefix": "Önek", + "postfix": "Sonek", + "delayedStart": "İlk kullanımdan sonra başla", + "expireDays": "Süre", + "days": "Gün", + "renew": "Otomatik yenileme", + "renewDesc": "Süre dolduktan sonra otomatik yenileme. (0 = devre dışı) (birim: gün)", + "title": "İstemciler", + "actions": "Eylemler", + "totalGB": "Toplam Gönderilen/Alınan (GB)", + "expiryTime": "Son kullanma", + "addClients": "İstemci ekle", + "limitIp": "IP limiti", + "password": "Şifre", + "subId": "Abonelik ID'si", + "online": "Çevrimiçi", + "email": "E-posta", + "comment": "Yorum", + "traffic": "Trafik", + "offline": "Çevrimdışı", + "addTitle": "İstemci ekle", + "qrCode": "QR kodu", + "moreInformation": "Daha fazla bilgi", + "delete": "Sil", + "reset": "Trafiği sıfırla", + "editTitle": "İstemciyi düzenle", + "client": "İstemci", + "enabled": "Etkin", + "remaining": "Kalan", + "duration": "Süre", + "attachedInbounds": "Bağlı inbound'lar", + "selectInbound": "Bir veya daha fazla inbound seçin", + "noSubId": "Bu istemcinin subId'si yok, paylaşılabilir bağlantı yok.", + "noLinks": "Paylaşılabilir bağlantı yok — önce bu istemciyi protokol destekli bir inbound'a bağlayın.", + "link": "Bağlantı", + "resetNotPossible": "Önce bu istemciyi bir inbound'a bağlayın.", + "general": "Genel", + "resetAllTraffics": "Tüm istemcilerin trafiğini sıfırla", + "resetAllTrafficsTitle": "Tüm istemcilerin trafiği sıfırlansın mı?", + "resetAllTrafficsContent": "Her istemcinin yükleme/indirme sayaçları sıfırlanır. Kotalar ve son kullanma tarihleri etkilenmez. Geri alınamaz.", + "empty": "Henüz istemci yok — başlamak için bir tane ekleyin.", + "deleteConfirmTitle": "{email} istemcisi silinsin mi?", + "deleteConfirmContent": "Bu işlem istemciyi bağlı tüm inbound'lardan kaldırır ve trafik kaydını siler. Geri alınamaz.", + "deleteSelected": "Sil ({count})", + "bulkDeleteConfirmTitle": "{count} istemci silinsin mi?", + "bulkDeleteConfirmContent": "Seçili her istemci bağlı tüm inbound'lardan kaldırılır ve trafik kaydı silinir. Geri alınamaz.", + "delDepleted": "Tükenmişleri sil", + "delDepletedConfirmTitle": "Tükenmiş istemciler silinsin mi?", + "delDepletedConfirmContent": "Trafik kotası dolan veya süresi geçen tüm istemciler silinir. Geri alınamaz.", + "auth": "Auth", + "hysteriaAuth": "Hysteria Auth", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "İsteğe bağlı Reverse tag", + "telegramId": "Telegram kullanıcı ID'si", + "telegramIdPlaceholder": "Sayısal Telegram kullanıcı ID'si (0 = yok)", + "created": "Oluşturuldu", + "updated": "Güncellendi", + "ipLimit": "IP limiti", + "toasts": { + "deleted": "İstemci silindi", + "trafficReset": "Trafik sıfırlandı", + "allTrafficsReset": "Tüm istemcilerin trafiği sıfırlandı", + "bulkDeleted": "{count} istemci silindi", + "bulkDeletedMixed": "{ok} silindi, {failed} başarısız", + "bulkCreated": "{count} istemci oluşturuldu", + "bulkCreatedMixed": "{ok} oluşturuldu, {failed} başarısız", + "delDepleted": "{count} tükenmiş istemci silindi" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Gelen {{ .Inbound }} için bir Müşteri Seçin", "chooseInbound": "Bir Gelen Seçin" } - } + }, + "refresh": "Yenile" } diff --git a/web/translation/uk-UA.json b/web/translation/uk-UA.json index d40ab85b..337ca5f0 100644 --- a/web/translation/uk-UA.json +++ b/web/translation/uk-UA.json @@ -99,7 +99,8 @@ "xray": "Конфігурації Xray", "apiDocs": "Документація API", "logout": "Вийти", - "link": "Керувати" + "link": "Керувати", + "clients": "Клієнти" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "Заголовок запиту", "responseHeader": "Заголовок відповіді" } + }, + "portFallback": { + "title": "Резервні вхідні", + "help": "Виберіть вхідні, які мають отримувати трафік, що не відповідає цьому вхідному VLESS-TLS. Кожен дочірній вхідний повинен слухати на 127.0.0.1 для приймання переадресованих з'єднань.", + "child": "Вхідний", + "path": "Шлях" } }, "client": { @@ -450,7 +457,8 @@ "test": "Перевірити з'єднання", "fillRequired": "Назва, адреса, порт та токен API є обов'язковими", "probeFailed": "Помилка перевірки" - } + }, + "panelVersion": "Версія панелі" }, "settings": { "title": "Параметри панелі", @@ -800,6 +808,102 @@ "ipPool": "Підмережа IP-пулу", "poolSize": "Розмір пулу" } + }, + "clients": { + "add": "Додати клієнта", + "edit": "Редагувати клієнта", + "submitAdd": "Додати клієнта", + "submitEdit": "Зберегти зміни", + "clientCount": "Кількість клієнтів", + "bulk": "Масове додавання", + "copyFromInbound": "Скопіювати клієнтів із вхідного", + "copyToInbound": "Скопіювати клієнтів у", + "copySelected": "Скопіювати вибране", + "copySource": "Джерело", + "copyEmailPreview": "Перегляд email, що буде створено", + "copySelectSourceFirst": "Спочатку виберіть вхідний-джерело.", + "copyResult": "Результат копіювання", + "copyResultSuccess": "Скопійовано успішно", + "copyResultNone": "Нічого копіювати: не вибрано клієнтів або джерело порожнє", + "copyResultErrors": "Помилки копіювання", + "copyFlowLabel": "Flow для нових клієнтів (VLESS)", + "copyFlowHint": "Застосовується до всіх скопійованих клієнтів. Залишіть порожнім, щоб пропустити.", + "selectAll": "Вибрати все", + "clearAll": "Очистити все", + "method": "Метод", + "first": "Перший", + "last": "Останній", + "ipLog": "Журнал IP", + "prefix": "Префікс", + "postfix": "Постфікс", + "delayedStart": "Запуск після першого використання", + "expireDays": "Тривалість", + "days": "Дні", + "renew": "Авто-продовження", + "renewDesc": "Автоматичне продовження після закінчення. (0 = вимкнено) (одиниця: день)", + "title": "Клієнти", + "actions": "Дії", + "totalGB": "Усього надіслано/отримано (ГБ)", + "expiryTime": "Термін дії", + "addClients": "Додати клієнтів", + "limitIp": "Ліміт IP", + "password": "Пароль", + "subId": "ID підписки", + "online": "У мережі", + "email": "Email", + "comment": "Коментар", + "traffic": "Трафік", + "offline": "Не в мережі", + "addTitle": "Додати клієнта", + "qrCode": "QR-код", + "moreInformation": "Докладніше", + "delete": "Видалити", + "reset": "Скинути трафік", + "editTitle": "Редагувати клієнта", + "client": "Клієнт", + "enabled": "Увімкнено", + "remaining": "Залишок", + "duration": "Тривалість", + "attachedInbounds": "Прив'язані вхідні", + "selectInbound": "Виберіть один або кілька вхідних", + "noSubId": "У цього клієнта немає subId, посилання для спільного доступу відсутнє.", + "noLinks": "Немає посилань для спільного доступу — спочатку прив'яжіть цього клієнта до вхідного з підтримкою протоколу.", + "link": "Посилання", + "resetNotPossible": "Спочатку прив'яжіть цього клієнта до вхідного.", + "general": "Загальне", + "resetAllTraffics": "Скинути трафік усіх клієнтів", + "resetAllTrafficsTitle": "Скинути трафік усіх клієнтів?", + "resetAllTrafficsContent": "Лічильники відправлення/отримання кожного клієнта обнулюються. Квоти й термін дії не змінюються. Цю дію неможливо скасувати.", + "empty": "Клієнтів ще немає — додайте першого, щоб почати.", + "deleteConfirmTitle": "Видалити клієнта {email}?", + "deleteConfirmContent": "Клієнт буде вилучений з усіх прив'язаних вхідних, його запис трафіку буде знищено. Цю дію неможливо скасувати.", + "deleteSelected": "Видалити ({count})", + "bulkDeleteConfirmTitle": "Видалити {count} клієнтів?", + "bulkDeleteConfirmContent": "Кожен вибраний клієнт вилучається з усіх прив'язаних вхідних, його запис трафіку знищується. Цю дію неможливо скасувати.", + "delDepleted": "Видалити вичерпаних", + "delDepletedConfirmTitle": "Видалити вичерпаних клієнтів?", + "delDepletedConfirmContent": "Видаляються всі клієнти, у яких вичерпана квота трафіку або сплив термін. Цю дію неможливо скасувати.", + "auth": "Auth", + "hysteriaAuth": "Auth для Hysteria", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Необов'язковий Reverse tag", + "telegramId": "ID користувача Telegram", + "telegramIdPlaceholder": "Числовий ID користувача Telegram (0 = немає)", + "created": "Створено", + "updated": "Оновлено", + "ipLimit": "Ліміт IP", + "toasts": { + "deleted": "Клієнта видалено", + "trafficReset": "Трафік скинуто", + "allTrafficsReset": "Трафік усіх клієнтів скинуто", + "bulkDeleted": "Видалено клієнтів: {count}", + "bulkDeletedMixed": "Видалено: {ok}, не вдалось: {failed}", + "bulkCreated": "Створено клієнтів: {count}", + "bulkCreatedMixed": "Створено: {ok}, не вдалось: {failed}", + "delDepleted": "Видалено вичерпаних клієнтів: {count}" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Виберіть клієнта для Вхідного {{ .Inbound }}", "chooseInbound": "Виберіть Вхідний" } - } + }, + "refresh": "Оновити" } diff --git a/web/translation/vi-VN.json b/web/translation/vi-VN.json index a99ef339..b23f6522 100644 --- a/web/translation/vi-VN.json +++ b/web/translation/vi-VN.json @@ -99,7 +99,8 @@ "logout": "Đăng xuất", "xray": "Cài đặt Xray", "apiDocs": "Tài liệu API", - "link": "Quản lý" + "link": "Quản lý", + "clients": "Khách hàng" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "Header yêu cầu", "responseHeader": "Header phản hồi" } + }, + "portFallback": { + "title": "Inbound dự phòng", + "help": "Chọn các inbound sẽ tiếp nhận lưu lượng mà inbound VLESS-TLS này không khớp. Mỗi inbound con phải lắng nghe trên 127.0.0.1 để nhận các kết nối được chuyển tiếp.", + "child": "Inbound", + "path": "Đường dẫn" } }, "client": { @@ -450,7 +457,8 @@ "test": "Kiểm tra kết nối", "fillRequired": "Tên, địa chỉ, cổng và token API là bắt buộc", "probeFailed": "Kiểm tra thất bại" - } + }, + "panelVersion": "Phiên bản panel" }, "settings": { "title": "Cài đặt", @@ -800,6 +808,102 @@ "ipPool": "Mạng con nhóm IP", "poolSize": "Kích thước bể bơi" } + }, + "clients": { + "add": "Thêm khách hàng", + "edit": "Chỉnh sửa khách hàng", + "submitAdd": "Thêm khách hàng", + "submitEdit": "Lưu thay đổi", + "clientCount": "Số lượng khách hàng", + "bulk": "Thêm hàng loạt", + "copyFromInbound": "Sao chép khách hàng từ inbound", + "copyToInbound": "Sao chép khách hàng đến", + "copySelected": "Sao chép đã chọn", + "copySource": "Nguồn", + "copyEmailPreview": "Xem trước email kết quả", + "copySelectSourceFirst": "Hãy chọn inbound nguồn trước.", + "copyResult": "Kết quả sao chép", + "copyResultSuccess": "Đã sao chép thành công", + "copyResultNone": "Không có gì để sao chép: chưa chọn khách hàng hoặc nguồn rỗng", + "copyResultErrors": "Lỗi sao chép", + "copyFlowLabel": "Flow cho khách hàng mới (VLESS)", + "copyFlowHint": "Áp dụng cho tất cả khách hàng được sao chép. Để trống để bỏ qua.", + "selectAll": "Chọn tất cả", + "clearAll": "Xóa tất cả", + "method": "Phương thức", + "first": "Đầu", + "last": "Cuối", + "ipLog": "Nhật ký IP", + "prefix": "Tiền tố", + "postfix": "Hậu tố", + "delayedStart": "Bắt đầu sau lần dùng đầu", + "expireDays": "Thời hạn", + "days": "Ngày", + "renew": "Tự động gia hạn", + "renewDesc": "Tự động gia hạn sau khi hết hạn. (0 = tắt) (đơn vị: ngày)", + "title": "Khách hàng", + "actions": "Hành động", + "totalGB": "Tổng gửi/nhận (GB)", + "expiryTime": "Hết hạn", + "addClients": "Thêm khách hàng", + "limitIp": "Giới hạn IP", + "password": "Mật khẩu", + "subId": "ID đăng ký", + "online": "Trực tuyến", + "email": "Email", + "comment": "Ghi chú", + "traffic": "Lưu lượng", + "offline": "Ngoại tuyến", + "addTitle": "Thêm khách hàng", + "qrCode": "Mã QR", + "moreInformation": "Thông tin thêm", + "delete": "Xóa", + "reset": "Đặt lại lưu lượng", + "editTitle": "Chỉnh sửa khách hàng", + "client": "Khách hàng", + "enabled": "Đã bật", + "remaining": "Còn lại", + "duration": "Thời hạn", + "attachedInbounds": "Inbound đã gắn", + "selectInbound": "Chọn một hoặc nhiều inbound", + "noSubId": "Khách hàng này không có subId, không có liên kết chia sẻ.", + "noLinks": "Không có liên kết chia sẻ — hãy gắn khách hàng này vào một inbound có giao thức tương thích trước.", + "link": "Liên kết", + "resetNotPossible": "Hãy gắn khách hàng này vào một inbound trước.", + "general": "Chung", + "resetAllTraffics": "Đặt lại lưu lượng của tất cả khách hàng", + "resetAllTrafficsTitle": "Đặt lại lưu lượng của tất cả khách hàng?", + "resetAllTrafficsContent": "Bộ đếm gửi/nhận của mỗi khách hàng về 0. Hạn mức và thời hạn không bị ảnh hưởng. Không thể hoàn tác.", + "empty": "Chưa có khách hàng nào — thêm một để bắt đầu.", + "deleteConfirmTitle": "Xóa khách hàng {email}?", + "deleteConfirmContent": "Hành động này gỡ khách hàng khỏi mọi inbound đã gắn và xóa bản ghi lưu lượng. Không thể hoàn tác.", + "deleteSelected": "Xóa ({count})", + "bulkDeleteConfirmTitle": "Xóa {count} khách hàng?", + "bulkDeleteConfirmContent": "Mỗi khách hàng được chọn sẽ bị gỡ khỏi tất cả inbound đã gắn và bản ghi lưu lượng cũng bị xóa. Không thể hoàn tác.", + "delDepleted": "Xóa hết hạn mức", + "delDepletedConfirmTitle": "Xóa khách hàng hết hạn mức?", + "delDepletedConfirmContent": "Gỡ tất cả khách hàng đã dùng hết hạn mức lưu lượng hoặc đã quá hạn. Không thể hoàn tác.", + "auth": "Auth", + "hysteriaAuth": "Auth Hysteria", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "Reverse tag tùy chọn", + "telegramId": "ID người dùng Telegram", + "telegramIdPlaceholder": "ID người dùng Telegram dạng số (0 = không có)", + "created": "Tạo", + "updated": "Cập nhật", + "ipLimit": "Giới hạn IP", + "toasts": { + "deleted": "Đã xóa khách hàng", + "trafficReset": "Đã đặt lại lưu lượng", + "allTrafficsReset": "Đã đặt lại lưu lượng của tất cả khách hàng", + "bulkDeleted": "Đã xóa {count} khách hàng", + "bulkDeletedMixed": "Đã xóa {ok}, thất bại {failed}", + "bulkCreated": "Đã tạo {count} khách hàng", + "bulkCreatedMixed": "Đã tạo {ok}, thất bại {failed}", + "delDepleted": "Đã xóa {count} khách hàng hết hạn mức" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "Chọn một Khách hàng cho Inbound {{ .Inbound }}", "chooseInbound": "Chọn một Inbound" } - } + }, + "refresh": "Làm mới" } diff --git a/web/translation/zh-CN.json b/web/translation/zh-CN.json index 0dea1cb8..be80fe9b 100644 --- a/web/translation/zh-CN.json +++ b/web/translation/zh-CN.json @@ -99,7 +99,8 @@ "xray": "Xray 设置", "apiDocs": "API 文档", "logout": "退出登录", - "link": "管理" + "link": "管理", + "clients": "客户端" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "请求头", "responseHeader": "响应头" } + }, + "portFallback": { + "title": "回退入站", + "help": "选择当此 VLESS-TLS 入站不匹配时应接收流量的入站。每个子入站必须监听 127.0.0.1 才能接收转发的连接。", + "child": "入站", + "path": "路径" } }, "client": { @@ -450,7 +457,8 @@ "test": "测试连接", "fillRequired": "名称、地址、端口和 API 令牌为必填项", "probeFailed": "探测失败" - } + }, + "panelVersion": "面板版本" }, "settings": { "title": "面板设置", @@ -800,6 +808,102 @@ "ipPool": "IP 池子网", "poolSize": "池大小" } + }, + "clients": { + "add": "添加客户端", + "edit": "编辑客户端", + "submitAdd": "添加客户端", + "submitEdit": "保存更改", + "clientCount": "客户端数量", + "bulk": "批量添加", + "copyFromInbound": "从入站复制客户端", + "copyToInbound": "复制客户端到", + "copySelected": "复制所选", + "copySource": "来源", + "copyEmailPreview": "生成的邮箱预览", + "copySelectSourceFirst": "请先选择一个来源入站。", + "copyResult": "复制结果", + "copyResultSuccess": "复制成功", + "copyResultNone": "没有内容可复制:未选中客户端或来源为空", + "copyResultErrors": "复制错误", + "copyFlowLabel": "新客户端的 Flow (VLESS)", + "copyFlowHint": "应用于所有被复制的客户端。留空则跳过。", + "selectAll": "全选", + "clearAll": "全部清除", + "method": "方式", + "first": "首个", + "last": "末位", + "ipLog": "IP 日志", + "prefix": "前缀", + "postfix": "后缀", + "delayedStart": "首次使用后开始", + "expireDays": "时长", + "days": "天", + "renew": "自动续期", + "renewDesc": "到期后自动续期。(0 = 禁用) (单位: 天)", + "title": "客户端", + "actions": "操作", + "totalGB": "总上传/下载 (GB)", + "expiryTime": "过期时间", + "addClients": "添加客户端", + "limitIp": "IP 限制", + "password": "密码", + "subId": "订阅 ID", + "online": "在线", + "email": "邮箱", + "comment": "备注", + "traffic": "流量", + "offline": "离线", + "addTitle": "添加客户端", + "qrCode": "二维码", + "moreInformation": "更多信息", + "delete": "删除", + "reset": "重置流量", + "editTitle": "编辑客户端", + "client": "客户端", + "enabled": "已启用", + "remaining": "剩余", + "duration": "时长", + "attachedInbounds": "关联入站", + "selectInbound": "选择一个或多个入站", + "noSubId": "该客户端没有 subId,无法生成共享链接。", + "noLinks": "没有可共享的链接 — 请先将此客户端关联到支持协议的入站。", + "link": "链接", + "resetNotPossible": "请先将此客户端关联到入站。", + "general": "通用", + "resetAllTraffics": "重置所有客户端流量", + "resetAllTrafficsTitle": "重置所有客户端流量?", + "resetAllTrafficsContent": "所有客户端的上下行计数器将归零。配额与过期时间不受影响。该操作不可撤销。", + "empty": "尚无客户端 — 添加一个开始使用。", + "deleteConfirmTitle": "删除客户端 {email}?", + "deleteConfirmContent": "将从所有关联入站中移除该客户端并删除其流量记录。该操作不可撤销。", + "deleteSelected": "删除 ({count})", + "bulkDeleteConfirmTitle": "删除 {count} 个客户端?", + "bulkDeleteConfirmContent": "每个所选客户端都会从关联的入站中被移除,其流量记录也会被删除。该操作不可撤销。", + "delDepleted": "删除已耗尽", + "delDepletedConfirmTitle": "删除已耗尽的客户端?", + "delDepletedConfirmContent": "删除所有流量配额已用尽或已过期的客户端。该操作不可撤销。", + "auth": "Auth", + "hysteriaAuth": "Hysteria Auth", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "可选 Reverse tag", + "telegramId": "Telegram 用户 ID", + "telegramIdPlaceholder": "数字形式的 Telegram 用户 ID (0 = 无)", + "created": "创建时间", + "updated": "更新时间", + "ipLimit": "IP 限制", + "toasts": { + "deleted": "客户端已删除", + "trafficReset": "流量已重置", + "allTrafficsReset": "所有客户端流量已重置", + "bulkDeleted": "已删除 {count} 个客户端", + "bulkDeletedMixed": "已删除 {ok} 个,失败 {failed} 个", + "bulkCreated": "已创建 {count} 个客户端", + "bulkCreatedMixed": "已创建 {ok} 个,失败 {failed} 个", + "delDepleted": "已删除 {count} 个已耗尽的客户端" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "为入站 {{ .Inbound }} 选择一个客户", "chooseInbound": "选择一个入站" } - } + }, + "refresh": "刷新" } diff --git a/web/translation/zh-TW.json b/web/translation/zh-TW.json index 6f217958..fe4beef1 100644 --- a/web/translation/zh-TW.json +++ b/web/translation/zh-TW.json @@ -99,7 +99,8 @@ "xray": "Xray 設定", "apiDocs": "API 文件", "logout": "退出登入", - "link": "管理" + "link": "管理", + "clients": "客戶端" }, "pages": { "login": { @@ -361,6 +362,12 @@ "requestHeader": "請求頭", "responseHeader": "響應頭" } + }, + "portFallback": { + "title": "回退入站", + "help": "選擇當此 VLESS-TLS 入站未匹配時應接收流量的入站。每個子入站必須監聽 127.0.0.1 才能接收轉發的連線。", + "child": "入站", + "path": "路徑" } }, "client": { @@ -450,7 +457,8 @@ "test": "測試連線", "fillRequired": "名稱、位址、埠與 API 權杖為必填", "probeFailed": "探測失敗" - } + }, + "panelVersion": "面板版本" }, "settings": { "title": "面板設定", @@ -800,6 +808,102 @@ "ipPool": "IP 池子網", "poolSize": "池大小" } + }, + "clients": { + "add": "新增客戶端", + "edit": "編輯客戶端", + "submitAdd": "新增客戶端", + "submitEdit": "儲存變更", + "clientCount": "客戶端數量", + "bulk": "批次新增", + "copyFromInbound": "從入站複製客戶端", + "copyToInbound": "複製客戶端至", + "copySelected": "複製所選", + "copySource": "來源", + "copyEmailPreview": "產生的信箱預覽", + "copySelectSourceFirst": "請先選擇一個來源入站。", + "copyResult": "複製結果", + "copyResultSuccess": "複製成功", + "copyResultNone": "沒有內容可複製:未選取客戶端或來源為空", + "copyResultErrors": "複製錯誤", + "copyFlowLabel": "新客戶端的 Flow (VLESS)", + "copyFlowHint": "套用至所有被複製的客戶端。留空則略過。", + "selectAll": "全選", + "clearAll": "全部清除", + "method": "方法", + "first": "首個", + "last": "末位", + "ipLog": "IP 日誌", + "prefix": "前綴", + "postfix": "後綴", + "delayedStart": "首次使用後開始", + "expireDays": "時長", + "days": "天", + "renew": "自動續期", + "renewDesc": "到期後自動續期。(0 = 停用) (單位: 天)", + "title": "客戶端", + "actions": "操作", + "totalGB": "總上傳/下載 (GB)", + "expiryTime": "到期時間", + "addClients": "新增客戶端", + "limitIp": "IP 限制", + "password": "密碼", + "subId": "訂閱 ID", + "online": "上線", + "email": "信箱", + "comment": "備註", + "traffic": "流量", + "offline": "離線", + "addTitle": "新增客戶端", + "qrCode": "QR 碼", + "moreInformation": "更多資訊", + "delete": "刪除", + "reset": "重設流量", + "editTitle": "編輯客戶端", + "client": "客戶端", + "enabled": "已啟用", + "remaining": "剩餘", + "duration": "時長", + "attachedInbounds": "關聯入站", + "selectInbound": "選擇一個或多個入站", + "noSubId": "此客戶端沒有 subId,無法產生共享連結。", + "noLinks": "沒有可共享的連結 — 請先將此客戶端關聯至支援協定的入站。", + "link": "連結", + "resetNotPossible": "請先將此客戶端關聯至入站。", + "general": "通用", + "resetAllTraffics": "重設所有客戶端流量", + "resetAllTrafficsTitle": "重設所有客戶端流量?", + "resetAllTrafficsContent": "所有客戶端的上下行計數器將歸零。配額與到期時間不受影響。此操作無法復原。", + "empty": "尚無客戶端 — 新增一個開始使用。", + "deleteConfirmTitle": "刪除客戶端 {email}?", + "deleteConfirmContent": "將從所有關聯入站中移除該客戶端並刪除其流量紀錄。此操作無法復原。", + "deleteSelected": "刪除 ({count})", + "bulkDeleteConfirmTitle": "刪除 {count} 個客戶端?", + "bulkDeleteConfirmContent": "每個所選客戶端都會從關聯的入站中被移除,其流量紀錄也會被刪除。此操作無法復原。", + "delDepleted": "刪除已耗盡", + "delDepletedConfirmTitle": "刪除已耗盡的客戶端?", + "delDepletedConfirmContent": "刪除所有流量配額已用盡或已過期的客戶端。此操作無法復原。", + "auth": "Auth", + "hysteriaAuth": "Hysteria Auth", + "uuid": "UUID", + "flow": "Flow", + "reverseTag": "Reverse tag", + "reverseTagPlaceholder": "選用 Reverse tag", + "telegramId": "Telegram 使用者 ID", + "telegramIdPlaceholder": "數字形式的 Telegram 使用者 ID (0 = 無)", + "created": "建立時間", + "updated": "更新時間", + "ipLimit": "IP 限制", + "toasts": { + "deleted": "客戶端已刪除", + "trafficReset": "流量已重設", + "allTrafficsReset": "所有客戶端流量已重設", + "bulkDeleted": "已刪除 {count} 個客戶端", + "bulkDeletedMixed": "已刪除 {ok} 個,失敗 {failed} 個", + "bulkCreated": "已建立 {count} 個客戶端", + "bulkCreatedMixed": "已建立 {ok} 個,失敗 {failed} 個", + "delDepleted": "已刪除 {count} 個已耗盡的客戶端" + } } }, "tgbot": { @@ -977,5 +1081,6 @@ "chooseClient": "為入站 {{ .Inbound }} 選擇一個客戶", "chooseInbound": "選擇一個入站" } - } + }, + "refresh": "重新整理" }