Browse Source

Add Spanish language support and translations

Pablo Portas López 1 tháng trước cách đây
mục cha
commit
123f7d1999

+ 1 - 1
frontend/check-locales.cjs

@@ -8,7 +8,7 @@
 
 
 const allLocales = [
 const allLocales = [
 	["en", "en-US"],
 	["en", "en-US"],
-	["fa", "fa-IR"],
+	["es", "es-ES"],
 ];
 ];
 
 
 const ignoreUnused = [
 const ignoreUnused = [

+ 10 - 1
frontend/src/locale/IntlProvider.tsx

@@ -1,15 +1,21 @@
 import { createIntl, createIntlCache } from "react-intl";
 import { createIntl, createIntlCache } from "react-intl";
 import langEn from "./lang/en.json";
 import langEn from "./lang/en.json";
+import langEs from "./lang/es.json";
 import langList from "./lang/lang-list.json";
 import langList from "./lang/lang-list.json";
 
 
 // first item of each array should be the language code,
 // first item of each array should be the language code,
 // not the country code
 // not the country code
 // Remember when adding to this list, also update check-locales.js script
 // Remember when adding to this list, also update check-locales.js script
-const localeOptions = [["en", "en-US"]];
+const localeOptions = [
+  ["en", "en-US"],
+  ["es", "es-ES"]
+];
 
 
 const loadMessages = (locale?: string): typeof langList & typeof langEn => {
 const loadMessages = (locale?: string): typeof langList & typeof langEn => {
 	const thisLocale = locale || "en";
 	const thisLocale = locale || "en";
 	switch (thisLocale.slice(0, 2)) {
 	switch (thisLocale.slice(0, 2)) {
+	  case "es":
+			return Object.assign({}, langList, langEs);
 		default:
 		default:
 			return Object.assign({}, langList, langEn);
 			return Object.assign({}, langList, langEn);
 	}
 	}
@@ -17,6 +23,9 @@ const loadMessages = (locale?: string): typeof langList & typeof langEn => {
 
 
 const getFlagCodeForLocale = (locale?: string) => {
 const getFlagCodeForLocale = (locale?: string) => {
 	switch (locale) {
 	switch (locale) {
+	  case "es-ES":
+	  case "es":
+			return "ES";
 		default:
 		default:
 			return "EN";
 			return "EN";
 	}
 	}

+ 215 - 0
frontend/src/locale/lang/es.json

@@ -0,0 +1,215 @@
+{
+  "access-list": "Lista de Acceso",
+  "access-list.access-count": "{count} {count, plural, one {Regla} other {Reglas}}",
+  "access-list.auth-count": "{count} {count, plural, one {Usuario} other {Usuarios}}",
+  "access-list.help-rules-last": "Cuando exista al menos 1 regla, esta regla de denegar todo se añadirá al final",
+  "access-list.help.rules-order": "Ten en cuenta que las directivas de permitir y denegar se aplicarán en el orden en que estén definidas.",
+  "access-list.pass-auth": "Pasar Autenticación al Upstream",
+  "access-list.public": "Accesible Públicamente",
+  "access-list.public.subtitle": "No se requiere autenticación básica",
+  "access-list.satisfy-any": "Satisfacer Cualquiera",
+  "access-list.subtitle": "{users} {users, plural, one {Usuario} other {Usuarios}}, {rules} {rules, plural, one {Regla} other {Reglas}} - Creado: {date}",
+  "access-lists": "Listas de Acceso",
+  "action.add": "Añadir",
+  "action.add-location": "Añadir Ubicación",
+  "action.close": "Cerrar",
+  "action.delete": "Eliminar",
+  "action.disable": "Deshabilitar",
+  "action.download": "Descargar",
+  "action.edit": "Editar",
+  "action.enable": "Habilitar",
+  "action.permissions": "Permisos",
+  "action.renew": "Renovar",
+  "action.view-details": "Ver Detalles",
+  "auditlogs": "Registros de Auditoría",
+  "cancel": "Cancelar",
+  "certificate": "Certificado",
+  "certificate.custom-certificate": "Certificado",
+  "certificate.custom-certificate-key": "Clave del Certificado",
+  "certificate.custom-intermediate": "Certificado Intermedio",
+  "certificate.in-use": "En Uso",
+  "certificate.none.subtitle": "Sin certificado asignado",
+  "certificate.none.subtitle.for-http": "Este host no usará HTTPS",
+  "certificate.none.title": "Ninguno",
+  "certificate.not-in-use": "Sin Usar",
+  "certificate.renew": "Renovar Certificado",
+  "certificates": "Certificados",
+  "certificates.custom": "Certificado Personalizado",
+  "certificates.custom.warning": "No se admiten archivos de claves protegidos con contraseña.",
+  "certificates.dns.credentials": "Contenido del Archivo de Credenciales",
+  "certificates.dns.credentials-note": "Este plugin requiere un archivo de configuración que contenga un token de API u otras credenciales para tu proveedor",
+  "certificates.dns.credentials-warning": "¡Estos datos se almacenarán como texto plano en la base de datos y en un archivo!",
+  "certificates.dns.propagation-seconds": "Segundos de Propagación",
+  "certificates.dns.propagation-seconds-note": "Dejar vacío para usar el valor predeterminado del plugin. Número de segundos a esperar para la propagación DNS.",
+  "certificates.dns.provider": "Proveedor DNS",
+  "certificates.dns.warning": "Esta sección requiere algunos conocimientos sobre Certbot y sus plugins DNS. Consulta la documentación de los plugins respectivos.",
+  "certificates.http.reachability-404": "Se encontró un servidor en este dominio pero no parece ser Nginx Proxy Manager. Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
+  "certificates.http.reachability-failed-to-check": "No se pudo verificar la accesibilidad debido a un error de comunicación con site24x7.com.",
+  "certificates.http.reachability-not-resolved": "No hay ningún servidor disponible en este dominio. Asegúrate de que tu dominio existe y apunta a la IP donde se está ejecutando tu instancia de NPM y, si es necesario, que el puerto 80 esté redirigido en tu router.",
+  "certificates.http.reachability-ok": "Tu servidor es accesible y debería ser posible crear certificados.",
+  "certificates.http.reachability-other": "Se encontró un servidor en este dominio pero devolvió un código de estado inesperado {code}. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
+  "certificates.http.reachability-wrong-data": "Se encontró un servidor en este dominio pero devolvió datos inesperados. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
+  "certificates.http.test-results": "Resultados de la Prueba",
+  "certificates.http.warning": "Estos dominios ya deben estar configurados para apuntar a esta instalación.",
+  "certificates.request.subtitle": "con Let's Encrypt",
+  "certificates.request.title": "Solicitar un nuevo Certificado",
+  "column.access": "Acceso",
+  "column.authorization": "Autorización",
+  "column.authorizations": "Autorizaciones",
+  "column.custom-locations": "Ubicaciones Personalizadas",
+  "column.destination": "Destino",
+  "column.details": "Detalles",
+  "column.email": "Correo Electrónico",
+  "column.event": "Evento",
+  "column.expires": "Expira",
+  "column.http-code": "Acceso",
+  "column.incoming-port": "Puerto de Entrada",
+  "column.name": "Nombre",
+  "column.protocol": "Protocolo",
+  "column.provider": "Proveedor",
+  "column.roles": "Roles",
+  "column.rules": "Reglas",
+  "column.satisfy": "Satisfacer",
+  "column.satisfy-all": "Todo",
+  "column.satisfy-any": "Cualquiera",
+  "column.scheme": "Esquema",
+  "column.source": "Origen",
+  "column.ssl": "SSL",
+  "column.status": "Estado",
+  "created-on": "Creado: {date}",
+  "dashboard": "Panel de Control",
+  "dead-host": "Host 404",
+  "dead-hosts": "Hosts 404",
+  "dead-hosts.count": "{count} {count, plural, one {Host 404} other {Hosts 404}}",
+  "disabled": "Deshabilitado",
+  "domain-names": "Nombres de Dominio",
+  "domain-names.max": "{count} nombres de dominio como máximo",
+  "domain-names.placeholder": "Comienza a escribir para añadir dominio...",
+  "domain-names.wildcards-not-permitted": "No se permiten comodines para este tipo",
+  "domain-names.wildcards-not-supported": "No se admiten comodines para esta CA",
+  "domains.force-ssl": "Forzar SSL",
+  "domains.hsts-enabled": "HSTS Habilitado",
+  "domains.hsts-subdomains": "HSTS en Subdominios",
+  "domains.http2-support": "Soporte HTTP/2",
+  "domains.use-dns": "Usar Desafío DNS",
+  "email-address": "Dirección de correo electrónico",
+  "empty-search": "No se encontraron resultados",
+  "empty-subtitle": "¿Por qué no creas uno?",
+  "enabled": "Habilitado",
+  "error.access.at-least-one": "Se requiere al menos una Autorización o una Regla de Acceso",
+  "error.access.duplicate-usernames": "Los nombres de usuario de autorización deben ser únicos",
+  "error.invalid-auth": "Correo electrónico o contraseña no válidos",
+  "error.invalid-domain": "Dominio no válido: {domain}",
+  "error.invalid-email": "Dirección de correo electrónico no válida",
+  "error.max-character-length": "La longitud máxima es {max} caracter{max, plural, one {} other {es}}",
+  "error.max-domains": "Demasiados dominios, el máximo es {max}",
+  "error.maximum": "El máximo es {max}",
+  "error.min-character-length": "La longitud mínima es {min} caracter{min, plural, one {} other {es}}",
+  "error.minimum": "El mínimo es {min}",
+  "error.passwords-must-match": "Las contraseñas deben coincidir",
+  "error.required": "Este campo es obligatorio",
+  "expires.on": "Expira: {date}",
+  "footer.github-fork": "Bifúrcame en Github",
+  "host.flags.block-exploits": "Bloquear Exploits Comunes",
+  "host.flags.cache-assets": "Cachear Recursos",
+  "host.flags.preserve-path": "Preservar Ruta",
+  "host.flags.protocols": "Protocolos",
+  "host.flags.websockets-upgrade": "Soporte de Websockets",
+  "host.forward-port": "Puerto de Reenvío",
+  "host.forward-scheme": "Esquema",
+  "hosts": "Hosts",
+  "http-only": "Solo HTTP",
+  "lets-encrypt": "Let's Encrypt",
+  "lets-encrypt-via-dns": "Let's Encrypt vía DNS",
+  "lets-encrypt-via-http": "Let's Encrypt vía HTTP",
+  "loading": "Cargando…",
+  "login.title": "Inicia sesión en tu cuenta",
+  "nginx-config.label": "Configuración Personalizada de Nginx",
+  "nginx-config.placeholder": "# ¡Introduce aquí tu configuración personalizada de Nginx bajo tu propio riesgo!",
+  "no-permission-error": "No tienes acceso para ver esto.",
+  "notfound.action": "Llévame al inicio",
+  "notfound.content": "Lo sentimos, pero la página que buscas no fue encontrada",
+  "notfound.title": "Ups… Has encontrado una página de error",
+  "notification.error": "Error",
+  "notification.object-deleted": "{object} ha sido eliminado",
+  "notification.object-disabled": "{object} ha sido deshabilitado",
+  "notification.object-enabled": "{object} ha sido habilitado",
+  "notification.object-renewed": "{object} ha sido renovado",
+  "notification.object-saved": "{object} ha sido guardado",
+  "notification.success": "Éxito",
+  "object.actions-title": "{object} #{id}",
+  "object.add": "Añadir {object}",
+  "object.delete": "Eliminar {object}",
+  "object.delete.content": "¿Estás seguro de que quieres eliminar este {object}?",
+  "object.edit": "Editar {object}",
+  "object.empty": "No hay {objects}",
+  "object.event.created": "{object} Creado",
+  "object.event.deleted": "{object} Eliminado",
+  "object.event.disabled": "{object} Deshabilitado",
+  "object.event.enabled": "{object} Habilitado",
+  "object.event.renewed": "{object} Renovado",
+  "object.event.updated": "{object} Actualizado",
+  "offline": "Desconectado",
+  "online": "Conectado",
+  "options": "Opciones",
+  "password": "Contraseña",
+  "password.generate": "Generar contraseña aleatoria",
+  "password.hide": "Ocultar Contraseña",
+  "password.show": "Mostrar Contraseña",
+  "permissions.hidden": "Oculto",
+  "permissions.manage": "Gestionar",
+  "permissions.view": "Solo Ver",
+  "permissions.visibility.all": "Todos los Elementos",
+  "permissions.visibility.title": "Visibilidad de Elementos",
+  "permissions.visibility.user": "Solo Elementos Creados",
+  "proxy-host": "Host Proxy",
+  "proxy-host.forward-host": "Nombre de Host / IP de Reenvío",
+  "proxy-hosts": "Hosts Proxy",
+  "proxy-hosts.count": "{count} {count, plural, one {Host Proxy} other {Hosts Proxy}}",
+  "public": "Público",
+  "redirection-host": "Host de Redirección",
+  "redirection-host.forward-domain": "Dominio de Reenvío",
+  "redirection-hosts": "Hosts de Redirección",
+  "redirection-hosts.count": "{count} {count, plural, one {Host de Redirección} other {Hosts de Redirección}}",
+  "role.admin": "Administrador",
+  "role.standard-user": "Usuario Estándar",
+  "save": "Guardar",
+  "setting": "Configuración",
+  "settings": "Configuración",
+  "settings.default-site": "Sitio Predeterminado",
+  "settings.default-site.404": "Página 404",
+  "settings.default-site.444": "Sin Respuesta (444)",
+  "settings.default-site.congratulations": "Página de Felicitaciones",
+  "settings.default-site.description": "Qué mostrar cuando Nginx recibe un Host desconocido",
+  "settings.default-site.html": "HTML Personalizado",
+  "settings.default-site.html.placeholder": "<!-- Introduce aquí tu contenido HTML personalizado -->",
+  "settings.default-site.redirect": "Redirigir",
+  "setup.preamble": "Comienza creando tu cuenta de administrador.",
+  "setup.title": "¡Bienvenido!",
+  "sign-in": "Iniciar Sesión",
+  "ssl-certificate": "Certificado SSL",
+  "stream": "Stream",
+  "stream.forward-host": "Host de Reenvío",
+  "stream.incoming-port": "Puerto de Entrada",
+  "streams": "Streams",
+  "streams.count": "{count} {count, plural, one {Stream} other {Streams}}",
+  "streams.tcp": "TCP",
+  "streams.udp": "UDP",
+  "test": "Probar",
+  "user": "Usuario",
+  "user.change-password": "Cambiar Contraseña",
+  "user.confirm-password": "Confirmar Contraseña",
+  "user.current-password": "Contraseña Actual",
+  "user.edit-profile": "Editar Perfil",
+  "user.full-name": "Nombre Completo",
+  "user.login-as": "Iniciar sesión como {name}",
+  "user.logout": "Cerrar Sesión",
+  "user.new-password": "Nueva Contraseña",
+  "user.nickname": "Apodo",
+  "user.set-password": "Establecer Contraseña",
+  "user.set-permissions": "Establecer Permisos para {name}",
+  "user.switch-dark": "Cambiar a modo Oscuro",
+  "user.switch-light": "Cambiar a modo Claro",
+  "username": "Nombre de Usuario",
+  "users": "Usuarios"
+}

+ 3 - 2
frontend/src/locale/lang/lang-list.json

@@ -1,3 +1,4 @@
 {
 {
-  "locale-en-US": "English"
-}
+  "locale-en-US": "English",
+  "locale-es-ES": "Español"
+}

+ 7 - 0
frontend/src/locale/src/HelpDoc/es/AccessLists.md

@@ -0,0 +1,7 @@
+## ¿Qué es una Lista de Acceso?
+
+Las Listas de Acceso proporcionan una lista negra o blanca de direcciones IP de cliente específicas junto con autenticación para los Hosts Proxy a través de Autenticación HTTP Básica.
+
+Puede configurar múltiples reglas de cliente, nombres de usuario y contraseñas para una única Lista de Acceso y luego aplicarla a uno o más _Hosts Proxy_.
+
+Esto es más útil para servicios web reenviados que no tienen mecanismos de autenticación integrados o cuando desea protegerse de clientes desconocidos.

+ 32 - 0
frontend/src/locale/src/HelpDoc/es/Certificates.md

@@ -0,0 +1,32 @@
+## Ayuda de Certificados
+
+### Certificado HTTP
+
+Un certificado validado por HTTP significa que los servidores de Let's Encrypt
+intentarán acceder a tus dominios a través de HTTP (¡no HTTPS!) y, si tienen éxito,
+emitirán tu certificado.
+
+Para este método, deberás tener un _Host Proxy_ creado para tu(s) dominio(s) que
+sea accesible por HTTP y que apunte a esta instalación de Nginx. Después de que se
+haya emitido un certificado, puedes modificar el _Host Proxy_ para que también use
+este certificado para conexiones HTTPS. Sin embargo, el _Host Proxy_ seguirá
+necesitando estar configurado para acceso HTTP para que el certificado se renueve.
+
+Este proceso _no_ admite dominios comodín.
+
+### Certificado DNS
+
+Un certificado validado por DNS requiere que uses un complemento de Proveedor de DNS.
+Este Proveedor de DNS se usará para crear registros temporales en tu dominio y luego
+Let's Encrypt consultará esos registros para asegurarse de que eres el propietario y,
+si tiene éxito, emitirá tu certificado.
+
+No necesitas tener un _Host Proxy_ creado antes de solicitar este tipo de certificado.
+Tampoco necesitas tener tu _Host Proxy_ configurado para acceso HTTP.
+
+Este proceso _sí_ admite dominios comodín.
+
+### Certificado Personalizado
+
+Usa esta opción para cargar tu propio Certificado SSL, proporcionado por tu propia
+Autoridad de Certificación.

+ 10 - 0
frontend/src/locale/src/HelpDoc/es/DeadHosts.md

@@ -0,0 +1,10 @@
+## ¿Qué es un Host 404?
+
+Un Host 404 es simplemente una configuración de host que muestra una página 404.
+
+Esto puede ser útil cuando tu dominio está listado en los motores de búsqueda y deseas
+proporcionar una página de error más agradable o específicamente para indicar a los indexadores de búsqueda que
+las páginas del dominio ya no existen.
+
+Otro beneficio de tener este host es rastrear los registros de visitas a él y
+ver los referentes.

+ 7 - 0
frontend/src/locale/src/HelpDoc/es/ProxyHosts.md

@@ -0,0 +1,7 @@
+## ¿Qué es un Host Proxy?
+
+Un Host Proxy es el punto de entrada para un servicio web que deseas reenviar.
+
+Proporciona terminación SSL opcional para tu servicio que podría no tener soporte SSL integrado.
+
+Los Hosts Proxy son el uso más común del Nginx Proxy Manager.

+ 7 - 0
frontend/src/locale/src/HelpDoc/es/RedirectionHosts.md

@@ -0,0 +1,7 @@
+## ¿Qué es un Host de Redirección?
+
+Un Host de Redirección redirigirá las solicitudes del dominio entrante e impulsará al
+visitante a otro dominio.
+
+La razón más común para usar este tipo de host es cuando tu sitio web cambia de
+dominios pero aún tienes enlaces de motores de búsqueda o referencias apuntando al dominio anterior.

+ 6 - 0
frontend/src/locale/src/HelpDoc/es/Streams.md

@@ -0,0 +1,6 @@
+## ¿Qué es un Stream?
+
+Una característica relativamente nueva para Nginx, un Stream servirá para reenviar tráfico TCP/UDP
+directamente a otra computadora en la red.
+
+Si estás ejecutando servidores de juegos, FTP o servidores SSH esto puede ser muy útil.

+ 6 - 0
frontend/src/locale/src/HelpDoc/es/index.ts

@@ -0,0 +1,6 @@
+export * as AccessLists from "./AccessLists.md";
+export * as Certificates from "./Certificates.md";
+export * as DeadHosts from "./DeadHosts.md";
+export * as ProxyHosts from "./ProxyHosts.md";
+export * as RedirectionHosts from "./RedirectionHosts.md";
+export * as Streams from "./Streams.md";

+ 641 - 0
frontend/src/locale/src/es.json

@@ -0,0 +1,641 @@
+{
+  "redirection-host.forward-domain": {
+    "defaultMessage": "Dominio de Reenvío"
+  },
+  "redirection-hosts.count": {
+    "defaultMessage": "{count} {count, plural, one {Host de Redirección} other {Hosts de Redirección}}"
+  },
+  "notification.success": {
+    "defaultMessage": "Éxito"
+  },
+  "setup.preamble": {
+    "defaultMessage": "Comienza creando tu cuenta de administrador."
+  },
+  "column.event": {
+    "defaultMessage": "Evento"
+  },
+  "auditlogs": {
+    "defaultMessage": "Registros de Auditoría"
+  },
+  "enabled": {
+    "defaultMessage": "Habilitado"
+  },
+  "column.source": {
+    "defaultMessage": "Origen"
+  },
+  "column.details": {
+    "defaultMessage": "Detalles"
+  },
+  "column.ssl": {
+    "defaultMessage": "SSL"
+  },
+  "column.destination": {
+    "defaultMessage": "Destino"
+  },
+  "settings.default-site.html": {
+    "defaultMessage": "HTML Personalizado"
+  },
+  "proxy-host": {
+    "defaultMessage": "Host Proxy"
+  },
+  "certificates.dns.propagation-seconds-note": {
+    "defaultMessage": "Dejar vacío para usar el valor predeterminado del plugin. Número de segundos a esperar para la propagación DNS."
+  },
+  "settings.default-site.redirect": {
+    "defaultMessage": "Redirigir"
+  },
+  "hosts": {
+    "defaultMessage": "Hosts"
+  },
+  "users": {
+    "defaultMessage": "Usuarios"
+  },
+  "permissions.visibility.all": {
+    "defaultMessage": "Todos los Elementos"
+  },
+  "password.generate": {
+    "defaultMessage": "Generar contraseña aleatoria"
+  },
+  "host.flags.preserve-path": {
+    "defaultMessage": "Preservar Ruta"
+  },
+  "password.show": {
+    "defaultMessage": "Mostrar Contraseña"
+  },
+  "permissions.visibility.title": {
+    "defaultMessage": "Visibilidad de Elementos"
+  },
+  "http-only": {
+    "defaultMessage": "Solo HTTP"
+  },
+  "empty-search": {
+    "defaultMessage": "No se encontraron resultados"
+  },
+  "column.provider": {
+    "defaultMessage": "Proveedor"
+  },
+  "user": {
+    "defaultMessage": "Usuario"
+  },
+  "domain-names.placeholder": {
+    "defaultMessage": "Comienza a escribir para añadir dominio..."
+  },
+  "certificates": {
+    "defaultMessage": "Certificados"
+  },
+  "host.flags.websockets-upgrade": {
+    "defaultMessage": "Soporte de Websockets"
+  },
+  "dead-host": {
+    "defaultMessage": "Host 404"
+  },
+  "column.email": {
+    "defaultMessage": "Correo Electrónico"
+  },
+  "settings.default-site": {
+    "defaultMessage": "Sitio Predeterminado"
+  },
+  "action.add-location": {
+    "defaultMessage": "Añadir Ubicación"
+  },
+  "settings.default-site.404": {
+    "defaultMessage": "Página 404"
+  },
+  "user.change-password": {
+    "defaultMessage": "Cambiar Contraseña"
+  },
+  "settings": {
+    "defaultMessage": "Configuración"
+  },
+  "certificate.custom-certificate": {
+    "defaultMessage": "Certificado"
+  },
+  "streams": {
+    "defaultMessage": "Streams"
+  },
+  "streams.count": {
+    "defaultMessage": "{count} {count, plural, one {Stream} other {Streams}}"
+  },
+  "error.passwords-must-match": {
+    "defaultMessage": "Las contraseñas deben coincidir"
+  },
+  "ssl-certificate": {
+    "defaultMessage": "Certificado SSL"
+  },
+  "certificate.none.subtitle.for-http": {
+    "defaultMessage": "Este host no usará HTTPS"
+  },
+  "user.confirm-password": {
+    "defaultMessage": "Confirmar Contraseña"
+  },
+  "notfound.title": {
+    "defaultMessage": "Ups… Has encontrado una página de error"
+  },
+  "object.edit": {
+    "defaultMessage": "Editar {object}"
+  },
+  "error.max-domains": {
+    "defaultMessage": "Demasiados dominios, el máximo es {max}"
+  },
+  "column.scheme": {
+    "defaultMessage": "Esquema"
+  },
+  "permissions.hidden": {
+    "defaultMessage": "Oculto"
+  },
+  "certificate.in-use": {
+    "defaultMessage": "En Uso"
+  },
+  "column.satisfy": {
+    "defaultMessage": "Satisfacer"
+  },
+  "column.protocol": {
+    "defaultMessage": "Protocolo"
+  },
+  "action.add": {
+    "defaultMessage": "Añadir"
+  },
+  "column.custom-locations": {
+    "defaultMessage": "Ubicaciones Personalizadas"
+  },
+  "certificate.renew": {
+    "defaultMessage": "Renovar Certificado"
+  },
+  "offline": {
+    "defaultMessage": "Desconectado"
+  },
+  "permissions.visibility.user": {
+    "defaultMessage": "Solo Elementos Creados"
+  },
+  "certificates.dns.credentials": {
+    "defaultMessage": "Contenido del Archivo de Credenciales"
+  },
+  "proxy-hosts": {
+    "defaultMessage": "Hosts Proxy"
+  },
+  "user.edit-profile": {
+    "defaultMessage": "Editar Perfil"
+  },
+  "user.switch-dark": {
+    "defaultMessage": "Cambiar a modo Oscuro"
+  },
+  "certificates.custom.warning": {
+    "defaultMessage": "No se admiten archivos de claves protegidos con contraseña."
+  },
+  "access-list.help.rules-order": {
+    "defaultMessage": "Ten en cuenta que las directivas de permitir y denegar se aplicarán en el orden en que estén definidas."
+  },
+  "save": {
+    "defaultMessage": "Guardar"
+  },
+  "certificates.http.reachability-404": {
+    "defaultMessage": "Se encontró un servidor en este dominio pero no parece ser Nginx Proxy Manager. Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM."
+  },
+  "certificates.http.reachability-wrong-data": {
+    "defaultMessage": "Se encontró un servidor en este dominio pero devolvió datos inesperados. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM."
+  },
+  "settings.default-site.congratulations": {
+    "defaultMessage": "Página de Felicitaciones"
+  },
+  "streams.tcp": {
+    "defaultMessage": "TCP"
+  },
+  "user.current-password": {
+    "defaultMessage": "Contraseña Actual"
+  },
+  "access-list": {
+    "defaultMessage": "Lista de Acceso"
+  },
+  "column.access": {
+    "defaultMessage": "Acceso"
+  },
+  "action.delete": {
+    "defaultMessage": "Eliminar"
+  },
+  "certificates.custom": {
+    "defaultMessage": "Certificado Personalizado"
+  },
+  "column.authorizations": {
+    "defaultMessage": "Autorizaciones"
+  },
+  "host.flags.block-exploits": {
+    "defaultMessage": "Bloquear Exploits Comunes"
+  },
+  "object.event.created": {
+    "defaultMessage": "{object} Creado"
+  },
+  "options": {
+    "defaultMessage": "Opciones"
+  },
+  "redirection-host": {
+    "defaultMessage": "Host de Redirección"
+  },
+  "certificate.none.title": {
+    "defaultMessage": "Ninguno"
+  },
+  "created-on": {
+    "defaultMessage": "Creado: {date}"
+  },
+  "user.login-as": {
+    "defaultMessage": "Iniciar sesión como {name}"
+  },
+  "certificates.request.subtitle": {
+    "defaultMessage": "con Let's Encrypt"
+  },
+  "proxy-hosts.count": {
+    "defaultMessage": "{count} {count, plural, one {Host Proxy} other {Hosts Proxy}}"
+  },
+  "host.forward-port": {
+    "defaultMessage": "Puerto de Reenvío"
+  },
+  "notfound.content": {
+    "defaultMessage": "Lo sentimos, pero la página que buscas no fue encontrada"
+  },
+  "access-list.public.subtitle": {
+    "defaultMessage": "No se requiere autenticación básica"
+  },
+  "proxy-host.forward-host": {
+    "defaultMessage": "Nombre de Host / IP de Reenvío"
+  },
+  "settings.default-site.444": {
+    "defaultMessage": "Sin Respuesta (444)"
+  },
+  "settings.default-site.description": {
+    "defaultMessage": "Qué mostrar cuando Nginx recibe un Host desconocido"
+  },
+  "column.expires": {
+    "defaultMessage": "Expira"
+  },
+  "object.delete": {
+    "defaultMessage": "Eliminar {object}"
+  },
+  "notification.object-deleted": {
+    "defaultMessage": "{object} ha sido eliminado"
+  },
+  "cancel": {
+    "defaultMessage": "Cancelar"
+  },
+  "user.set-password": {
+    "defaultMessage": "Establecer Contraseña"
+  },
+  "nginx-config.placeholder": {
+    "defaultMessage": "# ¡Introduce aquí tu configuración personalizada de Nginx bajo tu propio riesgo!"
+  },
+  "access-list.auth-count": {
+    "defaultMessage": "{count} {count, plural, one {Usuario} other {Usuarios}}"
+  },
+  "password.hide": {
+    "defaultMessage": "Ocultar Contraseña"
+  },
+  "settings.default-site.html.placeholder": {
+    "defaultMessage": "<!-- Introduce aquí tu contenido HTML personalizado -->"
+  },
+  "notification.object-renewed": {
+    "defaultMessage": "{object} ha sido renovado"
+  },
+  "object.event.deleted": {
+    "defaultMessage": "{object} Eliminado"
+  },
+  "error.invalid-auth": {
+    "defaultMessage": "Correo electrónico o contraseña no válidos"
+  },
+  "domains.force-ssl": {
+    "defaultMessage": "Forzar SSL"
+  },
+  "domains.hsts-subdomains": {
+    "defaultMessage": "HSTS en Subdominios"
+  },
+  "host.flags.protocols": {
+    "defaultMessage": "Protocolos"
+  },
+  "action.download": {
+    "defaultMessage": "Descargar"
+  },
+  "certificates.dns.warning": {
+    "defaultMessage": "Esta sección requiere algunos conocimientos sobre Certbot y sus plugins DNS. Consulta la documentación de los plugins respectivos."
+  },
+  "certificates.request.title": {
+    "defaultMessage": "Solicitar un nuevo Certificado"
+  },
+  "password": {
+    "defaultMessage": "Contraseña"
+  },
+  "notification.object-saved": {
+    "defaultMessage": "{object} ha sido guardado"
+  },
+  "setting": {
+    "defaultMessage": "Configuración"
+  },
+  "object.empty": {
+    "defaultMessage": "No hay {objects}"
+  },
+  "lets-encrypt-via-http": {
+    "defaultMessage": "Let's Encrypt vía HTTP"
+  },
+  "domains.hsts-enabled": {
+    "defaultMessage": "HSTS Habilitado"
+  },
+  "error.maximum": {
+    "defaultMessage": "El máximo es {max}"
+  },
+  "user.switch-light": {
+    "defaultMessage": "Cambiar a modo Claro"
+  },
+  "action.edit": {
+    "defaultMessage": "Editar"
+  },
+  "access-list.subtitle": {
+    "defaultMessage": "{users} {users, plural, one {Usuario} other {Usuarios}}, {rules} {rules, plural, one {Regla} other {Reglas}} - Creado: {date}"
+  },
+  "action.enable": {
+    "defaultMessage": "Habilitar"
+  },
+  "error.access.duplicate-usernames": {
+    "defaultMessage": "Los nombres de usuario de autorización deben ser únicos"
+  },
+  "notfound.action": {
+    "defaultMessage": "Llévame al inicio"
+  },
+  "notification.object-disabled": {
+    "defaultMessage": "{object} ha sido deshabilitado"
+  },
+  "user.logout": {
+    "defaultMessage": "Cerrar Sesión"
+  },
+  "stream.incoming-port": {
+    "defaultMessage": "Puerto de Entrada"
+  },
+  "certificates.http.reachability-ok": {
+    "defaultMessage": "Tu servidor es accesible y debería ser posible crear certificados."
+  },
+  "access-list.help-rules-last": {
+    "defaultMessage": "Cuando exista al menos 1 regla, esta regla de denegar todo se añadirá al final"
+  },
+  "action.view-details": {
+    "defaultMessage": "Ver Detalles"
+  },
+  "notification.object-enabled": {
+    "defaultMessage": "{object} ha sido habilitado"
+  },
+  "object.actions-title": {
+    "defaultMessage": "{object} #{id}"
+  },
+  "username": {
+    "defaultMessage": "Nombre de Usuario"
+  },
+  "user.nickname": {
+    "defaultMessage": "Apodo"
+  },
+  "column.name": {
+    "defaultMessage": "Nombre"
+  },
+  "column.roles": {
+    "defaultMessage": "Roles"
+  },
+  "footer.github-fork": {
+    "defaultMessage": "Bifúrcame en Github"
+  },
+  "object.event.updated": {
+    "defaultMessage": "{object} Actualizado"
+  },
+  "certificates.dns.credentials-warning": {
+    "defaultMessage": "¡Estos datos se almacenarán como texto plano en la base de datos y en un archivo!"
+  },
+  "access-list.satisfy-any": {
+    "defaultMessage": "Satisfacer Cualquiera"
+  },
+  "dead-hosts.count": {
+    "defaultMessage": "{count} {count, plural, one {Host 404} other {Hosts 404}}"
+  },
+  "certificates.dns.propagation-seconds": {
+    "defaultMessage": "Segundos de Propagación"
+  },
+  "error.min-character-length": {
+    "defaultMessage": "La longitud mínima es {min} caracter{min, plural, one {} other {es}}"
+  },
+  "domain-names.max": {
+    "defaultMessage": "{count} nombres de dominio como máximo"
+  },
+  "object.delete.content": {
+    "defaultMessage": "¿Estás seguro de que quieres eliminar este {object}?"
+  },
+  "column.rules": {
+    "defaultMessage": "Reglas"
+  },
+  "error.required": {
+    "defaultMessage": "Este campo es obligatorio"
+  },
+  "certificate": {
+    "defaultMessage": "Certificado"
+  },
+  "public": {
+    "defaultMessage": "Público"
+  },
+  "domains.use-dns": {
+    "defaultMessage": "Usar Desafío DNS"
+  },
+  "error.max-character-length": {
+    "defaultMessage": "La longitud máxima es {max} caracter{max, plural, one {} other {es}}"
+  },
+  "permissions.view": {
+    "defaultMessage": "Solo Ver"
+  },
+  "expires.on": {
+    "defaultMessage": "Expira: {date}"
+  },
+  "setup.title": {
+    "defaultMessage": "¡Bienvenido!"
+  },
+  "certificates.http.reachability-failed-to-check": {
+    "defaultMessage": "No se pudo verificar la accesibilidad debido a un error de comunicación con site24x7.com."
+  },
+  "certificates.http.warning": {
+    "defaultMessage": "Estos dominios ya deben estar configurados para apuntar a esta instalación."
+  },
+  "certificate.custom-certificate-key": {
+    "defaultMessage": "Clave del Certificado"
+  },
+  "empty-subtitle": {
+    "defaultMessage": "¿Por qué no creas uno?"
+  },
+  "dead-hosts": {
+    "defaultMessage": "Hosts 404"
+  },
+  "lets-encrypt": {
+    "defaultMessage": "Let's Encrypt"
+  },
+  "email-address": {
+    "defaultMessage": "Dirección de correo electrónico"
+  },
+  "domain-names": {
+    "defaultMessage": "Nombres de Dominio"
+  },
+  "user.full-name": {
+    "defaultMessage": "Nombre Completo"
+  },
+  "column.incoming-port": {
+    "defaultMessage": "Puerto de Entrada"
+  },
+  "column.http-code": {
+    "defaultMessage": "Acceso"
+  },
+  "certificate.not-in-use": {
+    "defaultMessage": "Sin Usar"
+  },
+  "action.disable": {
+    "defaultMessage": "Deshabilitar"
+  },
+  "redirection-hosts": {
+    "defaultMessage": "Hosts de Redirección"
+  },
+  "streams.udp": {
+    "defaultMessage": "UDP"
+  },
+  "role.admin": {
+    "defaultMessage": "Administrador"
+  },
+  "nginx-config.label": {
+    "defaultMessage": "Configuración Personalizada de Nginx"
+  },
+  "disabled": {
+    "defaultMessage": "Deshabilitado"
+  },
+  "domain-names.wildcards-not-permitted": {
+    "defaultMessage": "No se permiten comodines para este tipo"
+  },
+  "online": {
+    "defaultMessage": "Conectado"
+  },
+  "access-list.public": {
+    "defaultMessage": "Accesible Públicamente"
+  },
+  "action.renew": {
+    "defaultMessage": "Renovar"
+  },
+  "object.add": {
+    "defaultMessage": "Añadir {object}"
+  },
+  "certificates.dns.credentials-note": {
+    "defaultMessage": "Este plugin requiere un archivo de configuración que contenga un token de API u otras credenciales para tu proveedor"
+  },
+  "error.invalid-email": {
+    "defaultMessage": "Dirección de correo electrónico no válida"
+  },
+  "notification.error": {
+    "defaultMessage": "Error"
+  },
+  "error.invalid-domain": {
+    "defaultMessage": "Dominio no válido: {domain}"
+  },
+  "user.set-permissions": {
+    "defaultMessage": "Establecer Permisos para {name}"
+  },
+  "certificate.none.subtitle": {
+    "defaultMessage": "Sin certificado asignado"
+  },
+  "object.event.enabled": {
+    "defaultMessage": "{object} Habilitado"
+  },
+  "login.title": {
+    "defaultMessage": "Inicia sesión en tu cuenta"
+  },
+  "access-list.access-count": {
+    "defaultMessage": "{count} {count, plural, one {Regla} other {Reglas}}"
+  },
+  "certificate.custom-intermediate": {
+    "defaultMessage": "Certificado Intermedio"
+  },
+  "error.access.at-least-one": {
+    "defaultMessage": "Se requiere al menos una Autorización o una Regla de Acceso"
+  },
+  "stream": {
+    "defaultMessage": "Stream"
+  },
+  "action.close": {
+    "defaultMessage": "Cerrar"
+  },
+  "certificates.http.test-results": {
+    "defaultMessage": "Resultados de la Prueba"
+  },
+  "certificates.dns.provider": {
+    "defaultMessage": "Proveedor DNS"
+  },
+  "object.event.renewed": {
+    "defaultMessage": "{object} Renovado"
+  },
+  "lets-encrypt-via-dns": {
+    "defaultMessage": "Let's Encrypt vía DNS"
+  },
+  "certificates.http.reachability-not-resolved": {
+    "defaultMessage": "No hay ningún servidor disponible en este dominio. Asegúrate de que tu dominio existe y apunta a la IP donde se está ejecutando tu instancia de NPM y, si es necesario, que el puerto 80 esté redirigido en tu router."
+  },
+  "no-permission-error": {
+    "defaultMessage": "No tienes acceso para ver esto."
+  },
+  "column.satisfy-all": {
+    "defaultMessage": "Todo"
+  },
+  "host.forward-scheme": {
+    "defaultMessage": "Esquema"
+  },
+  "domains.http2-support": {
+    "defaultMessage": "Soporte HTTP/2"
+  },
+  "action.permissions": {
+    "defaultMessage": "Permisos"
+  },
+  "loading": {
+    "defaultMessage": "Cargando…"
+  },
+  "object.event.disabled": {
+    "defaultMessage": "{object} Deshabilitado"
+  },
+  "dashboard": {
+    "defaultMessage": "Panel de Control"
+  },
+  "sign-in": {
+    "defaultMessage": "Iniciar Sesión"
+  },
+  "permissions.manage": {
+    "defaultMessage": "Gestionar"
+  },
+  "user.new-password": {
+    "defaultMessage": "Nueva Contraseña"
+  },
+  "stream.forward-host": {
+    "defaultMessage": "Host de Reenvío"
+  },
+  "test": {
+    "defaultMessage": "Probar"
+  },
+  "column.authorization": {
+    "defaultMessage": "Autorización"
+  },
+  "column.satisfy-any": {
+    "defaultMessage": "Cualquiera"
+  },
+  "host.flags.cache-assets": {
+    "defaultMessage": "Cachear Recursos"
+  },
+  "access-lists": {
+    "defaultMessage": "Listas de Acceso"
+  },
+  "role.standard-user": {
+    "defaultMessage": "Usuario Estándar"
+  },
+  "certificates.http.reachability-other": {
+    "defaultMessage": "Se encontró un servidor en este dominio pero devolvió un código de estado inesperado {code}. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM."
+  },
+  "column.status": {
+    "defaultMessage": "Estado"
+  },
+  "error.minimum": {
+    "defaultMessage": "El mínimo es {min}"
+  },
+  "domain-names.wildcards-not-supported": {
+    "defaultMessage": "No se admiten comodines para esta CA"
+  },
+  "access-list.pass-auth": {
+    "defaultMessage": "Pasar Autenticación al Upstream"
+  }
+}

+ 4 - 1
frontend/src/locale/src/lang-list.json

@@ -1,5 +1,8 @@
 {
 {
 	"locale-en-US": {
 	"locale-en-US": {
 		"defaultMessage": "English"
 		"defaultMessage": "English"
-	}
+	},
+ "locale-es-ES": {
+    "defaultMessage": "Español"
+  }
 }
 }