diff --git a/README.md b/README.md
index c1414f20..1174977a 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
[](#)
[](https://www.gnu.org/licenses/gpl-3.0.en.html)
-3x-ui panel supporting multi-protocol, **Multi-lang (English,Farsi,Chinese,Russian,Vietnamese)**
+3x-ui panel supporting multi-protocol, **Multi-lang (English,Farsi,Chinese,Russian,Vietnamese,Spanish)**
**If you think this project is helpful to you, you may wish to give a** :star2:
**Buy Me a Coffee :**
diff --git a/web/assets/js/langs.js b/web/assets/js/langs.js
index 9038fc54..f590991e 100644
--- a/web/assets/js/langs.js
+++ b/web/assets/js/langs.js
@@ -24,6 +24,11 @@ const supportLangs = [
value: 'vi-VN',
icon: '🇻🇳',
},
+ {
+ name: 'española',
+ value: 'es-ES',
+ icon: '🇪🇸',
+ },
];
function getLang() {
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
new file mode 100644
index 00000000..b21ba5fa
--- /dev/null
+++ b/web/translation/translate.es_ES.toml
@@ -0,0 +1,495 @@
+"username" = "Nombre de Usuario"
+"password" = "Contraseña"
+"login" = "Acceso"
+"confirm" = "Confirmar"
+"cancel" = "Cancelar"
+"close" = "Cerrar"
+"copy" = "Copiar"
+"copied" = "Copiado"
+"download" = "Descargar"
+"remark" = "Nota"
+"enable" = "Habilitar"
+"protocol" = "Protocolo"
+"search" = "Buscar"
+"filter" = "Filtrar"
+"loading" = "Cargando"
+"second" = "Segundo"
+"minute" = "Minuto"
+"hour" = "Hora"
+"day" = "Día"
+"check" = "Verificar"
+"indefinite" = "Indefinido"
+"unlimited" = "Ilimitado"
+"none" = "Ninguno"
+"qrCode" = "Código QR"
+"info" = "Más Información"
+"edit" = "Editar"
+"delete" = "Eliminar"
+"reset" = "Restablecer"
+"copySuccess" = "Copiado exitosamente"
+"sure" = "Seguro"
+"encryption" = "Encriptación"
+"transmission" = "Transmisión"
+"host" = "Anfitrión"
+"path" = "Ruta"
+"camouflage" = "Camuflaje"
+"status" = "Estado"
+"enabled" = "Habilitado"
+"disabled" = "Deshabilitado"
+"depleted" = "Agotado"
+"depletingSoon" = "Agotándose pronto"
+"domainName" = "Nombre de dominio"
+"monitor" = "Listening IP"
+"certificate" = "Certificado"
+"fail" = "Falló"
+"success" = "Éxito"
+"getVersion" = "Obtener versión"
+"install" = "Instalar"
+"clients" = "Clientes"
+"usage" = "Uso"
+"secretToken" = "Token Secreto"
+"remained" = "Restante"
+
+[menu]
+"dashboard" = "Estado del Sistema"
+"inbounds" = "Entradas"
+"settings" = "Configuraciones del Panel"
+"logout" = "Cerrar Sesión"
+"link" = "Otro"
+
+[pages.login]
+"title" = "Iniciar Sesión"
+"loginAgain" = "El límite de tiempo de inicio de sesión ha expirado. Por favor, inicia sesión nuevamente."
+
+[pages.login.toasts]
+"invalidFormData" = "El formato de los datos de entrada es inválido."
+"emptyUsername" = "Por favor ingresa el nombre de usuario."
+"emptyPassword" = "Por favor ingresa la contraseña."
+"wrongUsernameOrPassword" = "Nombre de usuario o contraseña inválidos."
+"successLogin" = "Inicio de Sesión Exitoso"
+
+[pages.index]
+"title" = "Estado del Sistema"
+"memory" = "Memoria"
+"hard" = "Disco Duro"
+"xrayStatus" = "Estado de Xray"
+"stopXray" = "Detener Xray"
+"restartXray" = "Reiniciar"
+"xraySwitch" = "Cambiar Versión"
+"xraySwitchClick" = "Elige la versión a la que deseas cambiar."
+"xraySwitchClickDesk" = "Elige sabiamente, ya que las versiones anteriores pueden no ser compatibles con las configuraciones actuales."
+"operationHours" = "Tiempo de Funcionamiento"
+"systemLoad" = "Carga del Sistema"
+"systemLoadDesc" = "promedio de carga del sistema en los últimos 1, 5 y 15 minutos"
+"connectionTcpCountDesc" = "Conexiones TCP totales en todas las tarjetas de red."
+"connectionUdpCountDesc" = "Conexiones UDP totales en todas las tarjetas de red."
+"connectionCount" = "Número de Conexiones"
+"upSpeed" = "Velocidad de Subida Total para Todas las Tarjetas de Red."
+"downSpeed" = "Velocidad de Bajada Total para Todas las Tarjetas de Red."
+"totalSent" = "Tráfico Total de Subida de Todas las Tarjetas de Red desde el inicio del sistema."
+"totalReceive" = "Datos Descargados Totales en Todas las Tarjetas de Red desde el inicio del sistema."
+"xraySwitchVersionDialog" = "Cambiar Versión de Xray"
+"xraySwitchVersionDialogDesc" = "¿Estás seguro de que deseas cambiar la versión de Xray a"
+"dontRefresh" = "La instalación está en progreso, por favor no actualices esta página."
+"logs" = "Registros"
+"config" = "Configuración"
+"backup" = "Copia de Seguridad y Restauración"
+"backupTitle" = "Copia de Seguridad y Restauración de la Base de Datos"
+"backupDescription" = "Recuerda hacer una copia de seguridad antes de importar una nueva base de datos."
+"exportDatabase" = "Descargar Base de Datos"
+"importDatabase" = "Cargar Base de Datos"
+
+[pages.inbounds]
+"title" = "Entradas"
+"totalDownUp" = "Subidas/Descargas Totales"
+"totalUsage" = "Uso Total"
+"inboundCount" = "Número de Entradas"
+"operate" = "Menú"
+"enable" = "Habilitar"
+"remark" = "Notas"
+"protocol" = "Protocolo"
+"port" = "Puerto"
+"traffic" = "Tráfico"
+"details" = "Detalles"
+"transportConfig" = "Transporte"
+"expireDate" = "Fecha de Expiración"
+"resetTraffic" = "Restablecer Tráfico"
+"addInbound" = "Agregar Entrada"
+"generalActions" = "Acciones Generales"
+"create" = "Crear"
+"update" = "Actualizar"
+"modifyInbound" = "Modificar Entrada"
+"deleteInbound" = "Eliminar Entrada"
+"deleteInboundContent" = "¿Confirmar eliminación de entrada?"
+"resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?"
+"copyLink" = "Copiar Enlace"
+"address" = "Dirección"
+"network" = "Red"
+"destinationPort" = "Puerto de Destino"
+"targetAddress" = "Dirección de Destino"
+"monitorDesc" = "Dejar en blanco por defecto"
+"meansNoLimit" = "Significa Sin Límite"
+"totalFlow" = "Flujo Total"
+"leaveBlankToNeverExpire" = "Dejar en Blanco para Nunca Expirar"
+"noRecommendKeepDefault" = "No hay requisitos especiales para mantener la configuración predeterminada"
+"certificatePath" = "Ruta del Archivo de Certificado"
+"certificateContent" = "Contenido del Archivo de Certificado"
+"publicKeyPath" = "Ruta de la Clave Pública"
+"publicKeyContent" = "Contenido de la Clave Pública"
+"keyPath" = "Ruta de la Clave Privada"
+"keyContent" = "Contenido de la Clave Privada"
+"clickOnQRcode" = "Haz clic en el Código QR para Copiar"
+"client" = "Client"
+"export" = "Exportar Enlaces"
+"clone" = "Clonar"
+"cloneInbound" = "Clonar Entradas"
+"cloneInboundContent" = "Se aplicarán todas las configuraciones de esta entrada, excepto el Puerto, la IP de Escucha y los Clientes, al clon."
+"cloneInboundOk" = "Clonar"
+"resetAllTraffic" = "Restablecer Tráfico de Todas las Entradas"
+"resetAllTrafficTitle" = "Restablecer tráfico de todas las entradas"
+"resetAllTrafficContent" = "¿Estás seguro de que deseas restablecer el tráfico de todas las entradas?"
+"resetInboundClientTraffics" = "Restablecer Tráfico de Clientes"
+"resetInboundClientTrafficTitle" = "Restablecer todo el tráfico de clientes"
+"resetInboundClientTrafficContent" = "¿Estás seguro de que deseas restablecer todo el tráfico para los clientes de esta entrada?"
+"resetAllClientTraffics" = "Restablecer Tráfico de Todos los Clientes"
+"resetAllClientTrafficTitle" = "Restablecer todo el tráfico de clientes"
+"resetAllClientTrafficContent" = "¿Estás seguro de que deseas restablecer todo el tráfico para todos los clientes?"
+"delDepletedClients" = "Eliminar Clientes Agotados"
+"delDepletedClientsTitle" = "Eliminar clientes agotados"
+"delDepletedClientsContent" = "¿Estás seguro de que deseas eliminar todos los clientes agotados?"
+"email" = "Email"
+"emailDesc" = "Por favor proporciona una dirección de correo electrónico única."
+"IPLimit" = "Límite de IP"
+"IPLimitDesc" = "Desactiva la entrada si la cantidad supera el valor ingresado (ingresa 0 para desactivar el límite de IP)."
+"IPLimitlog" = "Registro de IP"
+"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"
+"xtlsDesc" = "La versión del núcleo de Xray debe ser 1.7.5"
+"realityDesc" = "La versión del núcleo de Xray debe ser 1.8.0 o superior."
+"telegramDesc" = "Utiliza el ID de Telegram sin @ o los IDs de chat (puedes obtenerlo aquí @userinfobot o usando el comando '/id' en el bot)."
+"subscriptionDesc" = "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones."
+
+[pages.client]
+"add" = "Agregar Cliente"
+"edit" = "Editar Cliente"
+"submitAdd" = "Agregar Cliente"
+"submitEdit" = "Guardar Cambios"
+"clientCount" = "Número de Clientes"
+"bulk" = "Agregar en Lote"
+"method" = "Método"
+"first" = "Primero"
+"last" = "Último"
+"prefix" = "Prefijo"
+"postfix" = "Sufijo"
+"delayedStart" = "Iniciar después del primer uso"
+"expireDays" = "Días de Expiración"
+"days" = "día(s)"
+
+[pages.inbounds.toasts]
+"obtain" = "Recibir"
+
+[pages.inbounds.stream.general]
+"requestHeader" = "Encabezado de la Petición"
+"name" = "Nombre"
+"value" = "Valor"
+
+[pages.inbounds.stream.tcp]
+"requestVersion" = "Versión de la Petición"
+"requestMethod" = "Método de la Petición"
+"requestPath" = "Ruta de la Petición"
+"responseVersion" = "Versión de la Respuesta"
+"responseStatus" = "Estado de la Respuesta"
+"responseStatusDescription" = "Descripción del Estado de la Respuesta"
+"responseHeader" = "Encabezado de la Respuesta"
+
+[pages.inbounds.stream.quic]
+"encryption" = "Cifrado"
+
+[pages.settings]
+"title" = "Configuraciones"
+"save" = "Guardar"
+"infoDesc" = "Cada cambio realizado aquí debe ser guardado. Por favor, reinicie el panel para aplicar los cambios."
+"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."
+"actions" = "Acciones"
+"resetDefaultConfig" = "Restablecer a Configuración Predeterminada"
+"panelSettings" = "Configuraciones del Panel"
+"securitySettings" = "Configuraciones de Seguridad"
+"xrayConfiguration" = "Configuración de Xray"
+"TGBotSettings" = "Configuraciones de 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"
+"panelListeningDomainDesc" = "Dejar en blanco por defecto para monitorear todos los dominios e IPs."
+"panelPort" = "Puerto del Panel"
+"panelPortDesc" = "El puerto utilizado para mostrar este panel."
+"publicKeyPath" = "Ruta del Archivo de Clave Pública del Certificado del Panel"
+"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"
+"panelUrlPathDesc" = "Debe empezar con '/' y terminar con."
+"oldUsername" = "Nombre de Usuario Actual"
+"currentPassword" = "Contraseña Actual"
+"newUsername" = "Nuevo Nombre de Usuario"
+"newPassword" = "Nueva Contraseña"
+"telegramBotEnable" = "Habilitar bot de Telegram"
+"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."
+"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."
+"telegramNotifyTime" = "Hora de Notificación del Bot de Telegram"
+"telegramNotifyTimeDesc" = "Usar el formato de tiempo de Crontab."
+"tgNotifyBackup" = "Respaldo de Base de Datos"
+"tgNotifyBackupDesc" = "Incluir archivo de respaldo de base de datos con notificación de informe."
+"tgNotifyLogin" = "Notificación de Inicio de Sesión"
+"tgNotifyLoginDesc" = "Muestra el nombre de usuario, dirección IP y hora cuando alguien intenta iniciar sesión en su panel."
+"sessionMaxAge" = "Edad Máxima de Sesión"
+"sessionMaxAgeDesc" = "La duración de una sesión de inicio de sesión (unidad: minutos)."
+"expireTimeDiff" = "Umbral de Expiración para Notificación"
+"expireTimeDiffDesc" = "Reciba notificaciones sobre la expiración de la cuenta antes del umbral (unidad: días)."
+"trafficDiff" = "Umbral de Tráfico para Notificación"
+"trafficDiffDesc" = "Reciba notificaciones sobre el agotamiento del tráfico antes de alcanzar el umbral (unidad: GB)."
+"tgNotifyCpu" = "Umbral de Alerta de Porcentaje de CPU"
+"tgNotifyCpuDesc" = "Reciba notificaciones si el uso de la CPU supera este umbral (unidad: %)."
+"timeZone" = "Zona Horaria"
+"timeZoneDesc" = "Las tareas programadas se ejecutan de acuerdo con la hora en esta zona horaria."
+"subSettings" = "Suscripción"
+"subEnable" = "Habilitar Servicio"
+"subEnableDesc" = "Función de suscripción con configuración separada."
+"subListen" = "Listening IP"
+"subListenDesc" = "Dejar en blanco por defecto para monitorear todas las IPs."
+"subPort" = "Puerto de Suscripción"
+"subPortDesc" = "El número de puerto para el servicio de suscripción debe estar sin usar en el servidor."
+"subCertPath" = "Ruta del Archivo de Clave Pública del Certificado de Suscripción"
+"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"
+"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"
+"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."
+
+[pages.settings.templates]
+"title" = "Plantillas"
+"basicTemplate" = "Plantilla Básica"
+"advancedTemplate" = "Plantilla Avanzada"
+"completeTemplate" = "Plantilla Completa"
+"generalConfigs" = "Configuraciones Generales"
+"generalConfigsDesc" = "Estas opciones proporcionarán ajustes generales."
+"blockConfigs" = "Configuraciones de Bloqueo"
+"blockConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos."
+"blockCountryConfigs" = "Configuraciones de Bloqueo por País"
+"blockCountryConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a dominios de países específicos."
+"directCountryConfigs" = "Configuraciones de Conexión Directa por País"
+"directCountryConfigsDesc" = "Estas opciones conectarán a los usuarios directamente a dominios de países específicos."
+"ipv4Configs" = "Configuraciones IPv4"
+"ipv4ConfigsDesc" = "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4."
+"warpConfigs" = "Configuraciones de WARP"
+"warpConfigsDesc" = "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare."
+"xrayConfigTemplate" = "Plantilla de Configuración de Xray"
+"xrayConfigTemplateDesc" = "Genera el archivo de configuración final de Xray basado en esta plantilla."
+"xrayConfigFreedomStrategy" = "Configurar Estrategia para el Protocolo Freedom"
+"xrayConfigFreedomStrategyDesc" = "Establece la estrategia de salida de la red en el Protocolo Freedom."
+"xrayConfigRoutingStrategy" = "Configurar Estrategia de Enrutamiento de Dominios"
+"xrayConfigRoutingStrategyDesc" = "Establece la estrategia general de enrutamiento para la resolución de DNS."
+"xrayConfigTorrent" = "Prohibir Uso de BitTorrent"
+"xrayConfigTorrentDesc" = "Cambia la plantilla de configuración para evitar el uso de BitTorrent por parte de los usuarios."
+"xrayConfigPrivateIp" = "Prohibir Conexiones a Rangos de IP Privadas"
+"xrayConfigPrivateIpDesc" = "Cambia la plantilla de configuración para evitar la conexión a rangos de IP privadas."
+"xrayConfigAds" = "Bloquear Anuncios"
+"xrayConfigAdsDesc" = "Cambia la plantilla de configuración para bloquear anuncios."
+"xrayConfigFamily" = "Bloquear Malware y Contenido para Adultos"
+"xrayConfigFamilyDesc" = "Resolvedores de DNS para bloquear malware y contenido para adultos para protección familiar."
+"xrayConfigSpeedtest" = "Bloquear Sitios Web de Pruebas de Velocidad"
+"xrayConfigSpeedtestDesc" = "Cambia la plantilla de configuración para evitar la conexión a sitios web de pruebas de velocidad."
+"xrayConfigIRIp" = "Desactivar Conexión a Rangos de IP de Irán"
+"xrayConfigIRIpDesc" = "Cambia la plantilla de configuración para evitar la conexión a rangos de IP de Irán."
+"xrayConfigIRDomain" = "Desactivar Conexión a Dominios de Irán"
+"xrayConfigIRDomainDesc" = "Cambia la plantilla de configuración para evitar la conexión a dominios de Irán."
+"xrayConfigChinaIp" = "Desactivar Conexión a Rangos de IP de China"
+"xrayConfigChinaIpDesc" = "Cambia la plantilla de configuración para evitar la conexión a rangos de IP de China."
+"xrayConfigChinaDomain" = "Desactivar Conexión a Dominios de China"
+"xrayConfigChinaDomainDesc" = "Cambia la plantilla de configuración para evitar la conexión a dominios de China."
+"xrayConfigRussiaIp" = "Desactivar Conexión a Rangos de IP de Rusia"
+"xrayConfigRussiaIpDesc" = "Cambia la plantilla de configuración para evitar la conexión a rangos de IP de Rusia."
+"xrayConfigRussiaDomain" = "Desactivar Conexión a Dominios de Rusia"
+"xrayConfigRussiaDomainDesc" = "Cambia la plantilla de configuración para evitar la conexión a dominios de Rusia."
+"xrayConfigDirectIRIp" = "Conexión Directa a Rangos de IP de Irán"
+"xrayConfigDirectIRIpDesc" = "Cambia la plantilla de configuración para conectarse directamente a rangos de IP de Irán."
+"xrayConfigDirectIRDomain" = "Conexión Directa a Dominios de Irán"
+"xrayConfigDirectIRDomainDesc" = "Cambia la plantilla de configuración para conectarse directamente a dominios de Irán."
+"xrayConfigDirectChinaIp" = "Conexión Directa a Rangos de IP de China"
+"xrayConfigDirectChinaIpDesc" = "Cambia la plantilla de configuración para conectarse directamente a rangos de IP de China."
+"xrayConfigDirectChinaDomain" = "Conexión Directa a Dominios de China"
+"xrayConfigDirectChinaDomainDesc" = "Cambia la plantilla de configuración para conectarse directamente a dominios de China."
+"xrayConfigDirectRussiaIp" = "Conexión Directa a Rangos de IP de Rusia"
+"xrayConfigDirectRussiaIpDesc" = "Cambia la plantilla de configuración para conectarse directamente a rangos de IP de Rusia."
+"xrayConfigDirectRussiaDomain" = "Conexión Directa a Dominios de Rusia"
+"xrayConfigDirectRussiaDomainDesc" = "Cambia la plantilla de configuración para conectarse directamente a dominios de Rusia."
+"xrayConfigGoogleIPv4" = "Usar IPv4 para Google"
+"xrayConfigGoogleIPv4Desc" = "Agregar enrutamiento para que Google se conecte con IPv4."
+"xrayConfigNetflixIPv4" = "Usar IPv4 para Netflix"
+"xrayConfigNetflixIPv4Desc" = "Agregar enrutamiento para que Netflix se conecte con IPv4."
+"xrayConfigGoogleWARP" = "Rutear Google a través de WARP."
+"xrayConfigGoogleWARPDesc" = "Agregar enrutamiento para Google a través de WARP."
+"xrayConfigOpenAIWARP" = "Rutear OpenAI (ChatGPT) a través de WARP."
+"xrayConfigOpenAIWARPDesc" = "Agregar enrutamiento para OpenAI (ChatGPT) a través de WARP."
+"xrayConfigNetflixWARP" = "Rutear Netflix a través de WARP."
+"xrayConfigNetflixWARPDesc" = "Agregar enrutamiento para Netflix a través de WARP."
+"xrayConfigSpotifyWARP" = "Rutear Spotify a través de WARP."
+"xrayConfigSpotifyWARPDesc" = "Agregar enrutamiento para Spotify a través de WARP."
+"xrayConfigIRWARP" = "Rutear dominios de Irán a través de WARP."
+"xrayConfigIRWARPDesc" = "Agregar enrutamiento para dominios de Irán a través de WARP."
+"xrayConfigInbounds" = "Configuración de Entradas"
+"xrayConfigInboundsDesc" = "Cambia la plantilla de configuración para aceptar clientes específicos."
+"xrayConfigOutbounds" = "Configuración de Salidas"
+"xrayConfigOutboundsDesc" = "Cambia la plantilla de configuración para definir formas de salida para este servidor."
+"xrayConfigRoutings" = "Configuración de Reglas de Enrutamiento"
+"xrayConfigRoutingsDesc" = "Cambia la plantilla de configuración para definir reglas de enrutamiento para este servidor."
+"manualLists" = "Listas Manuales"
+"manualListsDesc" = "Por favor, utilice el formato de matriz JSON."
+"manualBlockedIPs" = "Lista de IPs Bloqueadas"
+"manualBlockedDomains" = "Lista de Dominios Bloqueados"
+"manualDirectIPs" = "Lista de IPs Directas"
+"manualDirectDomains" = "Lista de Dominios Directos"
+"manualIPv4Domains" = "Lista de Dominios IPv4"
+"manualWARPDomains" = "Lista de Dominios de WARP"
+
+[pages.settings.security]
+"admin" = "Administrador"
+"secret" = "Token Secreto"
+"loginSecurity" = "Seguridad de Inicio de Sesión"
+"loginSecurityDesc" = "Habilitar un paso adicional de seguridad para el inicio de sesión de usuarios."
+"secretToken" = "Token Secreto"
+"secretTokenDesc" = "Por favor, copia y guarda este token de forma segura en un lugar seguro. Este token es necesario para iniciar sesión y no se puede recuperar con la herramienta de comando x-ui."
+
+[pages.settings.toasts]
+"modifySettings" = "Modificar Configuraciones "
+"getSettings" = "Obtener Configuraciones "
+"modifyUser" = "Modificar Usuario "
+"originalUserPassIncorrect" = "Nombre de usuario o contraseña original incorrectos"
+"userPassMustBeNotEmpty" = "El nuevo nombre de usuario y la nueva contraseña no pueden estar vacíos"
+
+[tgbot]
+"keyboardClosed" = "❌ ¡Teclado personalizado cerrado!"
+"noResult" = "❗ ¡Sin resultados!"
+"noQuery" = "❌ ¡Consulta no encontrada! ¡Por favor utiliza el comando nuevamente!"
+"wentWrong" = "❌ ¡Algo salió mal!"
+"noIpRecord" = "❗ ¡Sin Registro de IP!"
+"noInbounds" = "❗ ¡No se encontraron entradas!"
+"unlimited" = "♾ Ilimitado"
+"month" = "Mes"
+"months" = "Meses"
+"day" = "Día"
+"days" = "Días"
+"hours" = "Horas"
+"unknown" = "Desconocido"
+"inbounds" = "Entradas"
+"clients" = "Clients"
+
+[tgbot.commands]
+"unknown" = "❗ Comando desconocido"
+"pleaseChoose" = "👇 Por favor elige:\r\n"
+"help" = "🤖 ¡Bienvenido a este bot! Está diseñado para ofrecerte datos específicos del servidor y te permite hacer modificaciones según sea necesario.\r\n\r\n"
+"start" = "👋 Hola {{ .Firstname }}.\r\n"
+"welcome" = "🤖 Bienvenido al bot de gestión de {{ .Hostname }}.\r\n"
+"status" = "✅ ¡El bot está bien!"
+"usage" = "❗ ¡Por favor proporciona un texto para buscar!"
+"getID" = "🆔 Tu ID: {{ .ID }}
"
+"helpAdminCommands" = "Buscar un correo electrónico de cliente:\r\n/usage [Email]
\r\n \r\nBuscar entradas (con estadísticas de cliente):\r\n/inbound [Nota]
"
+"helpClientCommands" = "Para buscar estadísticas, simplemente usa el siguiente comando:\r\n \r\n/usage [UUID|Contraseña]
\r\n \r\nUsa UUID para vmess/vless y Contraseña para Trojan."
+
+[tgbot.messages]
+"cpuThreshold" = "🔴 El uso de CPU {{ .Percent }}% es mayor que el umbral {{ .Threshold }}%"
+"selectUserFailed" = "❌ ¡Error al seleccionar usuario!"
+"userSaved" = "✅ Usuario de Telegram guardado."
+"loginSuccess" = "✅ Has iniciado sesión en el panel con éxito.\r\n"
+"loginFailed" = "❗️ Falló el inicio de sesión en el panel.\r\n"
+"report" = "🕰 Informes programados: {{ .RunTime }}\r\n"
+"datetime" = "⏰ Fecha y Hora: {{ .DateTime }}\r\n"
+"hostname" = "💻 Nombre del Host: {{ .Hostname }}\r\n"
+"version" = "🚀 Versión de X-UI: {{ .Version }}\r\n"
+"ipv6" = "🌐 IPv6: {{ .IPv6 }}\r\n"
+"ipv4" = "🌐 IPv4: {{ .IPv4 }}\r\n"
+"ip" = "🌐 IP: {{ .IP }}\r\n"
+"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"
+"traffic" = "🚦 Tráfico: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n"
+"xrayStatus" = "ℹ️ Estado de Xray: {{ .State }}\r\n"
+"username" = "👤 Nombre de usuario: {{ .Username }}\r\n"
+"time" = "⏰ Hora: {{ .Time }}\r\n"
+"inbound" = "📍 Inbound: {{ .Remark }}\r\n"
+"port" = "🔌 Puerto: {{ .Port }}\r\n"
+"expire" = "📅 Fecha de Vencimiento: {{ .Time }}\r\n"
+"expireIn" = "📅 Vence en: {{ .Time }}\r\n"
+"active" = "💡 Activo: ✅ Sí\r\n"
+"inactive" = "💡 Activo: ❌ No\r\n"
+"email" = "📧 Email: {{ .Email }}\r\n"
+"upload" = "🔼 Subida: ↑{{ .Upload }}\r\n"
+"download" = "🔽 Bajada: ↓{{ .Download }}\r\n"
+"total" = "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n"
+"TGUser" = "👤 Usuario de Telegram: {{ .TelegramID }}\r\n"
+"exhaustedMsg" = "🚨 Agotado {{ .Type }}: \r\n"
+"exhaustedCount" = "🚨 Cantidad de Agotados {{ .Type }}: \r\n"
+"disabled" = "🛑 Desactivado: {{ .Disabled }}\r\n"
+"depleteSoon" = "🔜 Se agotará pronto: {{ .Deplete }}\r\n \r\n"
+"backupTime" = "🗄 Hora de la Copia de Seguridad: {{ .Time }}\r\n"
+"refreshedOn" = "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n \r\n"
+
+[tgbot.buttons]
+"closeKeyboard" = "❌ Cerrar Teclado"
+"cancel" = "❌ Cancelar"
+"cancelReset" = "❌ Cancelar Reinicio"
+"cancelIpLimit" = "❌ Cancelar Límite de IP"
+"confirmResetTraffic" = "✅ ¿Confirmar Reinicio de Tráfico?"
+"confirmClearIps" = "✅ ¿Confirmar Limpiar IPs?"
+"confirmRemoveTGUser" = "✅ ¿Confirmar Eliminar Usuario de Telegram?"
+"dbBackup" = "Obtener Copia de Seguridad de BD"
+"serverUsage" = "Uso del Servidor"
+"getInbounds" = "Obtener Entradas"
+"depleteSoon" = "Pronto se Agotará"
+"clientUsage" = "Obtener Uso"
+"commands" = "Comandos"
+"refresh" = "🔄 Actualizar"
+"clearIPs" = "❌ Limpiar IPs"
+"removeTGUser" = "❌ Eliminar Usuario de Telegram"
+"selectTGUser" = "👤 Seleccionar Usuario de Telegram"
+"selectOneTGUser" = "👤 Selecciona un usuario de telegram:"
+"resetTraffic" = "📈 Reiniciar Tráfico"
+"resetExpire" = "📅 Reiniciar Días de Vencimiento"
+"ipLog" = "🔢 Registro de IP"
+"ipLimit" = "🔢 Límite de IP"
+"setTGUser" = "👤 Establecer Usuario de Telegram"
+"toggle" = "🔘 Habilitar / Deshabilitar"
+
+[tgbot.answers]
+"errorOperation" = "❗ Error en la Operación."
+"getInboundsFailed" = "❌ Error al obtener las entradas"
+"canceled" = "❌ {{ .Email }} : Operación cancelada."
+"clientRefreshSuccess" = "✅ {{ .Email }} : Cliente actualizado exitosamente."
+"IpRefreshSuccess" = "✅ {{ .Email }} : IPs actualizadas exitosamente."
+"TGIdRefreshSuccess" = "✅ {{ .Email }} : Usuario de Telegram del cliente actualizado exitosamente."
+"resetTrafficSuccess" = "✅ {{ .Email }} : Tráfico reiniciado exitosamente."
+"expireResetSuccess" = "✅ {{ .Email }} : Días de vencimiento reiniciados exitosamente."
+"resetIpSuccess" = "✅ {{ .Email }} : Límite de IP {{ .Count }} guardado exitosamente."
+"clearIpSuccess" = "✅ {{ .Email }} : IPs limpiadas exitosamente."
+"getIpLog" = "✅ {{ .Email }} : Obtener Registro de IP."
+"getUserInfo" = "✅ {{ .Email }} : Obtener Información de Usuario de Telegram."
+"removedTGUserSuccess" = "✅ {{ .Email }} : Usuario de Telegram eliminado exitosamente."
+"enableSuccess" = "✅ {{ .Email }} : Habilitado exitosamente."
+"disableSuccess" = "✅ {{ .Email }} : Deshabilitado exitosamente."
+"askToAddUserId" = "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ID de usuario: {{ .TgUserID }}"
+"askToAddUserName" = "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su nombre de usuario o ID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu nombre de usuario: @{{ .TgUserName }}\r\n\r\nSu ID de usuario: {{ .TgUserID }}"