diff --git a/lang/es/activity.php b/lang/es/activity.php
new file mode 100644
index 000000000..68f9fa468
--- /dev/null
+++ b/lang/es/activity.php
@@ -0,0 +1,130 @@
+ [
+ 'fail' => 'Inicio de sesión fallido',
+ 'success' => 'Sesión iniciada',
+ 'password-reset' => 'Restablecimiento de contraseña',
+ 'reset-password' => 'Solicitud de restablecimiento de contraseña',
+ 'checkpoint' => 'Solicitud de autenticación de dos factores',
+ 'recovery-token' => 'Token de recuperación de dos factores utilizado',
+ 'token' => 'Resuelto desafío de dos factores',
+ 'ip-blocked' => 'Solicitud bloqueada desde la dirección IP no listada para :identifier',
+ 'sftp' => [
+ 'fail' => 'Inicio de sesión SFTP fallido',
+ ],
+ ],
+ 'user' => [
+ 'account' => [
+ 'email-changed' => 'Cambio de correo electrónico de :old a :new',
+ 'password-changed' => 'Contraseña cambiada',
+ ],
+ 'api-key' => [
+ 'create' => 'Se creó una nueva clave API :identifier',
+ 'delete' => 'Se eliminó la clave API :identifier',
+ ],
+ 'ssh-key' => [
+ 'create' => 'Se agregó la clave SSH :fingerprint a la cuenta',
+ 'delete' => 'Se eliminó la clave SSH :fingerprint de la cuenta',
+ ],
+ 'two-factor' => [
+ 'create' => 'Se habilitó la autenticación de dos factores',
+ 'delete' => 'Se deshabilitó la autenticación de dos factores',
+ ],
+ ],
+ 'server' => [
+ 'reinstall' => 'Servidor reinstalado',
+ 'console' => [
+ 'command' => 'Ejecutado ":command" en el servidor',
+ ],
+ 'power' => [
+ 'start' => 'Iniciado el servidor',
+ 'stop' => 'Detenido el servidor',
+ 'restart' => 'Reiniciado el servidor',
+ 'kill' => 'Finalizado el proceso del servidor',
+ ],
+ 'backup' => [
+ 'download' => 'Descargada la copia de seguridad :name',
+ 'delete' => 'Eliminada la copia de seguridad :name',
+ 'restore' => 'Restaurada la copia de seguridad :name (archivos eliminados: :truncate)',
+ 'restore-complete' => 'Restauración completa de la copia de seguridad :name',
+ 'restore-failed' => 'Falló la restauración de la copia de seguridad :name',
+ 'start' => 'Iniciada una nueva copia de seguridad :name',
+ 'complete' => 'Marcada la copia de seguridad :name como completada',
+ 'fail' => 'Marcada la copia de seguridad :name como fallida',
+ 'lock' => 'Bloqueada la copia de seguridad :name',
+ 'unlock' => 'Desbloqueada la copia de seguridad :name',
+ ],
+ 'database' => [
+ 'create' => 'Creada nueva base de datos :name',
+ 'rotate-password' => 'Contraseña rotada para la base de datos :name',
+ 'delete' => 'Eliminada la base de datos :name',
+ ],
+ 'file' => [
+ 'compress_one' => 'Comprimido :directory:file',
+ 'compress_other' => 'Comprimidos :count archivos en :directory',
+ 'read' => 'Visto el contenido de :file',
+ 'copy' => 'Creada una copia de :file',
+ 'create-directory' => 'Creado directorio :directory:name',
+ 'decompress' => 'Descomprimidos :files en :directory',
+ 'delete_one' => 'Eliminado :directory:files.0',
+ 'delete_other' => 'Eliminados :count archivos en :directory',
+ 'download' => 'Descargado :file',
+ 'pull' => 'Descargado un archivo remoto desde :url a :directory',
+ 'rename_one' => 'Renombrado :directory:files.0.from a :directory:files.0.to',
+ 'rename_other' => 'Renombrados :count archivos en :directory',
+ 'write' => 'Escrito nuevo contenido en :file',
+ 'upload' => 'Iniciada una carga de archivo',
+ 'uploaded' => 'Cargado :directory:file',
+ ],
+ 'sftp' => [
+ 'denied' => 'Acceso SFTP bloqueado debido a permisos',
+ 'create_one' => 'Creado :files.0',
+ 'create_other' => 'Creados :count nuevos archivos',
+ 'write_one' => 'Modificado el contenido de :files.0',
+ 'write_other' => 'Modificado el contenido de :count archivos',
+ 'delete_one' => 'Eliminado :files.0',
+ 'delete_other' => 'Eliminados :count archivos',
+ 'create-directory_one' => 'Creado el directorio :files.0',
+ 'create-directory_other' => 'Creados :count directorios',
+ 'rename_one' => 'Renombrado :files.0.from a :files.0.to',
+ 'rename_other' => 'Renombrados o movidos :count archivos',
+ ],
+ 'allocation' => [
+ 'create' => 'Añadida :allocation al servidor',
+ 'notes' => 'Actualizadas las notas para :allocation de ":old" a ":new"',
+ 'primary' => 'Establecida :allocation como la asignación primaria del servidor',
+ 'delete' => 'Eliminada la asignación :allocation',
+ ],
+ 'schedule' => [
+ 'create' => 'Creado el horario :name',
+ 'update' => 'Actualizado el horario :name',
+ 'execute' => 'Ejecutado manualmente el horario :name',
+ 'delete' => 'Eliminado el horario :name',
+ ],
+ 'task' => [
+ 'create' => 'Creada una nueva tarea ":action" para el horario :name',
+ 'update' => 'Actualizada la tarea ":action" para el horario :name',
+ 'delete' => 'Eliminada una tarea para el horario :name',
+ ],
+ 'settings' => [
+ 'rename' => 'Renombrado el servidor de :old a :new',
+ 'description' => 'Cambiada la descripción del servidor de :old a :new',
+ ],
+ 'startup' => [
+ 'edit' => 'Cambiada la variable :variable de ":old" a ":new"',
+ 'image' => 'Actualizada la imagen de Docker del servidor de :old a :new',
+ ],
+ 'subuser' => [
+ 'create' => 'Añadido :email como subusuario',
+ 'update' => 'Actualizados los permisos del subusuario :email',
+ 'delete' => 'Eliminado :email como subusuario',
+ ],
+ ],
+];
diff --git a/lang/es/admin/eggs.php b/lang/es/admin/eggs.php
new file mode 100644
index 000000000..ebb5c948c
--- /dev/null
+++ b/lang/es/admin/eggs.php
@@ -0,0 +1,19 @@
+ [
+ 'imported' => 'El Egg y sus variables asociadas se importaron correctamente.',
+ 'updated_via_import' => 'Este Egg se ha actualizado utilizando el archivo proporcionado.',
+ 'deleted' => 'Se eliminó correctamente el Egg solicitado del Panel.',
+ 'updated' => 'La configuración del Egg se ha actualizado correctamente.',
+ 'script_updated' => 'El script de instalación del Egg se ha actualizado y se ejecutará cada vez que se instalen servidores.',
+ 'egg_created' => 'Se ha creado un nuevo Egg correctamente. Deberás reiniciar cualquier daemon en ejecución para aplicar este nuevo Egg.',
+ ],
+ 'variables' => [
+ 'notices' => [
+ 'variable_deleted' => 'La variable ":variable" se ha eliminado y ya no estará disponible para los servidores una vez reconstruidos.',
+ 'variable_updated' => 'La variable ":variable" se ha actualizado. Deberás reconstruir cualquier servidor que utilice esta variable para aplicar los cambios.',
+ 'variable_created' => 'Se ha creado correctamente una nueva variable y se ha asignado a este Egg.',
+ ],
+ ],
+];
diff --git a/lang/es/admin/node.php b/lang/es/admin/node.php
new file mode 100644
index 000000000..95556057b
--- /dev/null
+++ b/lang/es/admin/node.php
@@ -0,0 +1,15 @@
+ [
+ 'fqdn_not_resolvable' => 'El FQDN o la dirección IP proporcionada no se resuelve a una dirección IP válida.',
+ 'fqdn_required_for_ssl' => 'Se requiere un nombre de dominio completo que se resuelva a una dirección IP pública para poder utilizar SSL en este nodo.',
+ ],
+ 'notices' => [
+ 'allocations_added' => 'Se han añadido correctamente las asignaciones a este nodo.',
+ 'node_deleted' => 'El nodo se ha eliminado correctamente del panel.',
+ 'node_created' => 'Se ha creado correctamente un nuevo nodo. Puedes configurar automáticamente el daemon en esta máquina visitando la pestaña \'Configuración\'. Antes de poder añadir cualquier servidor, primero debes asignar al menos una dirección IP y puerto.',
+ 'node_updated' => 'Se ha actualizado la información del nodo. Si se cambiaron ajustes del daemon, necesitarás reiniciarlo para que los cambios surtan efecto.',
+ 'unallocated_deleted' => 'Se han eliminado todos los puertos no asignados para :ip
.',
+ ],
+];
diff --git a/lang/es/admin/server.php b/lang/es/admin/server.php
new file mode 100644
index 000000000..38af8b29c
--- /dev/null
+++ b/lang/es/admin/server.php
@@ -0,0 +1,27 @@
+ [
+ 'no_new_default_allocation' => 'Estás intentando eliminar la asignación predeterminada para este servidor pero no hay una asignación de respaldo para usar.',
+ 'marked_as_failed' => 'Este servidor fue marcado como que ha fallado en una instalación anterior. El estado actual no se puede cambiar en este estado.',
+ 'bad_variable' => 'Hubo un error de validación con la variable :name.',
+ 'daemon_exception' => 'Hubo una excepción al intentar comunicarse con el daemon que resultó en un código de respuesta HTTP/:code. Esta excepción ha sido registrada. (ID de solicitud: :request_id)',
+ 'default_allocation_not_found' => 'La asignación predeterminada solicitada no se encontró en las asignaciones de este servidor.',
+ ],
+ 'alerts' => [
+ 'startup_changed' => 'La configuración de inicio de este servidor se ha actualizado. Si se cambió el huevo de este servidor, se iniciará una reinstalación ahora.',
+ 'server_deleted' => 'El servidor se ha eliminado correctamente del sistema.',
+ 'server_created' => 'El servidor se ha creado correctamente en el panel. Por favor, permite al daemon unos minutos para instalar completamente este servidor.',
+ 'build_updated' => 'Los detalles de construcción para este servidor se han actualizado. Algunos cambios pueden requerir un reinicio para surtir efecto.',
+ 'suspension_toggled' => 'El estado de suspensión del servidor se ha cambiado a :status.',
+ 'rebuild_on_boot' => 'Este servidor se ha marcado como que requiere una reconstrucción del contenedor Docker. Esto ocurrirá la próxima vez que se inicie el servidor.',
+ 'install_toggled' => 'El estado de instalación para este servidor se ha cambiado.',
+ 'server_reinstalled' => 'Este servidor ha sido encolado para una reinstalación que comienza ahora.',
+ 'details_updated' => 'Los detalles del servidor se han actualizado correctamente.',
+ 'docker_image_updated' => 'Se cambió con éxito la imagen Docker predeterminada para usar en este servidor. Se requiere un reinicio para aplicar este cambio.',
+ 'node_required' => 'Debes tener al menos un nodo configurado antes de poder añadir un servidor a este panel.',
+ 'transfer_nodes_required' => 'Debes tener al menos dos nodos configurados antes de poder transferir servidores.',
+ 'transfer_started' => 'La transferencia del servidor se ha iniciado.',
+ 'transfer_not_viable' => 'El nodo que seleccionaste no tiene el espacio en disco o la memoria disponible requerida para acomodar este servidor.',
+ ],
+];
diff --git a/lang/es/admin/user.php b/lang/es/admin/user.php
new file mode 100644
index 000000000..ab4373270
--- /dev/null
+++ b/lang/es/admin/user.php
@@ -0,0 +1,12 @@
+ [
+ 'user_has_servers' => 'No se puede eliminar un usuario con servidores activos asociados a su cuenta. Por favor, elimina sus servidores antes de continuar.',
+ 'user_is_self' => 'No se puede eliminar tu propia cuenta de usuario.',
+ ],
+ 'notices' => [
+ 'account_created' => 'La cuenta se ha creado correctamente.',
+ 'account_updated' => 'La cuenta se ha actualizado correctamente.',
+ ],
+];
diff --git a/lang/es/auth.php b/lang/es/auth.php
new file mode 100644
index 000000000..a3c86efb4
--- /dev/null
+++ b/lang/es/auth.php
@@ -0,0 +1,27 @@
+ 'Iniciar sesión',
+ 'go_to_login' => 'Ir al inicio de sesión',
+ 'failed' => 'No se pudo encontrar ninguna cuenta que coincida con esas credenciales.',
+
+ 'forgot_password' => [
+ 'label' => '¿Olvidaste tu contraseña?',
+ 'label_help' => 'Ingresa la dirección de correo electrónico de tu cuenta para recibir instrucciones sobre cómo restablecer tu contraseña.',
+ 'button' => 'Recuperar cuenta',
+ ],
+
+ 'reset_password' => [
+ 'button' => 'Restablecer e iniciar sesión',
+ ],
+
+ 'two_factor' => [
+ 'label' => 'Token de 2 Factores',
+ 'label_help' => 'Esta cuenta requiere un segundo nivel de autenticación para continuar. Por favor, ingresa el código generado por tu dispositivo para completar este inicio de sesión.',
+ 'checkpoint_failed' => 'El token de autenticación de dos factores no era válido.',
+ ],
+
+ 'throttle' => 'Demasiados intentos de inicio de sesión. Por favor, inténtalo de nuevo en :seconds segundos.',
+ 'password_requirements' => 'La contraseña debe tener al menos 8 caracteres de longitud y debe ser única para este sitio.',
+ '2fa_must_be_enabled' => 'El administrador ha requerido que la Autenticación de 2 Factores esté habilitada para tu cuenta para poder usar el Panel.',
+];
diff --git a/lang/es/command/messages.php b/lang/es/command/messages.php
new file mode 100644
index 000000000..1723749c2
--- /dev/null
+++ b/lang/es/command/messages.php
@@ -0,0 +1,59 @@
+ [
+ 'search_users' => 'Introduce un nombre de usuario, ID de usuario o dirección de correo electrónico',
+ 'select_search_user' => 'ID del usuario a eliminar (Introduce \'0\' para volver a buscar)',
+ 'deleted' => 'Usuario eliminado correctamente del Panel.',
+ 'confirm_delete' => '¿Estás seguro de que quieres eliminar este usuario del Panel?',
+ 'no_users_found' => 'No se encontraron usuarios para el término de búsqueda proporcionado.',
+ 'multiple_found' => 'Se encontraron varias cuentas para el usuario proporcionado, no se puede eliminar un usuario debido a la bandera --no-interaction.',
+ 'ask_admin' => '¿Es este usuario un administrador?',
+ 'ask_email' => 'Dirección de correo electrónico',
+ 'ask_username' => 'Nombre de usuario',
+ 'ask_name_first' => 'Nombre',
+ 'ask_name_last' => 'Apellido',
+ 'ask_password' => 'Contraseña',
+ 'ask_password_tip' => 'Si deseas crear una cuenta con una contraseña aleatoria enviada por correo electrónico al usuario, vuelve a ejecutar este comando (CTRL+C) y pasa la bandera `--no-password`.',
+ 'ask_password_help' => 'Las contraseñas deben tener al menos 8 caracteres de longitud y contener al menos una letra mayúscula y un número.',
+ '2fa_help_text' => [
+ 'Este comando deshabilitará la autenticación de dos factores para la cuenta de un usuario si está habilitada. Esto solo debe usarse como un comando de recuperación de cuenta si el usuario está bloqueado fuera de su cuenta.',
+ 'Si esto no es lo que querías hacer, presiona CTRL+C para salir de este proceso.',
+ ],
+ '2fa_disabled' => 'La autenticación de dos factores ha sido desactivada para :email.',
+ ],
+ 'schedule' => [
+ 'output_line' => 'Enviando trabajo para la primera tarea en `:schedule` (:hash).',
+ ],
+ 'maintenance' => [
+ 'deleting_service_backup' => 'Eliminando archivo de copia de seguridad del servicio :file.',
+ ],
+ 'server' => [
+ 'rebuild_failed' => 'La solicitud de reconstrucción para ":name" (#:id) en el nodo ":node" falló con el error: :message',
+ 'reinstall' => [
+ 'failed' => 'La solicitud de reinstalación para ":name" (#:id) en el nodo ":node" falló con el error: :message',
+ 'confirm' => 'Estás a punto de reinstalar contra un grupo de servidores. ¿Deseas continuar?',
+ ],
+ 'power' => [
+ 'confirm' => 'Estás a punto de realizar una :action contra :count servidores. ¿Deseas continuar?',
+ 'action_failed' => 'La acción de energía para ":name" (#:id) en el nodo ":node" falló con el error: :message',
+ ],
+ ],
+ 'environment' => [
+ 'mail' => [
+ 'ask_smtp_host' => 'Host SMTP (por ejemplo, smtp.gmail.com)',
+ 'ask_smtp_port' => 'Puerto SMTP',
+ 'ask_smtp_username' => 'Nombre de usuario SMTP',
+ 'ask_smtp_password' => 'Contraseña SMTP',
+ 'ask_mailgun_domain' => 'Dominio de Mailgun',
+ 'ask_mailgun_endpoint' => 'Extremo de Mailgun',
+ 'ask_mailgun_secret' => 'Secreto de Mailgun',
+ 'ask_mandrill_secret' => 'Secreto de Mandrill',
+ 'ask_postmark_username' => 'Clave API de Postmark',
+ 'ask_driver' => '¿Qué controlador debe usarse para enviar correos electrónicos?',
+ 'ask_mail_from' => 'Dirección de correo electrónico desde la cual deben originarse los correos electrónicos',
+ 'ask_mail_name' => 'Nombre que debe aparecer en los correos electrónicos',
+ 'ask_encryption' => 'Método de cifrado a utilizar',
+ ],
+ ],
+];
diff --git a/lang/es/dashboard/account.php b/lang/es/dashboard/account.php
new file mode 100644
index 000000000..df74c95d9
--- /dev/null
+++ b/lang/es/dashboard/account.php
@@ -0,0 +1,28 @@
+ [
+ 'title' => 'Actualizar tu correo electrónico',
+ 'updated' => 'Tu dirección de correo electrónico ha sido actualizada.',
+ ],
+ 'password' => [
+ 'title' => 'Cambiar tu contraseña',
+ 'requirements' => 'Tu nueva contraseña debe tener al menos 8 caracteres de longitud.',
+ 'updated' => 'Tu contraseña ha sido actualizada.',
+ ],
+ 'two_factor' => [
+ 'button' => 'Configurar autenticación de 2 factores',
+ 'disabled' => 'La autenticación de dos factores ha sido desactivada en tu cuenta. Ya no se te pedirá que proporciones un token al iniciar sesión.',
+ 'enabled' => '¡La autenticación de dos factores ha sido activada en tu cuenta! A partir de ahora, al iniciar sesión, se te pedirá que proporciones el código generado por tu dispositivo.',
+ 'invalid' => 'El token proporcionado no era válido.',
+ 'setup' => [
+ 'title' => 'Configurar autenticación de dos factores',
+ 'help' => '¿No puedes escanear el código? Ingresa el código a continuación en tu aplicación:',
+ 'field' => 'Introduce el token',
+ ],
+ 'disable' => [
+ 'title' => 'Desactivar autenticación de dos factores',
+ 'field' => 'Introduce el token',
+ ],
+ ],
+];
diff --git a/lang/es/dashboard/index.php b/lang/es/dashboard/index.php
new file mode 100644
index 000000000..ccbdd18f2
--- /dev/null
+++ b/lang/es/dashboard/index.php
@@ -0,0 +1,8 @@
+ 'Buscar servidores...',
+ 'no_matches' => 'No se encontraron servidores que coincidan con los criterios de búsqueda proporcionados.',
+ 'cpu_title' => 'CPU',
+ 'memory_title' => 'Memoria',
+];
diff --git a/lang/es/exceptions.php b/lang/es/exceptions.php
new file mode 100644
index 000000000..14ebcfb85
--- /dev/null
+++ b/lang/es/exceptions.php
@@ -0,0 +1,55 @@
+ 'Se produjo una excepción al intentar comunicarse con el daemon, lo que resultó en un código de respuesta HTTP/:code. Esta excepción ha sido registrada.',
+ 'node' => [
+ 'servers_attached' => 'Un nodo no debe tener servidores vinculados a él para poder ser eliminado.',
+ 'daemon_off_config_updated' => 'La configuración del daemon se ha actualizado, sin embargo, se encontró un error al intentar actualizar automáticamente el archivo de configuración en el daemon. Deberás actualizar manualmente el archivo de configuración (config.yml) para que el daemon aplique estos cambios.',
+ ],
+ 'allocations' => [
+ 'server_using' => 'Actualmente hay un servidor asignado a esta asignación. Una asignación solo puede ser eliminada si ningún servidor está asignado actualmente.',
+ 'too_many_ports' => 'Agregar más de 1000 puertos en un solo rango a la vez no está soportado.',
+ 'invalid_mapping' => 'El mapeo proporcionado para el puerto :port era inválido y no pudo ser procesado.',
+ 'cidr_out_of_range' => 'La notación CIDR solo permite máscaras entre /25 y /32.',
+ 'port_out_of_range' => 'Los puertos en una asignación deben ser mayores que 1024 y menores o iguales a 65535.',
+ ],
+ 'egg' => [
+ 'delete_has_servers' => 'Un Huevo con servidores activos vinculados a él no puede ser eliminado del Panel.',
+ 'invalid_copy_id' => 'El Huevo seleccionado para copiar un script desde no existe o está copiando un script en sí mismo.',
+ 'has_children' => 'Este Huevo es padre de uno o más otros Huevos. Por favor, elimina esos Huevos antes de eliminar este Huevo.',
+ ],
+ 'variables' => [
+ 'env_not_unique' => 'La variable de entorno :name debe ser única para este Huevo.',
+ 'reserved_name' => 'La variable de entorno :name está protegida y no se puede asignar a una variable.',
+ 'bad_validation_rule' => 'La regla de validación ":rule" no es una regla válida para esta aplicación.',
+ ],
+ 'importer' => [
+ 'json_error' => 'Hubo un error al intentar analizar el archivo JSON: :error.',
+ 'file_error' => 'El archivo JSON proporcionado no era válido.',
+ 'invalid_json_provided' => 'El archivo JSON proporcionado no está en un formato que pueda ser reconocido.',
+ ],
+ 'subusers' => [
+ 'editing_self' => 'No está permitido editar tu propia cuenta de subusuario.',
+ 'user_is_owner' => 'No puedes agregar al propietario del servidor como subusuario para este servidor.',
+ 'subuser_exists' => 'Ya hay un usuario con esa dirección de correo electrónico asignado como subusuario para este servidor.',
+ ],
+ 'databases' => [
+ 'delete_has_databases' => 'No se puede eliminar un servidor de host de base de datos que tiene bases de datos activas vinculadas a él.',
+ ],
+ 'tasks' => [
+ 'chain_interval_too_long' => 'El tiempo máximo de intervalo para una tarea encadenada es de 15 minutos.',
+ ],
+ 'locations' => [
+ 'has_nodes' => 'No se puede eliminar una ubicación que tiene nodos activos vinculados a ella.',
+ ],
+ 'users' => [
+ 'node_revocation_failed' => 'Error al revocar las claves en Nodo #:node. :error',
+ ],
+ 'deployment' => [
+ 'no_viable_nodes' => 'No se encontraron nodos que satisfagan los requisitos especificados para el despliegue automático.',
+ 'no_viable_allocations' => 'No se encontraron asignaciones que satisfagan los requisitos para el despliegue automático.',
+ ],
+ 'api' => [
+ 'resource_not_found' => 'El recurso solicitado no existe en este servidor.',
+ ],
+];
diff --git a/lang/es/pagination.php b/lang/es/pagination.php
new file mode 100644
index 000000000..51862f2eb
--- /dev/null
+++ b/lang/es/pagination.php
@@ -0,0 +1,17 @@
+ '« Anterior',
+ 'next' => 'Siguiente »',
+];
diff --git a/lang/es/passwords.php b/lang/es/passwords.php
new file mode 100644
index 000000000..1f0855205
--- /dev/null
+++ b/lang/es/passwords.php
@@ -0,0 +1,19 @@
+ 'Las contraseñas deben tener al menos seis caracteres y coincidir con la confirmación.',
+ 'reset' => '¡Tu contraseña ha sido restablecida!',
+ 'sent' => '¡Hemos enviado por correo electrónico el enlace para restablecer tu contraseña!',
+ 'token' => 'Este token de restablecimiento de contraseña no es válido.',
+ 'user' => 'No podemos encontrar un usuario con esa dirección de correo electrónico.',
+];
diff --git a/lang/es/server/users.php b/lang/es/server/users.php
new file mode 100644
index 000000000..b71f9389a
--- /dev/null
+++ b/lang/es/server/users.php
@@ -0,0 +1,33 @@
+ [
+ 'websocket_*' => 'Permite el acceso al websocket para este servidor.',
+ 'control_console' => 'Permite al usuario enviar datos a la consola del servidor.',
+ 'control_start' => 'Permite al usuario iniciar la instancia del servidor.',
+ 'control_stop' => 'Permite al usuario detener la instancia del servidor.',
+ 'control_restart' => 'Permite al usuario reiniciar la instancia del servidor.',
+ 'control_kill' => 'Permite al usuario eliminar la instancia del servidor.',
+ 'user_create' => 'Permite al usuario crear nuevas cuentas de usuario para el servidor.',
+ 'user_read' => 'Permite al usuario ver los usuarios asociados con este servidor.',
+ 'user_update' => 'Permite al usuario modificar otros usuarios asociados con este servidor.',
+ 'user_delete' => 'Permite al usuario eliminar otros usuarios asociados con este servidor.',
+ 'file_create' => 'Permite al usuario crear nuevos archivos y directorios.',
+ 'file_read' => 'Permite al usuario ver archivos y carpetas asociados con esta instancia de servidor, así como ver su contenido.',
+ 'file_update' => 'Permite al usuario actualizar archivos y carpetas asociados con el servidor.',
+ 'file_delete' => 'Permite al usuario eliminar archivos y directorios.',
+ 'file_archive' => 'Permite al usuario crear archivos de archivos y descomprimir archivos existentes.',
+ 'file_sftp' => 'Permite al usuario realizar las acciones de archivo anteriores utilizando un cliente SFTP.',
+ 'allocation_read' => 'Permite el acceso a las páginas de gestión de asignación del servidor.',
+ 'allocation_update' => 'Permite al usuario realizar modificaciones en las asignaciones del servidor.',
+ 'database_create' => 'Permite al usuario crear una nueva base de datos para el servidor.',
+ 'database_read' => 'Permite al usuario ver las bases de datos del servidor.',
+ 'database_update' => 'Permite al usuario realizar modificaciones en una base de datos. Si el usuario no tiene también el permiso de "Ver contraseña", no podrá modificar la contraseña.',
+ 'database_delete' => 'Permite al usuario eliminar una instancia de base de datos.',
+ 'database_view_password' => 'Permite al usuario ver la contraseña de una base de datos en el sistema.',
+ 'schedule_create' => 'Permite al usuario crear un nuevo horario para el servidor.',
+ 'schedule_read' => 'Permite al usuario ver los horarios de un servidor.',
+ 'schedule_update' => 'Permite al usuario realizar modificaciones en un horario existente del servidor.',
+ 'schedule_delete' => 'Permite al usuario eliminar un horario del servidor.',
+ ],
+];
diff --git a/lang/es/strings.php b/lang/es/strings.php
new file mode 100644
index 000000000..107d4deb5
--- /dev/null
+++ b/lang/es/strings.php
@@ -0,0 +1,95 @@
+ 'Correo electrónico',
+ 'email_address' => 'Dirección de correo electrónico',
+ 'user_identifier' => 'Nombre de usuario o Correo electrónico',
+ 'password' => 'Contraseña',
+ 'new_password' => 'Nueva contraseña',
+ 'confirm_password' => 'Confirmar nueva contraseña',
+ 'login' => 'Iniciar sesión',
+ 'home' => 'Inicio',
+ 'servers' => 'Servidores',
+ 'id' => 'ID',
+ 'name' => 'Nombre',
+ 'node' => 'Nodo',
+ 'connection' => 'Conexión',
+ 'memory' => 'Memoria',
+ 'cpu' => 'CPU',
+ 'disk' => 'Disco',
+ 'status' => 'Estado',
+ 'search' => 'Buscar',
+ 'suspended' => 'Suspendido',
+ 'account' => 'Cuenta',
+ 'security' => 'Seguridad',
+ 'ip' => 'Dirección IP',
+ 'last_activity' => 'Última Actividad',
+ 'revoke' => 'Revocar',
+ '2fa_token' => 'Token de Autenticación',
+ 'submit' => 'Enviar',
+ 'close' => 'Cerrar',
+ 'settings' => 'Ajustes',
+ 'configuration' => 'Configuración',
+ 'sftp' => 'SFTP',
+ 'databases' => 'Bases de Datos',
+ 'memo' => 'Nota',
+ 'created' => 'Creado',
+ 'expires' => 'Caduca',
+ 'public_key' => 'Token',
+ 'api_access' => 'Acceso API',
+ 'never' => 'nunca',
+ 'sign_out' => 'Cerrar sesión',
+ 'admin_control' => 'Control de Administrador',
+ 'required' => 'Requerido',
+ 'port' => 'Puerto',
+ 'username' => 'Nombre de usuario',
+ 'database' => 'Base de datos',
+ 'new' => 'Nuevo',
+ 'danger' => 'Peligro',
+ 'create' => 'Crear',
+ 'select_all' => 'Seleccionar Todo',
+ 'select_none' => 'Seleccionar Ninguno',
+ 'alias' => 'Alias',
+ 'primary' => 'Principal',
+ 'make_primary' => 'Hacer Principal',
+ 'none' => 'Ninguno',
+ 'cancel' => 'Cancelar',
+ 'created_at' => 'Creado en',
+ 'action' => 'Acción',
+ 'data' => 'Datos',
+ 'queued' => 'En cola',
+ 'last_run' => 'Última Ejecución',
+ 'next_run' => 'Próxima Ejecución',
+ 'not_run_yet' => 'Todavía no se ha ejecutado',
+ 'yes' => 'Sí',
+ 'no' => 'No',
+ 'delete' => 'Eliminar',
+ '2fa' => '2FA',
+ 'logout' => 'Cerrar sesión',
+ 'admin_cp' => 'Panel de Control de Administrador',
+ 'optional' => 'Opcional',
+ 'read_only' => 'Solo Lectura',
+ 'relation' => 'Relación',
+ 'owner' => 'Propietario',
+ 'admin' => 'Administrador',
+ 'subuser' => 'Subusuario',
+ 'captcha_invalid' => 'El captcha proporcionado no es válido.',
+ 'tasks' => 'Tareas',
+ 'seconds' => 'Segundos',
+ 'minutes' => 'Minutos',
+ 'under_maintenance' => 'En Mantenimiento',
+ 'days' => [
+ 'sun' => 'Domingo',
+ 'mon' => 'Lunes',
+ 'tues' => 'Martes',
+ 'wed' => 'Miércoles',
+ 'thurs' => 'Jueves',
+ 'fri' => 'Viernes',
+ 'sat' => 'Sábado',
+ ],
+ 'last_used' => 'Último Uso',
+ 'enable' => 'Activar',
+ 'disable' => 'Desactivar',
+ 'save' => 'Guardar',
+ 'copyright' => '® 2024 - :year Pelican',
+];
diff --git a/lang/es/validation.php b/lang/es/validation.php
new file mode 100644
index 000000000..c5b76a490
--- /dev/null
+++ b/lang/es/validation.php
@@ -0,0 +1,106 @@
+ 'El campo :attribute debe ser aceptado.',
+ 'active_url' => 'El campo :attribute no es una URL válida.',
+ 'after' => 'El campo :attribute debe ser una fecha posterior a :date.',
+ 'after_or_equal' => 'El campo :attribute debe ser una fecha posterior o igual a :date.',
+ 'alpha' => 'El campo :attribute solo puede contener letras.',
+ 'alpha_dash' => 'El campo :attribute solo puede contener letras, números y guiones.',
+ 'alpha_num' => 'El campo :attribute solo puede contener letras y números.',
+ 'array' => 'El campo :attribute debe ser un conjunto.',
+ 'before' => 'El campo :attribute debe ser una fecha anterior a :date.',
+ 'before_or_equal' => 'El campo :attribute debe ser una fecha anterior o igual a :date.',
+ 'between' => [
+ 'numeric' => 'El campo :attribute debe estar entre :min y :max.',
+ 'file' => 'El campo :attribute debe tener entre :min y :max kilobytes.',
+ 'string' => 'El campo :attribute debe tener entre :min y :max caracteres.',
+ 'array' => 'El campo :attribute debe tener entre :min y :max elementos.',
+ ],
+ 'boolean' => 'El campo :attribute debe ser verdadero o falso.',
+ 'confirmed' => 'La confirmación de :attribute no coincide.',
+ 'date' => 'El campo :attribute no es una fecha válida.',
+ 'date_format' => 'El campo :attribute no coincide con el formato :format.',
+ 'different' => 'Los campos :attribute y :other deben ser diferentes.',
+ 'digits' => 'El campo :attribute debe tener :digits dígitos.',
+ 'digits_between' => 'El campo :attribute debe tener entre :min y :max dígitos.',
+ 'dimensions' => 'Las dimensiones de la imagen :attribute no son válidas.',
+ 'distinct' => 'El campo :attribute tiene un valor duplicado.',
+ 'email' => 'El campo :attribute debe ser una dirección de correo electrónico válida.',
+ 'exists' => 'El :attribute seleccionado no es válido.',
+ 'file' => 'El campo :attribute debe ser un archivo.',
+ 'filled' => 'El campo :attribute es obligatorio.',
+ 'image' => 'El campo :attribute debe ser una imagen.',
+ 'in' => 'El :attribute seleccionado no es válido.',
+ 'in_array' => 'El campo :attribute no existe en :other.',
+ 'integer' => 'El campo :attribute debe ser un número entero.',
+ 'ip' => 'El campo :attribute debe ser una dirección IP válida.',
+ 'json' => 'El campo :attribute debe ser una cadena JSON válida.',
+ 'max' => [
+ 'numeric' => 'El campo :attribute no debe ser mayor que :max.',
+ 'file' => 'El tamaño del archivo :attribute no debe ser mayor que :max kilobytes.',
+ 'string' => 'El campo :attribute no debe contener más de :max caracteres.',
+ 'array' => 'El campo :attribute no debe contener más de :max elementos.',
+ ],
+ 'mimes' => 'El campo :attribute debe ser un archivo del tipo: :values.',
+ 'mimetypes' => 'El campo :attribute debe ser un archivo del tipo: :values.',
+ 'min' => [
+ 'numeric' => 'El campo :attribute debe tener al menos :min.',
+ 'file' => 'El tamaño del archivo :attribute debe ser al menos :min kilobytes.',
+ 'string' => 'El campo :attribute debe tener al menos :min caracteres.',
+ 'array' => 'El campo :attribute debe tener al menos :min elementos.',
+ ],
+ 'not_in' => 'El campo :attribute seleccionado no es válido.',
+ 'numeric' => 'El campo :attribute debe ser un número.',
+ 'present' => 'El campo :attribute debe estar presente.',
+ 'regex' => 'El formato del campo :attribute no es válido.',
+ 'required' => 'El campo :attribute es obligatorio.',
+ 'required_if' => 'El campo :attribute es obligatorio cuando :other es :value.',
+ 'required_unless' => 'El campo :attribute es obligatorio a menos que :other esté en :values.',
+ 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.',
+ 'required_with_all' => 'El campo :attribute es obligatorio cuando :values está presente.',
+ 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.',
+ 'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de :values está presente.',
+ 'same' => 'Los campos :attribute y :other deben coincidir.',
+ 'size' => [
+ 'numeric' => 'El campo :attribute debe ser :size.',
+ 'file' => 'El campo :attribute debe tener :size kilobytes.',
+ 'string' => 'El campo :attribute debe tener :size caracteres.',
+ 'array' => 'El campo :attribute debe contener :size elementos.',
+ ],
+ 'string' => 'El campo :attribute debe ser una cadena de texto.',
+ 'timezone' => 'El campo :attribute debe ser una zona horaria válida.',
+ 'unique' => 'El valor del campo :attribute ya ha sido tomado.',
+ 'uploaded' => 'La carga del archivo :attribute ha fallado.',
+ 'url' => 'El formato de :attribute no es válido.',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Attributes
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to swap attribute place-holders
+ | with something more reader friendly such as E-Mail Address instead
+ | of "email". This simply helps us make messages a little cleaner.
+ |
+ */
+
+ 'attributes' => [],
+
+ // Internal validation logic for Panel
+ 'internal' => [
+ 'variable_value' => 'Variable :env',
+ 'invalid_password' => 'La contraseña proporcionada no es válida para esta cuenta.',
+ ],
+];