This is an automated email from the ASF dual-hosted git repository.
young pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git
The following commit(s) were added to refs/heads/master by this push:
new cf9444e18 feat(i18n): add Spanish (es) translations for common.json
(#3182)
cf9444e18 is described below
commit cf9444e18075a5219318b293ae4107f93fce582b
Author: Ajinkya Pathak <[email protected]>
AuthorDate: Fri Aug 29 13:53:56 2025 +0530
feat(i18n): add Spanish (es) translations for common.json (#3182)
---
src/components/Header/LanguageMenu.tsx | 1 +
src/config/i18n.ts | 4 +
src/locales/es/common.json | 368 +++++++++++++++++++++++++++++++++
vite.config.ts | 2 +-
4 files changed, 374 insertions(+), 1 deletion(-)
diff --git a/src/components/Header/LanguageMenu.tsx
b/src/components/Header/LanguageMenu.tsx
index 6b7602560..44b7a4d61 100644
--- a/src/components/Header/LanguageMenu.tsx
+++ b/src/components/Header/LanguageMenu.tsx
@@ -25,6 +25,7 @@ const LangMap: Record<keyof Resources, string> = {
en: 'English',
de: 'Deutsch',
zh: '中文',
+ es: 'Español',
};
const TranslationProgress = ({ lang }: { lang: string }) => {
diff --git a/src/config/i18n.ts b/src/config/i18n.ts
index 4c061d032..e14746e52 100644
--- a/src/config/i18n.ts
+++ b/src/config/i18n.ts
@@ -20,6 +20,7 @@ import { initReactI18next } from 'react-i18next';
import de_common from '@/locales/de/common.json';
import en_common from '@/locales/en/common.json';
import zh_common from '@/locales/zh/common.json';
+import es_common from '@/locales/es/common.json';
export const resources = {
en: {
@@ -31,6 +32,9 @@ export const resources = {
zh: {
common: zh_common,
},
+ es: {
+ common: es_common,
+ },
} as const;
export type Resources = typeof resources;
diff --git a/src/locales/es/common.json b/src/locales/es/common.json
new file mode 100644
index 000000000..1af5a22b8
--- /dev/null
+++ b/src/locales/es/common.json
@@ -0,0 +1,368 @@
+{
+ "apisix": {
+ "dashboard": "Panel de APISIX",
+ "logo": "Logo de APISIX"
+ },
+ "consumerGroups": {
+ "singular": "Grupo de Consumidores"
+ },
+ "consumers": {
+ "singular": "Consumidor"
+ },
+ "credentials": {
+ "singular": "Credencial"
+ },
+ "form": {
+ "basic": {
+ "desc": "Descripción",
+ "labels": {
+ "errorFormat": "El formato de la etiqueta es incorrecto, debe ser
`clave:valor`",
+ "key": "Clave",
+ "placeholder": "Introduce texto como `clave:valor`, luego presiona
Enter o fuera de foco",
+ "title": "Etiquetas",
+ "value": "Valor"
+ },
+ "name": "Nombre",
+ "status": "Estado",
+ "statusOption": {
+ "0": "Deshabilitado",
+ "1": "Habilitado"
+ },
+ "title": "Información Básica"
+ },
+ "btn": {
+ "add": "Añadir",
+ "addARow": "Añadir una fila",
+ "cancel": "Cancelar",
+ "delete": "Eliminar",
+ "edit": "Editar",
+ "save": "Guardar",
+ "upload": "Subir",
+ "view": "Ver"
+ },
+ "consumers": {
+ "groupId": "ID de Grupo",
+ "username": "Nombre de usuario"
+ },
+ "disabled": "Deshabilitado, haga clic en el interruptor para habilitar",
+ "general": {
+ "title": "General"
+ },
+ "info": {
+ "create_time": "Creado en",
+ "id": "ID",
+ "title": "Información",
+ "update_time": "Actualizado en"
+ },
+ "json": {
+ "parseError": "El formato JSON no es válido"
+ },
+ "plugins": {
+ "addPlugin": "Añadir Plugin",
+ "configId": "ID de Configuración de Plugin",
+ "editPlugin": "Editar Plugin",
+ "label": "Plugins",
+ "searchForSelectedPlugins": "Buscar Plugins Seleccionados",
+ "selectPlugins": {
+ "title": "Seleccionar Plugins"
+ },
+ "viewPlugin": "Ver Plugin"
+ },
+ "protos": {
+ "content": "Contenido",
+ "contentPlaceholder": "Pegar o subir archivo {{fileTypes}}"
+ },
+ "routes": {
+ "enableWebsocket": "Habilitar WebSocket",
+ "filterFunc": "Función de Filtro",
+ "host": "Host",
+ "hosts": "Hosts",
+ "matchRules": "Reglas de Coincidencia",
+ "methods": "Métodos HTTP",
+ "priority": "Prioridad",
+ "remoteAddr": "Dirección Remota",
+ "remoteAddrs": "Direcciones Remotas",
+ "service": "Servicio",
+ "uri": "URI",
+ "uris": "URIs",
+ "vars": "Variables"
+ },
+ "search": "Buscar",
+ "secrets": {
+ "aws": {
+ "access_key_id": "ID de Clave de Acceso",
+ "endpoint_url": "URL de Endpoint",
+ "region": "Región",
+ "secret_access_key": "Clave de Acceso Secreta",
+ "session_token": "Token de Sesión"
+ },
+ "gcp": {
+ "auth": "Autenticación",
+ "auth_config": "Configuración de Autenticación",
+ "auth_file": "Archivo de Autenticación",
+ "client_email": "Correo del Cliente",
+ "entries_uri": "URI de Entradas",
+ "private_key": "Clave Privada",
+ "project_id": "ID de Proyecto",
+ "scope": "Alcance",
+ "ssl_verify": "Verificación SSL",
+ "token_uri": "URI de Token"
+ },
+ "manager": "Gestor de Secretos",
+ "managerConfig": "Configuración del Gestor",
+ "title": "Configuración de Secretos",
+ "vault": {
+ "namespace": "Espacio de Nombres",
+ "prefix": "Prefijo",
+ "token": "Token",
+ "uri": "URI"
+ }
+ },
+ "services": {
+ "enableWebsocket": "Habilitar WebSocket",
+ "hosts": "Hosts",
+ "script": "Script",
+ "settings": "Configuración del Servicio"
+ },
+ "ssls": {
+ "cert": "Certificado",
+ "cert_key_list": {
+ "add": "Añadir un par",
+ "delete": "Eliminar el par",
+ "title": "Certificados y Claves"
+ },
+ "client": {
+ "ca": "Certificado CA del Cliente",
+ "depth": "Profundidad de Verificación",
+ "skipMtlsUriRegex": "Omitir mTLS URI Regex",
+ "title": "Cliente"
+ },
+ "key": "Clave Privada",
+ "sni": "SNI",
+ "snis": "SNIs",
+ "ssl_protocols": "Protocolos SSL",
+ "type": "Tipo de Certificado"
+ },
+ "streamRoutes": {
+ "protocol": {
+ "conf": "Configuración",
+ "logger": "Logger",
+ "name": "Nombre del Protocolo",
+ "superiorId": "ID Superior",
+ "title": "Información del Protocolo"
+ },
+ "remoteAddr": "Dirección Remota",
+ "server": "Servidor",
+ "serverAddr": "Dirección del Servidor",
+ "serverPort": "Puerto del Servidor",
+ "sni": "SNI"
+ },
+ "tagsInput": {
+ "placeholder": "Introduce texto, luego presiona Enter o fuera de foco"
+ },
+ "upload": {
+ "fileOverSize": "el tamaño del archivo es demasiado grande",
+ "readError": "error de lectura del archivo:"
+ },
+ "upstreams": {
+ "checks": {
+ "active": {
+ "concurrency": "Concurrencia",
+ "healthy": {
+ "http_statuses": "Estados HTTP",
+ "interval": "Intervalo",
+ "successes": "Éxitos",
+ "title": "Saludable"
+ },
+ "host": "Host",
+ "http_path": "Ruta HTTP",
+ "http_request_headers": "Cabeceras de Solicitud HTTP",
+ "https_verify_certificate": "Verificar Certificado HTTPS",
+ "port": "Puerto",
+ "timeout": "Tiempo de Espera",
+ "title": "Activo",
+ "type": "Tipo",
+ "unhealthy": {
+ "http_failures": "Fallos HTTP",
+ "http_statuses": "Estados HTTP",
+ "interval": "Intervalo",
+ "tcp_failures": "Fallos TCP",
+ "timeouts": "Tiempos de Espera",
+ "title": "No Saludable"
+ }
+ },
+ "passive": {
+ "healthy": {
+ "http_statuses": "Estados HTTP",
+ "successes": "Éxitos",
+ "title": "Saludable"
+ },
+ "title": "Pasivo",
+ "type": "Tipo",
+ "unhealthy": {
+ "http_failures": "Fallos HTTP",
+ "http_statuses": "Estados HTTP",
+ "tcp_failures": "Fallos TCP",
+ "timeouts": "Tiempos de Espera",
+ "title": "No Saludable"
+ }
+ },
+ "title": "Verificaciones de Salud"
+ },
+ "connectionConfiguration": "Configuración de Conexión",
+ "discoveryArgs": {
+ "title": "Argumentos de Descubrimiento"
+ },
+ "discoveryType": {
+ "title": "Tipo de Descubrimiento"
+ },
+ "findUpstreamFrom": "Encontrar Upstream desde",
+ "hashOn": "Hash en",
+ "hashOnDesc": "Esto será válido cuando `type` sea `chash`",
+ "identifier": "Identificador de Upstream",
+ "inline": "Configuración Inline de Upstream",
+ "keepalivePool": {
+ "idleTimeout": "Tiempo de Inactividad",
+ "requests": "Solicitudes",
+ "size": "Tamaño",
+ "title": "Pool Keepalive"
+ },
+ "key": "Clave",
+ "keyDesc": "Esto será válido cuando `type` sea `chash`",
+ "loadBalancing": "Balanceo de Carga",
+ "nodes": {
+ "action": {
+ "title": "Acción"
+ },
+ "add": "Añadir Nodo",
+ "host": {
+ "title": "Host"
+ },
+ "port": {
+ "title": "Puerto"
+ },
+ "priority": {
+ "title": "Prioridad"
+ },
+ "title": "Nodos",
+ "weight": {
+ "title": "Peso"
+ }
+ },
+ "passHost": "Pasar Host",
+ "retries": "Reintentos",
+ "retry": "Reintentar",
+ "retryTimeout": "Tiempo de espera de reintento",
+ "scheme": "Esquema",
+ "serviceDiscovery": {
+ "serviceName": "Nombre del Servicio",
+ "title": "Descubrimiento de Servicios"
+ },
+ "serviceId": "ID de Servicio",
+ "serviceName": {
+ "title": "Nombre del Servicio"
+ },
+ "timeout": {
+ "connect": "Conectar",
+ "read": "Leer",
+ "send": "Enviar",
+ "title": "Tiempo de Espera"
+ },
+ "title": "Upstream",
+ "tls": {
+ "clientCert": "Certificado del Cliente",
+ "clientCertId": "ID del Certificado del Cliente",
+ "clientCertKeyPair": "Par Certificado/Clave del Cliente",
+ "clientKey": "Clave del Cliente",
+ "title": "TLS",
+ "verify": "Verificar"
+ },
+ "type": "Tipo",
+ "updateTime": "Hora de Actualización",
+ "upstreamHost": "Host de Upstream",
+ "upstreamHostDesc": "Configura esto cuando `pass_host` sea `rewrite`",
+ "upstreamId": "ID de Upstream"
+ }
+ },
+ "globalRules": {
+ "singular": "Regla Global"
+ },
+ "help-us-translate": "¡Ayúdanos a Traducir!",
+ "info": {
+ "add": {
+ "success": "Añadido {{name}} con éxito",
+ "title": "Añadir {{name}}"
+ },
+ "delete": {
+ "content": "¿Desea eliminar el {{name}}?",
+ "success": "Eliminado {{name}} con éxito",
+ "title": "Eliminar {{name}}"
+ },
+ "detail": {
+ "title": "Detalle de {{name}}"
+ },
+ "edit": {
+ "success": "Editado {{name}} con éxito",
+ "title": "Editar {{name}}"
+ }
+ },
+ "mark": {
+ "question": "¿?"
+ },
+ "noData": "Sin Datos",
+ "or": "O",
+ "pluginConfigs": {
+ "singular": "Configuración de Plugin"
+ },
+ "pluginMetadata": {
+ "search": "Buscar Metadatos de Plugin",
+ "singular": "Metadatos de Plugin"
+ },
+ "protos": {
+ "singular": "Proto"
+ },
+ "routes": {
+ "singular": "Ruta"
+ },
+ "seconds": "Segundos",
+ "secrets": {
+ "singular": "Secreto"
+ },
+ "services": {
+ "singular": "Servicio"
+ },
+ "settings": {
+ "adminKey": "Clave de Administrador",
+ "title": "Configuraciones",
+ "ui-commit-sha": "SHA de Commit de la UI"
+ },
+ "sources": {
+ "consumerGroups": "Grupos de Consumidores",
+ "consumers": "Consumidores",
+ "credentials": "Credenciales",
+ "globalRules": "Reglas Globales",
+ "pluginConfigs": "Configuraciones de Plugins",
+ "pluginMetadata": "Metadatos de Plugins",
+ "protos": "Protos",
+ "routes": "Rutas",
+ "secrets": "Secretos",
+ "services": "Servicios",
+ "ssls": "SSLs",
+ "streamRoutes": "Rutas de Stream",
+ "upstreams": "Upstreams"
+ },
+ "ssls": {
+ "singular": "SSL"
+ },
+ "streamRoutes": {
+ "singular": "Ruta de Stream"
+ },
+ "table": {
+ "actions": "Acciones",
+ "disabled": "Deshabilitado",
+ "enabled": "Habilitado"
+ },
+ "upstreams": {
+ "singular": "Upstream"
+ }
+}
diff --git a/vite.config.ts b/vite.config.ts
index e3377ab56..6aab2b25a 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -76,7 +76,7 @@ export default defineConfig({
semicolons: false,
}),
i18nProgress({
- langs: ['en', 'de', 'zh'],
+ langs: ['en', 'es', 'de', 'zh'],
baseLang: 'en',
getTranslationDir: (lang) => `./src/locales/${lang}`,
}),