i18n(panel): migrate hardcoded panel strings to en-US and translate all locales

Surface ~400 hardcoded English labels, tooltips, placeholders, dt/divider
text, modal okText/cancelText, and Spin loading from the panel pages
(clients/groups/inbounds/nodes/settings/xray/sub/index) into
web/translation/en-US.json under existing pages.<page>.* namespaces, with
JSX swapped to t(...). Brand and protocol identifiers (TLS, MTU, SNI,
NordVPN, Cloudflare WARP, etc.) stay literal.

Sync all 12 non-English locales (ar-EG, es-ES, fa-IR, id-ID, ja-JP,
pt-BR, ru-RU, tr-TR, uk-UA, vi-VN, zh-CN, zh-TW) to match en-US's
structure and translate the 521 new key paths per locale. Every locale
file now has 1539 lines, mirroring en-US ordering.

Also remove a dead duplicate "info": "Info" key under pages.inbounds
that collided with the new pages.inbounds.info.* object.

Backend: bulk attach/detach errors in web/service/client.go now route
through logger.Warningf (so they appear under /panel/api/server/logs/)
instead of only living on the response payload.
This commit is contained in:
MHSanaei
2026-05-28 18:03:07 +02:00
parent 0829f1ecd4
commit 72b97efa8a
34 changed files with 6391 additions and 1125 deletions
+466 -49
View File
@@ -8,15 +8,22 @@
"save": "Guardar",
"logout": "Cerrar Sesión",
"create": "Crear",
"add": "Añadir",
"remove": "Quitar",
"update": "Actualizar",
"copy": "Copiar",
"copied": "Copiado",
"more": "más",
"download": "Descargar",
"remark": "Notas",
"enable": "Habilitar",
"protocol": "Protocolo",
"search": "Buscar",
"filter": "Filtrar",
"all": "Todos",
"from": "Desde",
"to": "Hasta",
"done": "Hecho",
"loading": "Cargando...",
"refresh": "Actualizar",
"clear": "Borrar",
@@ -27,7 +34,7 @@
"check": "Verificar",
"indefinite": "Indefinido",
"unlimited": "Ilimitado",
"none": "None",
"none": "Ninguno",
"qrCode": "Código QR",
"info": "Más Información",
"edit": "Editar",
@@ -40,15 +47,15 @@
"useIPv4ForHost": "Usar IPv4 para el host",
"transmission": "Transmisión",
"host": "Host",
"path": "Path",
"camouflage": "Camuflaje",
"path": "Ruta",
"camouflage": "Ofuscación",
"status": "Estado",
"enabled": "Habilitado",
"disabled": "Deshabilitado",
"depleted": "Agotado",
"depletingSoon": "Agotándose",
"offline": "fuera de línea",
"online": "en línea",
"offline": "Sin conexión",
"online": "En línea",
"domainName": "Nombre de dominio",
"monitor": "Listening IP",
"certificate": "Certificado Digital",
@@ -97,9 +104,10 @@
"dashboard": "Estado del Sistema",
"inbounds": "Entradas",
"clients": "Clientes",
"groups": "Grupos",
"nodes": "Nodos",
"settings": "Configuraciones",
"xray": "Ajustes Xray",
"settings": "Ajustes del panel",
"xray": "Configuración Xray",
"apiDocs": "Documentación de la API",
"logout": "Cerrar Sesión",
"link": "Gestionar",
@@ -123,7 +131,7 @@
"cpu": "CPU",
"logicalProcessors": "Procesadores lógicos",
"frequency": "Frecuencia",
"swap": "Memoria Virtual",
"swap": "Swap",
"storage": "Almacenamiento",
"memory": "RAM",
"threads": "Hilos",
@@ -166,7 +174,7 @@
"toggleIpVisibility": "Alternar visibilidad de la IP",
"overallSpeed": "Velocidad general",
"upload": "Subida",
"download": "Descarga",
"download": "Descargar",
"totalData": "Datos totales",
"sent": "Enviado",
"received": "Recibido",
@@ -228,7 +236,7 @@
"dontRefresh": "La instalación está en progreso, por favor no actualices esta página.",
"logs": "Registros",
"config": "Configuración",
"backup": "Сopia de Seguridad",
"backup": "Copia de seguridad",
"backupTitle": "Copia & Restauración",
"exportDatabase": "Copia de seguridad",
"exportDatabaseDesc": "Haz clic para descargar un archivo .db que contiene una copia de seguridad de tu base de datos actual en tu dispositivo.",
@@ -270,14 +278,14 @@
},
"protocol": "Protocolo",
"port": "Puerto",
"portMap": "Puertos de Destino",
"portMap": "Asignación de puertos",
"traffic": "Tráfico",
"details": "Detalles",
"transportConfig": "Transporte",
"expireDate": "Fecha de Expiración",
"createdAt": "Creado",
"updatedAt": "Actualizado",
"resetTraffic": "Restablecer Tráfico",
"resetTraffic": "Restablecer tráfico",
"addInbound": "Agregar Entrada",
"generalActions": "Acciones Generales",
"modifyInbound": "Modificar Entrada",
@@ -292,11 +300,29 @@
"delAllClients": "Eliminar todos los clientes",
"delAllClientsConfirmTitle": "¿Eliminar los {count} clientes de \"{remark}\"?",
"delAllClientsConfirmContent": "Elimina todos los clientes de este inbound y sus registros de tráfico. El inbound se mantiene. Esto no se puede deshacer.",
"attachClients": "Asociar clientes a…",
"addClientsToGroup": "Añadir clientes al grupo…",
"attachClientsTitle": "Asociar clientes desde «{remark}»",
"attachClientsDesc": "Asocia los mismos {count} cliente(s) (mismo UUID/contraseña y tráfico compartido) a las entradas seleccionadas. Permanecen también en esta entrada.",
"attachClientsTargets": "Entradas objetivo",
"attachClientsNoTargets": "No hay otras entradas compatibles disponibles para asociar.",
"attachClientsResult": "Asociados {attached}, omitidos {skipped}.",
"attachClientsResultMixed": "Asociados {attached}, omitidos {skipped}, errores {errors}.",
"attachClientsSelectLabel": "Clientes para asociar",
"attachClientsSearchPlaceholder": "Buscar email o comentario",
"attachClientsStatusDisabled": "Deshabilitado",
"attachClientsSelectedCount": "{selected} de {total} seleccionado(s)",
"detachClients": "Desasociar clientes",
"detachClientsTitle": "Desasociar clientes de «{remark}»",
"detachClientsDesc": "Quita el cliente o clientes seleccionados solo de esta entrada. Los registros se conservan (usa Delete para eliminar por completo). El origen tiene {count} cliente(s) en total.",
"detachClientsResult": "Desasociados {detached}, omitidos {skipped}.",
"detachClientsResultMixed": "Desasociados {detached}, omitidos {skipped}, errores {errors}.",
"detachClientsSelectLabel": "Clientes para desasociar",
"exportLinksTitle": "Exportar enlaces del inbound",
"exportSubsTitle": "Exportar enlaces de suscripción",
"exportAllLinksTitle": "Exportar todos los enlaces de inbound",
"exportAllSubsTitle": "Exportar todos los enlaces de suscripción",
"inboundJsonTitle": "JSON del inbound",
"inboundJsonTitle": "JSON de entrada",
"deleteClient": "Eliminar cliente",
"deleteClientContent": "¿Está seguro de que desea eliminar el cliente?",
"resetTrafficContent": "¿Confirmar restablecimiento de tráfico?",
@@ -306,7 +332,7 @@
"destinationPort": "Puerto de Destino",
"targetAddress": "Dirección de Destino",
"monitorDesc": "Dejar en blanco por defecto",
"meansNoLimit": " = illimitata. (unidad: GB)",
"meansNoLimit": "= Ilimitado. (unidad: GB)",
"totalFlow": "Flujo Total",
"leaveBlankToNeverExpire": "Dejar en Blanco para Nunca Expirar",
"noRecommendKeepDefault": "No hay requisitos especiales para mantener la configuración predeterminada",
@@ -341,6 +367,7 @@
"IPLimitlogDesc": "Registro de historial de IPs (antes de habilitar la entrada después de que haya sido desactivada por el límite de IP, debes borrar el registro).",
"IPLimitlogclear": "Limpiar el Registro",
"setDefaultCert": "Establecer certificado desde el panel",
"setDefaultCertEmpty": "No hay certificado configurado para el panel. Configura uno en Ajustes primero.",
"streamTab": "Stream",
"securityTab": "Seguridad",
"sniffingTab": "Sniffing",
@@ -369,7 +396,6 @@
},
"telegramDesc": "Por favor, proporciona el ID de Chat de Telegram. (usa el comando '/id' en el bot) o ({'@'}userinfobot)",
"subscriptionDesc": "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones.",
"info": "Info",
"same": "misma",
"inboundData": "Datos de entrada",
"exportInbound": "Exportación entrante",
@@ -406,6 +432,139 @@
"getNewmldsa65Error": "Error al obtener el certificado mldsa65.",
"getNewVlessEncError": "Error al obtener el certificado VlessEnc."
},
"form": {
"moveUp": "Subir",
"moveDown": "Bajar",
"addAll": "Añadir todo",
"addAllFallbackTooltip": "Añade una fila de fallback para cada entrada elegible aún no conectada",
"peers": "Peers",
"addPeer": "Añadir peer",
"keepAlive": "Keep-alive",
"autoSystemRoutesTooltip": "Solo Windows. Los CIDR se añaden automáticamente a la tabla de enrutamiento del sistema para que el tráfico coincidente pase por TUN.",
"autoOutboundsInterface": "Interfaz de salidas automática",
"autoOutboundsInterfaceTooltip": "Interfaz física para tráfico de salida. Usa 'auto' para detectar; se habilita automáticamente cuando se establece Auto system routes.",
"rewriteAddress": "Reescribir dirección",
"rewritePort": "Reescribir puerto",
"allowedNetwork": "Red permitida",
"followRedirect": "Seguir redirección",
"accounts": "Cuentas",
"allowTransparent": "Permitir transparente",
"encryptionMethod": "Método de cifrado",
"visionTestseed": "Vision testseed",
"version": "Versión",
"udpIdleTimeout": "UDP idle timeout (s)",
"masquerade": "Masquerade",
"type": "Tipo",
"upstreamUrl": "URL Upstream",
"rewriteHost": "Reescribir Host",
"skipTlsVerify": "Saltar verificación TLS",
"directory": "Directorio",
"statusCode": "Código de estado",
"body": "Body",
"headers": "Cabeceras",
"proxyProtocol": "Proxy Protocol",
"requestVersion": "Versión de petición",
"requestMethod": "Método de petición",
"requestPath": "Ruta de petición",
"requestHeaders": "Cabeceras de petición",
"responseVersion": "Versión de respuesta",
"responseStatus": "Estado de respuesta",
"responseReason": "Razón de respuesta",
"responseHeaders": "Cabeceras de respuesta",
"heartbeatPeriod": "Periodo de heartbeat",
"serviceName": "Nombre de servicio",
"authority": "Authority",
"multiMode": "Multi Mode",
"maxBufferedUpload": "Máx. subida en búfer",
"maxUploadSize": "Tamaño máx. de subida (Byte)",
"streamUpServer": "Stream-Up Server",
"serverMaxHeaderBytes": "Máx. bytes cabecera servidor",
"paddingBytes": "Bytes de Padding",
"uplinkHttpMethod": "Método HTTP Uplink",
"paddingObfsMode": "Modo obfs de Padding",
"paddingKey": "Padding Key",
"paddingHeader": "Padding Header",
"paddingPlacement": "Ubicación de Padding",
"paddingMethod": "Método de Padding",
"sessionPlacement": "Session Placement",
"sessionKey": "Session Key",
"sequencePlacement": "Sequence Placement",
"sequenceKey": "Sequence Key",
"uplinkDataPlacement": "Uplink Data Placement",
"uplinkDataKey": "Uplink Data Key",
"noSseHeader": "Sin cabecera SSE",
"ttiMs": "TTI (ms)",
"uplinkMbps": "Subida (MB/s)",
"downlinkMbps": "Bajada (MB/s)",
"cwndMultiplier": "Multiplicador CWND",
"maxSendingWindow": "Máx. ventana de envío",
"externalProxy": "Proxy externo",
"sniPlaceholder": "SNI (por defecto = host)",
"fingerprint": "Fingerprint",
"defaultOption": "Por defecto",
"routeMark": "Route Mark",
"tcpKeepAliveInterval": "TCP Keep Alive Interval",
"tcpKeepAliveIdle": "TCP Keep Alive Idle",
"tcpMaxSeg": "TCP Max Seg",
"tcpUserTimeout": "TCP User Timeout",
"tcpWindowClamp": "TCP Window Clamp",
"tcpFastOpen": "TCP Fast Open",
"multipathTcp": "Multipath TCP",
"penetrate": "Penetrate",
"v6Only": "Solo V6",
"tcpCongestion": "TCP Congestion",
"dialerProxy": "Dialer Proxy",
"trustedXForwardedFor": "X-Forwarded-For de confianza",
"addressPortStrategy": "Estrategia dirección+puerto",
"tryDelayMs": "Retraso de intento (ms)",
"prioritizeIPv6": "Priorizar IPv6",
"interleave": "Interleave",
"maxConcurrentTry": "Máx. intentos simultáneos",
"customSockopt": "Sockopt personalizado",
"addCustomOption": "Añadir opción personalizada",
"serverNameIndication": "SNI",
"cipherSuites": "Cipher Suites",
"autoOption": "Auto",
"minMaxVersion": "Versión mín/máx",
"rejectUnknownSni": "Rechazar SNI desconocido",
"disableSystemRoot": "Deshabilitar System Root",
"sessionResumption": "Reanudación de sesión",
"oneTimeLoading": "Carga única",
"usageOption": "Opción de uso",
"buildChain": "Construir cadena",
"echKey": "ECH key",
"echConfig": "Config ECH",
"getNewEchCert": "Obtener nuevo cert ECH",
"show": "Mostrar",
"xver": "Xver",
"target": "Objetivo",
"maxTimeDiff": "Máx. diferencia de tiempo (ms)",
"minClientVer": "Mín. versión cliente",
"maxClientVer": "Máx. versión cliente",
"shortIds": "Short IDs",
"spiderX": "SpiderX",
"getNewCert": "Obtener nuevo cert",
"mldsa65Seed": "mldsa65 Seed",
"mldsa65Verify": "mldsa65 Verify",
"getNewSeed": "Obtener nuevo Seed"
},
"info": {
"mode": "Modo",
"grpcServiceName": "grpc serviceName",
"grpcMultiMode": "grpc multiMode",
"interfaceName": "Nombre de interfaz",
"mtu": "MTU",
"gateway": "Gateway",
"dns": "DNS",
"outboundsInterface": "Interfaz de salidas",
"autoSystemRoutes": "Rutas del sistema automáticas",
"followRedirect": "FollowRedirect",
"auth": "Auth",
"noKernelTun": "TUN sin kernel",
"keepAlive": "Keep alive",
"peerNumber": "Peer {n}",
"peerNumberConfig": "Config Peer {n}"
},
"stream": {
"general": {
"request": "Pedido",
@@ -416,7 +575,7 @@
"tcp": {
"version": "Versión",
"method": "Método",
"path": "Camino",
"path": "Ruta",
"status": "Estado",
"statusDescription": "Descripción de la Situación",
"requestHeader": "Encabezado de solicitud",
@@ -456,6 +615,20 @@
"days": "Día(s)",
"renew": "Renovación automática",
"renewDesc": "Renovación automática tras la expiración. (0 = desactivado) (unidad: día)",
"searchPlaceholder": "Buscar email, comentario, sub ID, UUID, contraseña, auth…",
"filterTitle": "Filtrar clientes",
"clearAllFilters": "Limpiar todo",
"sortOldest": "Más antiguos",
"sortNewest": "Más recientes",
"sortRecentlyUpdated": "Recientemente actualizados",
"sortRecentlyOnline": "Recientemente en línea",
"sortEmailAZ": "Email A→Z",
"sortEmailZA": "Email Z→A",
"sortMostTraffic": "Mayor tráfico",
"sortHighestRemaining": "Mayor restante",
"sortExpiringSoonest": "Caducidad más próxima",
"has": "Tiene",
"hasNot": "No tiene",
"title": "Clientes",
"actions": "Acciones",
"totalGB": "Total enviado/recibido (GB)",
@@ -465,10 +638,13 @@
"password": "Contraseña",
"subId": "ID de suscripción",
"online": "En línea",
"email": "Correo",
"email": "Email",
"group": "Grupo",
"groupDesc": "Etiqueta lógica para agrupar clientes relacionados (p. ej. equipo, cliente, región). Filtrable desde la barra de herramientas.",
"groupPlaceholder": "p. ej. customer-a",
"comment": "Comentario",
"traffic": "Tráfico",
"offline": "Desconectado",
"offline": "Sin conexión",
"addTitle": "Añadir cliente",
"qrCode": "Código QR",
"moreInformation": "Más información",
@@ -489,11 +665,45 @@
"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})",
"adjustSelected": "Ajustar ({count})",
"subLinksSelected": "Enlaces sub ({count})",
"addToGroupTitle": "Añadir {count} cliente(s) a un grupo",
"addToGroupTooltip": "Selecciona un grupo existente o escribe un nombre nuevo. Usa Ungroup para quitar clientes de su grupo actual.",
"addToGroupPlaceholder": "Nombre del grupo",
"addToGroupSuccessToast": "Se añadieron {count} cliente(s) a {group}",
"ungroupSuccessToast": "Grupo limpiado de {count} cliente(s)",
"ungroup": "Desagrupar",
"ungroupConfirmTitle": "¿Quitar {count} cliente(s) de su grupo?",
"ungroupConfirmContent": "Limpia la etiqueta de grupo en cada cliente seleccionado. Los clientes se conservan (usa Delete para eliminarlos por completo).",
"addToGroup": "Añadir al grupo",
"attach": "Asociar",
"adjust": "Ajustar",
"subLinks": "Enlaces sub",
"selectedCount": "{count} seleccionado(s)",
"attachSelected": "Asociar ({count})",
"attachToInboundsTitle": "Asociar {count} cliente(s) a entrada(s)",
"attachToInboundsDesc": "Asocia los {count} cliente(s) seleccionados (mismo UUID/contraseña y tráfico compartido) a las entradas elegidas. Mantienen sus asociaciones existentes.",
"attachToInboundsTargets": "Entradas objetivo",
"attachToInboundsNoTargets": "No hay entradas multiusuario disponibles para asociar.",
"detachSelected": "Desasociar ({count})",
"detach": "Desasociar",
"detachFromInboundsTitle": "Desasociar {count} cliente(s) de entrada(s)",
"detachFromInboundsDesc": "Quita los {count} cliente(s) seleccionados de las entradas elegidas. Las parejas donde el cliente no estaba asociado se omiten silenciosamente. Los registros de los clientes se conservan (usa Delete para eliminar por completo).",
"detachFromInboundsTargets": "Entradas para desasociar",
"detachFromInboundsNoTargets": "No hay entradas multiusuario disponibles.",
"detachFromInboundsResult": "Desasociados {detached}, omitidos {skipped}.",
"detachFromInboundsResultMixed": "Desasociados {detached}, omitidos {skipped}, errores {errors}.",
"subLinksTitle": "Enlaces sub ({count})",
"subLinkColumn": "URL de suscripción",
"subJsonLinkColumn": "URL JSON de suscripción",
"subLinksCopyAll": "Copiar todo",
"subLinksCopiedAll": "Copiados {count} enlace(s)",
"subLinksEmpty": "Ninguno de los clientes seleccionados tiene ID de suscripción.",
"subLinksDisabled": "El servicio de suscripción está deshabilitado.",
"subLinksDisabledHint": "Habilita la suscripción en Ajustes del panel → Suscripción para generar enlaces.",
"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.",
"bulkAdjustTitle": "Ajustar {count} clientes",
@@ -505,10 +715,11 @@
"delDepletedConfirmTitle": "¿Eliminar clientes agotados?",
"delDepletedConfirmContent": "Elimina todos los clientes con cuota agotada o expirados. No se puede deshacer.",
"auth": "Auth",
"hysteriaAuth": "Auth de Hysteria",
"hysteriaAuth": "Hysteria Auth",
"uuid": "UUID",
"flow": "Flow",
"reverseTag": "Reverse tag",
"vmessSecurity": "Seguridad VMess",
"reverseTag": "Etiqueta inversa",
"reverseTagPlaceholder": "Reverse tag opcional",
"telegramId": "ID de usuario de Telegram",
"telegramIdPlaceholder": "ID numérico de usuario de Telegram (0 = ninguno)",
@@ -528,13 +739,51 @@
"delDepleted": "{count} clientes agotados eliminados"
}
},
"groups": {
"title": "Grupos",
"name": "Nombre",
"clientCount": "Clientes en el grupo",
"totalGroups": "Total de grupos",
"totalGroupedClients": "Clientes con grupo",
"emptyGroups": "Grupos vacíos",
"addGroup": "Añadir grupo",
"createSuccess": "Grupo «{name}» creado.",
"rename": "Renombrar",
"renameTitle": "Renombrar {name}",
"renameCollision": "Ya existe un grupo llamado «{name}».",
"renameSuccess": "Grupo renombrado en {count} cliente(s).",
"deleteConfirmTitle": "¿Eliminar el grupo {name}?",
"deleteConfirmContent": "Esto elimina el grupo y limpia su etiqueta de {count} cliente(s). Los clientes en sí no se eliminan.",
"deleteSuccess": "Grupo limpiado de {count} cliente(s).",
"resetTraffic": "Restablecer tráfico",
"resetConfirmTitle": "¿Restablecer tráfico del grupo {name}?",
"resetConfirmContent": "Esto pone a cero up/down para los {count} cliente(s) de este grupo.",
"resetSuccess": "Tráfico restablecido en {count} cliente(s).",
"adjustSuccess": "Ajustados {count} cliente(s) en {name}.",
"emptyForAction": "Este grupo aún no tiene clientes.",
"deleteGroupOnly": "Eliminar grupo (conservar clientes)",
"deleteClients": "Eliminar clientes del grupo",
"deleteClientsConfirmTitle": "¿Eliminar todos los clientes en {name}?",
"deleteClientsConfirmContent": "Esto elimina permanentemente {count} cliente(s) junto con sus registros de tráfico. La etiqueta de grupo también se limpia. Esto no se puede deshacer.",
"deleteClientsSuccess": "Eliminados {count} cliente(s).",
"deleteClientsMixed": "{ok} eliminados, {failed} omitidos",
"addToGroup": "Añadir clientes…",
"addToGroupTitle": "Añadir clientes al grupo «{name}»",
"addToGroupDesc": "Selecciona clientes para añadir a este grupo. Mantienen sus asociaciones de entrada existentes; solo cambia la etiqueta de grupo. Los clientes que ya están en este grupo no se muestran.",
"addToGroupEmpty": "No hay otros clientes disponibles para añadir.",
"addToGroupResult": "Añadidos {count} cliente(s) a {name}.",
"removeFromGroup": "Quitar clientes…",
"removeFromGroupTitle": "Quitar clientes del grupo «{name}»",
"removeFromGroupDesc": "Selecciona miembros para quitar de este grupo. Los clientes se conservan (usa «Eliminar clientes del grupo» para eliminarlos por completo).",
"removeFromGroupResult": "Quitados {count} cliente(s) de {name}."
},
"nodes": {
"title": "Nodos",
"addNode": "Agregar nodo",
"editNode": "Editar nodo",
"totalNodes": "Total de nodos",
"onlineNodes": "En línea",
"offlineNodes": "Desconectado",
"offlineNodes": "Sin conexión",
"avgLatency": "Latencia media",
"name": "Nombre",
"namePlaceholder": "p. ej. de-frankfurt-1",
@@ -544,7 +793,7 @@
"address": "Dirección",
"port": "Puerto",
"basePath": "Ruta base",
"apiToken": "Token de API",
"apiToken": "Token API",
"apiTokenPlaceholder": "Token desde la página de Configuración del panel remoto",
"apiTokenHint": "El panel remoto expone su token de API en Configuración → Token de API.",
"regenerate": "Regenerar token",
@@ -571,7 +820,7 @@
"deleteConfirmContent": "Esto detiene la monitorización del nodo. El panel remoto en sí no se ve afectado.",
"statusValues": {
"online": "En línea",
"offline": "Desconectado",
"offline": "Sin conexión",
"unknown": "Desconocido"
},
"toasts": {
@@ -590,7 +839,7 @@
"title": "Configuraciones",
"save": "Guardar",
"infoDesc": "Cada cambio realizado aquí debe ser guardado. Por favor, reinicie el panel para aplicar los cambios.",
"restartPanel": "Reiniciar Panel",
"restartPanel": "Reiniciar panel",
"restartPanelDesc": "¿Está seguro de que desea reiniciar el panel? Haga clic en Aceptar para reiniciar después de 3 segundos. Si no puede acceder al panel después de reiniciar, por favor, consulte la información de registro del panel en el servidor.",
"restartPanelSuccess": "El panel se reinició correctamente",
"actions": "Acciones",
@@ -604,7 +853,7 @@
"warnDefaultBasePath": "La ruta base por defecto \"/\" es conocida — cámbiela a una ruta aleatoria.",
"warnDefaultSubPath": "La ruta de suscripción por defecto \"/sub/\" es conocida — cámbiela.",
"warnDefaultJsonPath": "La ruta de suscripción JSON por defecto \"/json/\" es conocida — cámbiela.",
"TGBotSettings": "Configuraciones de Bot de Telegram",
"TGBotSettings": "Bot de Telegram",
"panelListeningIP": "IP de Escucha del Panel",
"panelListeningIPDesc": "Dejar en blanco por defecto para monitorear todas las IPs.",
"panelListeningDomain": "Dominio de Escucha del Panel",
@@ -615,10 +864,12 @@
"publicKeyPathDesc": "Complete con una ruta absoluta que comience con.",
"privateKeyPath": "Ruta del Archivo de Clave Privada del Certificado del Panel",
"privateKeyPathDesc": "Complete con una ruta absoluta que comience con.",
"panelUrlPath": "Ruta Raíz de la URL del Panel",
"panelUrlPath": "Ruta URI",
"panelUrlPathDesc": "Debe empezar con '/' y terminar con.",
"pageSize": "Tamaño de paginación",
"pageSizeDesc": "Defina el tamaño de página para la tabla de entradas. Establezca 0 para desactivar",
"panelProxy": "Proxy de red del panel",
"panelProxyDesc": "Enruta las peticiones salientes del propio panel (actualizaciones de geo, comprobaciones de versión de Xray/panel, Telegram) a través de este proxy para sortear el filtrado de GitHub/Telegram en el servidor. Acepta socks5:// o http(s)://, p. ej. una entrada SOCKS local de Xray. Deja vacío para conexión directa.",
"remarkModel": "Modelo de observación y carácter de separación",
"datepicker": "selector de fechas",
"datepickerPlaceholder": "Seleccionar fecha",
@@ -632,9 +883,9 @@
"telegramBotEnableDesc": "Conéctese a las funciones de este panel a través del bot de Telegram.",
"telegramToken": "Token de Telegram",
"telegramTokenDesc": "Debe obtener el token del administrador de bots de Telegram {'@'}botfather.",
"telegramProxy": "Socks5 Proxy",
"telegramProxy": "Proxy SOCKS",
"telegramProxyDesc": "Si necesita el proxy Socks5 para conectarse a Telegram. Ajuste su configuración según la guía.",
"telegramAPIServer": "API Server de Telegram",
"telegramAPIServer": "Servidor API de Telegram",
"telegramAPIServerDesc": "El servidor API de Telegram a utilizar. Déjelo en blanco para utilizar el servidor predeterminado.",
"telegramChatId": "IDs de Chat de Telegram para Administradores",
"telegramChatIdDesc": "IDs de Chat múltiples separados por comas. Use {'@'}userinfobot o use el comando '/id' en el bot para obtener sus IDs de Chat.",
@@ -658,6 +909,8 @@
"subEnable": "Habilitar Servicio",
"subEnableDesc": "Función de suscripción con configuración separada.",
"subJsonEnable": "Habilitar/Deshabilitar el endpoint de suscripción JSON de forma independiente.",
"subJsonEnableTitle": "Suscripción JSON",
"subClashEnableTitle": "Suscripción Clash / Mihomo",
"subTitle": "Título de la Suscripción",
"subTitleDesc": "Título mostrado en el cliente VPN",
"subSupportUrl": "URL de soporte",
@@ -678,13 +931,13 @@
"subCertPathDesc": "Complete con una ruta absoluta que comience con '/'",
"subKeyPath": "Ruta del Archivo de Clave Privada del Certificado de Suscripción",
"subKeyPathDesc": "Complete con una ruta absoluta que comience con '/'",
"subPath": "Ruta Raíz de la URL de Suscripción",
"subPath": "Ruta URI",
"subPathDesc": "Debe empezar con '/' y terminar con '/'",
"subDomain": "Dominio de Escucha",
"subDomainDesc": "Dejar en blanco por defecto para monitorear todos los dominios e IPs.",
"subUpdates": "Intervalos de Actualización de Suscripción",
"subUpdatesDesc": "Horas de intervalo entre actualizaciones en la aplicación del cliente.",
"subEncrypt": "Encriptar configuraciones",
"subEncrypt": "Codificar",
"subEncryptDesc": "Encriptar las configuraciones devueltas en la suscripción.",
"subShowInfo": "Mostrar información de uso",
"subShowInfoDesc": "Mostrar tráfico restante y fecha después del nombre de configuración.",
@@ -693,7 +946,7 @@
"subURI": "URI de proxy inverso",
"subURIDesc": "Cambiar el URI base de la URL de suscripción para usar detrás de los servidores proxy",
"externalTrafficInformEnable": "Informe de tráfico externo",
"externalTrafficInformEnableDesc": "Informar a la API externa sobre cada actualización de tráfico.",
"externalTrafficInformEnableDesc": "Informar a una API externa en cada actualización de tráfico.",
"externalTrafficInformURI": "URI de información de tráfico externo",
"externalTrafficInformURIDesc": "Las actualizaciones de tráfico se envían a este URI.",
"restartXrayOnClientDisable": "Reiniciar Xray tras desactivación automática",
@@ -703,6 +956,54 @@
"fragmentSett": "Configuración de Fragmentación",
"noisesDesc": "Activar Sonidos",
"noisesSett": "Configuración de Sonidos",
"trustedProxyCidrs": "CIDR de proxy de confianza",
"trustedProxyCidrsDesc": "IP/CIDR separados por coma que pueden establecer las cabeceras de host, proto e IP del cliente reenviadas.",
"ldap": {
"enable": "Habilitar sincronización LDAP",
"host": "Host LDAP",
"port": "Puerto LDAP",
"useTls": "Usar TLS (LDAPS)",
"bindDn": "Bind DN",
"passwordConfigured": "Configurada; deja en blanco para mantener la contraseña actual.",
"passwordUnconfigured": "No configurada.",
"passwordPlaceholder": "Configurada — introduce un nuevo valor para reemplazar",
"baseDn": "Base DN",
"userFilter": "Filtro de usuario",
"userAttr": "Atributo de usuario (username/email)",
"vlessField": "Atributo flag VLESS",
"flagField": "Atributo flag genérico (opcional)",
"flagFieldDesc": "Si se establece, sobrescribe el flag VLESS — p. ej. shadowInactive.",
"truthyValues": "Valores truthy",
"truthyValuesDesc": "Separados por coma; por defecto: true,1,yes,on",
"invertFlag": "Invertir flag",
"invertFlagDesc": "Habilita cuando el atributo significa «deshabilitado» (p. ej. shadowInactive).",
"syncSchedule": "Programación de sincronización",
"syncScheduleDesc": "Cadena tipo cron, p. ej. @every 1m",
"inboundTags": "Etiquetas de entradas",
"inboundTagsDesc": "Entradas en las que la sincronización LDAP puede auto-crear o auto-eliminar clientes.",
"noInbounds": "No se encontraron entradas. Crea una en Entradas primero.",
"autoCreate": "Crear clientes automáticamente",
"autoDelete": "Eliminar clientes automáticamente",
"defaultTotalGb": "Total por defecto (GB)",
"defaultExpiryDays": "Caducidad por defecto (días)",
"defaultIpLimit": "Límite IP por defecto"
},
"subFormats": {
"packets": "Paquetes",
"length": "Longitud",
"interval": "Intervalo",
"maxSplit": "Máx. división",
"noises": "Ruidos",
"noiseItem": "Ruido №{n}",
"type": "Tipo",
"packet": "Paquete",
"delayMs": "Retraso (ms)",
"applyTo": "Aplicar a",
"addNoise": "+ Ruido",
"concurrency": "Concurrencia",
"xudpConcurrency": "Concurrencia xudp",
"xudpUdp443": "xudp UDP 443"
},
"mux": "Mux",
"muxDesc": "Transmite múltiples flujos de datos independientes dentro de un flujo de datos establecido.",
"muxSett": "Configuración Mux",
@@ -758,6 +1059,9 @@
"save": "Guardar configuración",
"restart": "Reiniciar Xray",
"restartSuccess": "Xray se ha reiniciado correctamente",
"restartOutputTitle": "Salida del reinicio de Xray",
"restartConfirmTitle": "¿Reiniciar xray?",
"restartConfirmContent": "Recarga el servicio xray con la configuración guardada.",
"stopSuccess": "Xray se ha detenido correctamente",
"restartError": "Ocurrió un error al reiniciar Xray.",
"stopError": "Ocurrió un error al detener Xray.",
@@ -790,14 +1094,16 @@
"outboundTestUrl": "URL de prueba de outbound",
"outboundTestUrlDesc": "URL usada al probar la conectividad del outbound",
"Torrent": "Prohibir Uso de BitTorrent",
"Inbounds": "Entrante",
"Inbounds": "Entradas",
"InboundsDesc": "Cambia la plantilla de configuración para aceptar clientes específicos.",
"Outbounds": "Salidas",
"Balancers": "Equilibradores",
"balancerTagRequired": "La etiqueta es obligatoria",
"balancerSelectorRequired": "Elige al menos una salida",
"OutboundsDesc": "Cambia la plantilla de configuración para definir formas de salida para este servidor.",
"Routings": "Reglas de enrutamiento",
"RoutingsDesc": "¡La prioridad de cada regla es importante!",
"completeTemplate": "Todos",
"completeTemplate": "Todo",
"logLevel": "Nivel de registro",
"logLevelDesc": "El nivel de registro para registros de errores, que indica la información que debe registrarse.",
"accessLog": "Registro de acceso",
@@ -827,11 +1133,78 @@
"inbound": "Entrante",
"outbound": "Saliente",
"balancer": "Equilibrador",
"info": "Información",
"info": "Info",
"add": "Agregar Regla",
"edit": "Editar Regla",
"useComma": "Elementos separados por comas"
},
"routing": {
"dragToReorder": "Arrastra para reordenar"
},
"ruleForm": {
"sourceIps": "IPs de origen",
"sourcePort": "Puerto de origen",
"vlessRoute": "Ruta VLESS",
"attributes": "Atributos",
"value": "Valor",
"user": "Usuario",
"inboundTags": "Etiquetas de entradas",
"outboundTag": "Etiqueta de salida",
"balancerTag": "Etiqueta de balanceador",
"balancerTagTooltip": "Enruta el tráfico a través de uno de los balanceadores configurados"
},
"outboundForm": {
"tagDuplicate": "Etiqueta ya usada por otra salida",
"tagRequired": "La etiqueta es obligatoria",
"tagPlaceholder": "etiqueta-única",
"localIpPlaceholder": "IP local",
"addressRequired": "La dirección es obligatoria",
"portRequired": "El puerto es obligatorio",
"optional": "opcional",
"udpOverTcp": "UDP sobre TCP",
"uotVersion": "Versión UoT",
"inboundTag": "Etiqueta de entrada",
"inboundTagPlaceholder": "etiqueta de entrada usada en reglas de enrutamiento",
"responseType": "Tipo de respuesta",
"rewriteNetwork": "Reescribir red",
"unchanged": "(sin cambios)",
"unchangedAddress": "(sin cambios) p. ej. 1.1.1.1",
"rules": "Reglas",
"ruleN": "Regla {n}",
"action": "Acción",
"redirect": "Redirect",
"fragment": "Fragment",
"finalRules": "Reglas finales",
"overrideXrayPrivateIp": "Sobrescribir el bloqueo de IP privada por defecto de Xray",
"blockDelay": "Retraso de bloqueo (ms)",
"reverseSniffing": "Sniffing inverso",
"workers": "Workers",
"reserved": "Reservado",
"minUploadInterval": "Intervalo mín. de subida (ms)",
"maxUploadSizeBytes": "Tamaño máx. de subida (bytes)",
"uplinkChunkSize": "Tamaño de chunk Uplink",
"noGrpcHeader": "Sin cabecera gRPC",
"maxConcurrency": "Máx. concurrencia",
"maxConnections": "Máx. conexiones",
"maxReuseTimes": "Máx. reutilizaciones",
"maxRequestTimes": "Máx. peticiones",
"maxReusableSecs": "Máx. segundos reutilizables",
"keepAlivePeriod": "Periodo keep alive",
"authPassword": "Contraseña de auth",
"visionTestpre": "Vision testpre",
"serverNamePlaceholder": "nombre del servidor",
"verifyPeerName": "Verificar nombre del peer",
"pinnedSha256": "SHA256 pinned",
"shortId": "Short ID",
"sockopts": "Sockopts",
"keepAliveInterval": "Intervalo keep alive",
"markFwmark": "Mark (fwmark)",
"interface": "Interfaz",
"ipv6Only": "Solo IPv6",
"acceptProxyProtocol": "Aceptar proxy protocol",
"tcpUserTimeoutMs": "TCP user timeout (ms)",
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
},
"outbound": {
"addOutbound": "Agregar salida",
"addReverse": "Agregar reverso",
@@ -846,8 +1219,8 @@
"reverse": "Reverso",
"domain": "Dominio",
"type": "Tipo",
"bridge": "puente",
"portal": "portal",
"bridge": "Bridge",
"portal": "Portal",
"link": "Enlace",
"intercon": "Interconexión",
"settings": "Configuración",
@@ -860,6 +1233,8 @@
"testSuccess": "Prueba exitosa",
"testFailed": "Prueba fallida",
"testError": "Error al probar la salida",
"testModeTooltip": "TCP: sonda rápida solo de dial. HTTP: petición completa a través de xray.",
"testAll": "Probar todo",
"nordvpn": "NordVPN",
"accessToken": "Token de acceso",
"country": "País",
@@ -876,6 +1251,16 @@
"balancerSelectors": "Selectores",
"tag": "Etiqueta",
"tagDesc": "etiqueta única",
"tagDuplicate": "Etiqueta ya usada por otro balanceador",
"tagPlaceholder": "etiqueta única de balanceador",
"selector": "Selector",
"fallback": "Fallback",
"expected": "Esperado",
"expectedPlaceholder": "número óptimo de nodos",
"maxRtt": "Máx. RTT",
"tolerance": "Tolerancia",
"baselines": "Baselines",
"costs": "Costs",
"balancerDesc": "No es posible utilizar balancerTag y outboundTag al mismo tiempo. Si se utilizan al mismo tiempo, sólo funcionará outboundTag."
},
"wireguard": {
@@ -892,6 +1277,38 @@
"userLevel": "Nivel de Usuario",
"userLevelDesc": "Todas las conexiones realizadas a través de este entrada utilizarán este nivel de usuario. El valor predeterminado es 0"
},
"nord": {
"accessToken": "Access token",
"privateKey": "Clave privada",
"noServers": "No se encontraron servidores para el país seleccionado",
"noPublicKey": "El servidor seleccionado no anuncia una clave pública NordLynx.",
"outboundAdded": "Salida NordVPN añadida",
"outboundUpdated": "Salida NordVPN actualizada"
},
"warp": {
"licenseError": "No se pudo establecer la licencia WARP.",
"fetchFirst": "Obtén primero la configuración WARP.",
"createAccount": "Crear cuenta WARP",
"accessToken": "Access token",
"deviceId": "ID del dispositivo",
"licenseKey": "Clave de licencia",
"privateKey": "Clave privada",
"deleteAccount": "Eliminar cuenta",
"settings": "Ajustes",
"licenseKeyLabel": "Clave de licencia WARP / WARP+",
"key": "Clave",
"keyPlaceholder": "clave WARP+ de 26 caracteres",
"accountInfo": "Información de cuenta",
"deviceName": "Nombre del dispositivo",
"deviceModel": "Modelo del dispositivo",
"deviceEnabled": "Dispositivo habilitado",
"accountType": "Tipo de cuenta",
"role": "Rol",
"warpPlusData": "Datos WARP+",
"quota": "Cuota",
"usage": "Uso",
"addOutbound": "Añadir salida"
},
"dns": {
"enable": "Habilitar DNS",
"enableDesc": "Habilitar servidor DNS incorporado",
@@ -961,7 +1378,7 @@
"unknown": "Desconocido",
"inbounds": "Entradas",
"clients": "Clientes",
"offline": "🔴 Desconectado",
"offline": "🔴 Sin conexión",
"online": "🟢 En línea",
"commands": {
"unknown": "❗ Comando desconocido",
@@ -992,7 +1409,7 @@
"2faFailed": "Error de 2FA",
"report": "🕰 Informes programados: {{ .RunTime }}\r\n",
"datetime": "⏰ Fecha y Hora: {{ .DateTime }}\r\n",
"hostname": "💻 Nombre del Host: {{ .Hostname }}\r\n",
"hostname": "💻 Host: {{ .Hostname }}\r\n",
"version": "🚀 Versión de X-UI: {{ .Version }}\r\n",
"xrayVersion": "📡 Versión de Xray: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
@@ -1001,15 +1418,15 @@
"ips": "🔢 IPs:\r\n{{ .IPs }}\r\n",
"serverUpTime": "⏳ Tiempo de actividad del servidor: {{ .UpTime }} {{ .Unit }}\r\n",
"serverLoad": "📈 Carga del servidor: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n",
"serverMemory": "📋 Memoria del servidor: {{ .Current }}/{{ .Total }}\r\n",
"tcpCount": "🔹 Conteo de TCP: {{ .Count }}\r\n",
"udpCount": "🔸 Conteo de UDP: {{ .Count }}\r\n",
"serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n",
"tcpCount": "🔹 TCP: {{ .Count }}\r\n",
"udpCount": "🔸 UDP: {{ .Count }}\r\n",
"traffic": "🚦 Tráfico: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n",
"xrayStatus": "️ Estado de Xray: {{ .State }}\r\n",
"xrayStatus": "️ Estado: {{ .State }}\r\n",
"username": "👤 Nombre de usuario: {{ .Username }}\r\n",
"reason": "❗️ Motivo: {{ .Reason }}\r\n",
"time": "⏰ Hora: {{ .Time }}\r\n",
"inbound": "📍 Inbound: {{ .Remark }}\r\n",
"inbound": "📍 Entrada: {{ .Remark }}\r\n",
"port": "🔌 Puerto: {{ .Port }}\r\n",
"expire": "📅 Fecha de Vencimiento: {{ .Time }}\r\n",
"expireIn": "📅 Vence en: {{ .Time }}\r\n",
@@ -1019,7 +1436,7 @@
"lastOnline": "🔙 Última conexión: {{ .Time }}\r\n",
"email": "📧 Email: {{ .Email }}\r\n",
"upload": "🔼 Subida: ↑{{ .Upload }}\r\n",
"download": "🔽 Bajada: ↓{{ .Download }}\r\n",
"download": "🔽 Descarga: ↓{{ .Download }}\r\n",
"total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
"TGUser": "👤 Usuario de Telegram: {{ .TelegramID }}\r\n",
"exhaustedMsg": "🚨 Agotado {{ .Type }}:\r\n",
@@ -1077,7 +1494,7 @@
"ipLimit": "🔢 Límite de IP",
"setTGUser": "👤 Establecer Usuario de Telegram",
"toggle": "🔘 Habilitar / Deshabilitar",
"custom": "🔢 Costumbre",
"custom": "🔢 Personalizado",
"confirmNumber": "✅ Confirmar: {{ .Num }}",
"confirmNumberAdd": "✅ Confirmar agregando: {{ .Num }}",
"limitTraffic": "🚧 Límite de tráfico",
@@ -1089,9 +1506,9 @@
"use_default": "🏷️ Usar por defecto",
"change_id": "⚙️🔑 ID",
"change_password": "⚙️🔑 Contraseña",
"change_email": "⚙️📧 Correo electrónico",
"change_email": "⚙️📧 Email",
"change_comment": "⚙️💬 Comentario",
"change_flow": "⚙️🚦 Flujo",
"change_flow": "⚙️🚦 Flow",
"ResetAllTraffics": "Reiniciar todo el tráfico",
"SortedTrafficUsageReport": "Informe de uso de tráfico ordenado"
},
@@ -1119,4 +1536,4 @@
"chooseInbound": "Elige un Inbound"
}
}
}
}