From fc1a001d0995dd819c548dc8743833c3dc627f4b Mon Sep 17 00:00:00 2001 From: Oscar Isaac Tinajero Maldonado Date: Wed, 4 Feb 2026 20:21:13 -0600 Subject: [PATCH 1/6] The Spanish translation has been improved. --- src/translate/languages/es-ES.json | 295 +++++++++++++++-------------- 1 file changed, 157 insertions(+), 138 deletions(-) diff --git a/src/translate/languages/es-ES.json b/src/translate/languages/es-ES.json index 1dc881f..003e822 100644 --- a/src/translate/languages/es-ES.json +++ b/src/translate/languages/es-ES.json @@ -45,10 +45,29 @@ "french": "Francés" } }, + "chat": { + "media": { + "attach": "Adjuntar archivo", + "document": "Documento", + "photosAndVideos": "Fotos y Vídeos", + "errors": { + "audioSize": "El tamaño del Audio debe ser menor de 16 MB", + "imageSize": "El tamaño de la Imagen debe ser menor de 5 MB", + "videoSize": "El tamaño del vídeo debe ser menor de 16 MB", + "documentSize": "El tamaño del documento debe ser menor de 100 MB", + "unsupportedType": "Tipo de Archivo no compatible" + }, + "selectedMedia": { + "imageAlt": "Imagen seleccionada", + "file": "Archivo", + "selectedFile": "Archivo seleccionado" + } + } + }, "sidebar": { - "dashboard": "Visión General", + "dashboard": "Dashboard", "configurations": "Configuraciones", - "settings": "Comportamiento", + "settings": "Ajustes", "proxy": "Proxy", "events": "Eventos", "webhook": "Webhook", @@ -73,7 +92,7 @@ "instance": { "created": "Instancia creada con éxito", "deleted": "Instancia eliminada con éxito", - "error": "Ocurrió un error al crear la instancia" + "error": "Se produjo un error al crear la instancia" } }, "login": { @@ -88,7 +107,7 @@ "invalidCredentials": "Credenciales inválidas" }, "button": { - "login": "Conectar" + "login": "Login" } }, "instance": { @@ -138,10 +157,10 @@ } }, "settings": { - "title": "Comportamiento", + "title": "Ajustes", "toast": { - "success": "Comportamiento aplicado con éxito", - "error": "Ocurrió un error al aplicar el comportamiento" + "success": "Configuración establecida correctamente", + "error": "Se produjo un error al aplicar la configuración" }, "form": { "rejectCall": { @@ -166,7 +185,7 @@ }, "syncFullHistory": { "label": "Sincronizar Historial Completo", - "description": "Sincronizar todo el historial al leer el Código QR" + "description": "Sincronizar todo el historial de chat al escanear el código QR" }, "readStatus": { "label": "Ver Estado", @@ -181,8 +200,8 @@ "proxy": { "title": "Proxy", "toast": { - "success": "Proxy aplicado con éxito", - "error": "Ocurrió un error al aplicar el proxy" + "success": "Proxy configurado con éxito", + "error": "Se produjo un error al configurar el proxy" }, "form": { "enabled": { @@ -213,8 +232,8 @@ "webhook": { "title": "Webhook", "toast": { - "success": "Webhook aplicado con éxito", - "error": "Ocurrió un error al aplicar el webhook" + "success": "Webhook configurado con éxito", + "error": "Se produjo un error al configurar el webhook" }, "form": { "enabled": { @@ -244,8 +263,8 @@ "websocket": { "title": "WebSocket", "toast": { - "success": "WebSocket aplicado con éxito", - "error": "Ocurrió un error al aplicar el WebSocket" + "success": "WebSocket configurado con éxito", + "error": "Se produjo un error al configurar el WebSocket" }, "form": { "enabled": { @@ -264,13 +283,13 @@ "rabbitmq": { "title": "RabbitMQ", "toast": { - "success": "RabbitMQ aplicado con éxito", - "error": "Ocurrió un error al aplicar el RabbitMQ" + "success": "RabbitMQ configurado con éxito", + "error": "Se produjo un error al configurar RabbitMQ" }, "form": { "enabled": { "label": "Activo", - "description": "Activar o desactivar el RabbitMQ" + "description": "Activar o desactivar RabbitMQ" }, "events": { "label": "Eventos" @@ -284,13 +303,13 @@ "sqs": { "title": "SQS", "toast": { - "success": "SQS aplicado con éxito", - "error": "Ocurrió un error al aplicar el SQS" + "success": "SQS configurado con éxito", + "error": "Se produjo un error al configurar SQS" }, "form": { "enabled": { "label": "Activo", - "description": "Activar o desactivar el SQS" + "description": "Activar o desactivar SQS" }, "events": { "label": "Eventos" @@ -304,8 +323,8 @@ "chatwoot": { "title": "Chatwoot", "toast": { - "success": "Chatwoot aplicado con éxito", - "error": "Ocurrió un error al aplicar el Chatwoot" + "success": "Chatwoot configurado con éxito", + "error": "Se produjo un error al configurar Chatwoot" }, "form": { "enabled": { @@ -347,11 +366,11 @@ }, "importContacts": { "label": "Importar Contactos", - "description": "Importar contactos del libro de direcciones de WhatsApp al conectar el Código QR" + "description": "Importar contactos del directorio de WhatsApp al escanear el Código QR" }, "importMessages": { "label": "Importar Mensajes", - "description": "Importar mensajes de WhatsApp al conectar el Código QR" + "description": "Importar mensajes de WhatsApp al escanear el Código QR" }, "daysLimitImportMessages": { "label": "Límite de Días para Importación de Mensajes" @@ -394,7 +413,7 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { "update": "Typebot actualizado con éxito", @@ -402,13 +421,13 @@ "delete": "Typebot eliminado con éxito", "status": "Estado de Typebot actualizado con éxito" }, - "error": "Ocurrió un error al crear el Typebot" + "error": "Se produjo un error al configurar Typebot" }, "table": { "none": "Nada que mostrar" }, "form": { - "title": "Nuevo Typebot", + "title": "Nueva Instancia de Typebot", "examples": { "keywordFinish": "#FINISH", "unknownMessage": "Lo siento, no entendí. ¿Puedes intentar de nuevo?" @@ -423,46 +442,46 @@ "label": "Configuraciones de Typebot" }, "url": { - "label": "URL de la API de Typebot" + "label": "API URL de Typebot" }, "typebot": { "label": "Nombre Público de Typebot" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "typebotIdFallback": { - "label": "Fallback de Typebot" + "label": "Ruta Alternativa (Typebot Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -471,11 +490,11 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { - "label": "Detener bot por mí", + "label": "Detener el bot por mí", "description": "Pausar el bot cuando yo envíe un mensaje" }, "keepOpen": { @@ -483,7 +502,7 @@ "description": "Mantener el bot abierto después de que termine la conversación" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", @@ -547,23 +566,23 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { - "update": "OpenAI actualizado con éxito", - "create": "OpenAI creado con éxito", - "delete": "OpenAI eliminado con éxito", - "status": "Estado de OpenAI actualizado con éxito", + "update": "Instancia de OpenAI actualizada con éxito", + "create": "Instancia de OpenAI creada con éxito", + "delete": "Instancia de OpenAI eliminada con éxito", + "status": "Estado de la Instancia de OpenAI actualizada con éxito", "credentialsCreate": "Credenciales de OpenAI creadas con éxito", "credentialsDelete": "Credenciales de OpenAI eliminadas con éxito" }, - "error": "Ocurrió un error al crear el OpenAI" + "error": "Se produjo un error al crear la Instancia de OpenAI" }, "table": { "none": "Nada que mostrar" }, "form": { - "title": "Nuevo OpenAI", + "title": "Nueva Instancia de OpenAI", "examples": { "keywordFinish": "#FINISH", "unknownMessage": "Lo siento, no entendí. ¿Puedes intentar de nuevo?" @@ -610,40 +629,40 @@ "label": "Máximo de Tokens" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "openaiIdFallback": { - "label": "Fallback de OpenAI" + "label": "Ruta Alternativa (OpenAI Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -652,7 +671,7 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { @@ -668,7 +687,7 @@ "description": "Convertir mensajes de voz en texto" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", @@ -722,21 +741,21 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { - "update": "Dify actualizado con éxito", - "create": "Dify creado con éxito", - "delete": "Dify eliminado con éxito", - "status": "Estado de Dify actualizado con éxito" + "update": "Instancia de Dify actualizada con éxito", + "create": "Instancia de Dify creada con éxito", + "delete": "Instancia de Dify eliminada con éxito", + "status": "Estado de la Instancia de Dify actualizada con éxito" }, - "error": "Ocurrió un error al crear el Dify" + "error": "Se produjo un error al crear la Instancia de Dify" }, "table": { "none": "Nada que mostrar" }, "form": { - "title": "Nuevo Dify", + "title": "Nueva Instancia de Dify", "examples": { "keywordFinish": "#FINISH", "unknownMessage": "Lo siento, no entendí. ¿Puedes intentar de nuevo?" @@ -764,40 +783,40 @@ "label": "Clave API" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "difyIdFallback": { - "label": "Fallback de Dify" + "label": "Ruta Alternativa (Dify Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -806,7 +825,7 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { @@ -818,7 +837,7 @@ "description": "Mantener el bot abierto después de que termine la conversación" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", @@ -870,15 +889,15 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { - "update": "n8n actualizado con éxito", - "create": "n8n creado con éxito", - "delete": "n8n eliminado con éxito", - "status": "Estado de n8n actualizado con éxito" + "update": "Instancia de n8n actualizada con éxito", + "create": "Instancia de n8n creada con éxito", + "delete": "Instancia de n8n eliminada con éxito", + "status": "Estado de la Instancia de n8n actualizada con éxito" }, - "error": "Ocurrió un error al crear el chatbot n8n" + "error": "Se produjo un error al crear el chatbot con n8n" }, "table": { "none": "Nada que mostrar" @@ -896,7 +915,7 @@ "label": "Descripción" }, "n8nSettings": { - "label": "Configuraciones de n8n" + "label": "Configuración de n8n" }, "webhookUrl": { "label": "URL del Webhook" @@ -911,40 +930,40 @@ "label": "Basic Auth Password" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "n8nIdFallback": { - "label": "Fallback de n8n" + "label": "Ruta Alternativa (n8n Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -953,7 +972,7 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { @@ -965,7 +984,7 @@ "description": "Mantener el bot abierto después de que termine la conversación" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", @@ -1017,21 +1036,21 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { - "update": "EvoAI actualizado con éxito", - "create": "EvoAI creado con éxito", - "delete": "EvoAI eliminado con éxito", - "status": "Estado de EvoAI actualizado con éxito" + "update": "EvoAI actualizada con éxito", + "create": "EvoAI creada con éxito", + "delete": "EvoAI eliminada con éxito", + "status": "Estado de EvoAI actualizada con éxito" }, - "error": "Ocurrió un error al crear el chatbot EvoAI" + "error": "Se produjo un error al crear el chatbot con EvoAI" }, "table": { "none": "Nada que mostrar" }, "form": { - "title": "Nuevo chatbot EvoAI", + "title": "Nuevo chatbot con EvoAI", "examples": { "keywordFinish": "#FINISH", "unknownMessage": "Lo siento, no entendí. ¿Puedes intentar de nuevo?" @@ -1052,40 +1071,40 @@ "label": "API Key (Opcional)" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "evoaiIdFallback": { - "label": "Fallback de EvoAI" + "label": "Ruta Alternativa (EvoAI Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -1094,7 +1113,7 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { @@ -1106,7 +1125,7 @@ "description": "Mantener el bot abierto después de que termine la conversación" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", @@ -1158,7 +1177,7 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { "update": "Bot Evolution actualizado con éxito", @@ -1166,7 +1185,7 @@ "delete": "Bot Evolution eliminado con éxito", "status": "Estado de Bot Evolution actualizado con éxito" }, - "error": "Ocurrió un error al crear el Bot Evolution" + "error": "Se produjo un error al crear el Bot Evolution" }, "table": { "none": "Nada que mostrar" @@ -1193,40 +1212,40 @@ "label": "Clave API" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "botIdFallback": { - "label": "Fallback de Bot Evolution" + "label": "Ruta Alternativa (Bot Evolution Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -1235,7 +1254,7 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { @@ -1247,7 +1266,7 @@ "description": "Mantener el bot abierto después de que termine la conversación" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", @@ -1299,7 +1318,7 @@ "toast": { "defaultSettings": { "success": "Configuraciones predeterminadas aplicadas con éxito", - "error": "Ocurrió un error al aplicar las configuraciones predeterminadas" + "error": "Se produjo un error al aplicar las configuraciones predeterminadas" }, "success": { "update": "Flowise actualizado con éxito", @@ -1307,7 +1326,7 @@ "delete": "Flowise eliminado con éxito", "status": "Estado de Flowise actualizado con éxito" }, - "error": "Ocurrió un error al crear el Flowise" + "error": "Se produjo un error al crear el Flowise" }, "table": { "none": "Nada que mostrar" @@ -1334,40 +1353,40 @@ "label": "Clave API" }, "triggerSettings": { - "label": "Configuraciones de Disparador" + "label": "Configuraciones de Trigger" }, "triggerType": { - "label": "Tipo de Disparador", + "label": "Tipo de Trigger", "keyword": "Palabra clave", "all": "Todos", "advanced": "Avanzado", "none": "Ninguno" }, "triggerOperator": { - "label": "Operador de Disparador", + "label": "Operador de Trigger", "contains": "Contiene", "equals": "Igual", - "startsWith": "Comienza Con", - "endsWith": "Termina Con", + "startsWith": "Comienza con", + "endsWith": "Termina con", "regex": "Regex" }, "triggerValue": { - "label": "Disparador" + "label": "Trigger" }, "triggerConditions": { "label": "Condiciones" }, "flowiseIdFallback": { - "label": "Fallback de Flowise" + "label": "Ruta Alternativa (Flowise Fallback)" }, "generalSettings": { "label": "Configuraciones Generales" }, "expire": { - "label": "Expirar en minutos" + "label": "Expiración (en minutos)" }, "keywordFinish": { - "label": "Palabra clave de Finalización" + "label": "Palabra clave para Finalizar" }, "delayMessage": { "label": "Mensaje de Retraso Predeterminado" @@ -1376,7 +1395,7 @@ "label": "Mensaje Desconocido" }, "listeningFromMe": { - "label": "Escuchando de mí", + "label": "Escuchándome", "description": "Escuchar los mensajes enviados por mí en el bot" }, "stopBotFromMe": { @@ -1388,7 +1407,7 @@ "description": "Mantener el bot abierto después de que termine la conversación" }, "debounceTime": { - "label": "Tiempo de Debounce" + "label": "Tiempo de rebote (Debounce Time)" }, "splitMessages": { "label": "Dividir Mensajes", From 33f378e7989a8279709126c6e41dbb432b4cd76b Mon Sep 17 00:00:00 2001 From: Oscar Isaac Tinajero Maldonado Date: Wed, 4 Feb 2026 22:12:35 -0600 Subject: [PATCH 2/6] Using a translator in chat --- src/pages/instance/Chat/index.tsx | 12 +++++---- src/pages/instance/Chat/messages.tsx | 39 ++++++++++++++++------------ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/pages/instance/Chat/index.tsx b/src/pages/instance/Chat/index.tsx index a5584c4..0c5782f 100644 --- a/src/pages/instance/Chat/index.tsx +++ b/src/pages/instance/Chat/index.tsx @@ -1,4 +1,5 @@ import "./style.css"; +import { useTranslation } from "react-i18next"; import { User, MessageCircle, PlusIcon } from "lucide-react"; import { useCallback, useEffect, useRef, useState } from "react"; import { Link, useNavigate, useParams } from "react-router-dom"; @@ -28,6 +29,7 @@ const formatJid = (remoteJid: string): string => { }; function Chat() { + const { t } = useTranslation(); const isMD = useMediaQuery("(min-width: 768px)"); const lastMessageRef = useRef(null); const [textareaHeight] = useState("auto"); @@ -49,7 +51,7 @@ function Chat() { const chatMap = new Map(); // First add all chats from React Query - chats.forEach((chat) => chatMap.set(chat.remoteJid, chat)); + chats.forEach((chat: { remoteJid: any; }) => chatMap.set(chat.remoteJid, chat)); // Then add/update with real-time chats realtimeChats.forEach((chat) => { @@ -181,19 +183,19 @@ function Chat() {
-
Chat
+
{t("chat.title")}
- Contatos - Grupos + {t("chat.contacts")} + {t("chat.groups")}
-
Contatos
+
{t("chat.contacts")}
{chats?.map( (chat: ChatType) => chat.remoteJid.includes("@s.whatsapp.net") && ( diff --git a/src/pages/instance/Chat/messages.tsx b/src/pages/instance/Chat/messages.tsx index e7eee2a..0dce6cd 100644 --- a/src/pages/instance/Chat/messages.tsx +++ b/src/pages/instance/Chat/messages.tsx @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; + import { DropdownMenu, DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"; import { ArrowRightIcon, ChevronDownIcon, SparkleIcon, User, ZapIcon } from "lucide-react"; import { RefObject, useEffect, useMemo, useState } from "react"; @@ -33,6 +35,7 @@ type MessagesProps = { // Utility function to format dates like WhatsApp const formatDateSeparator = (date: Date): string => { + const { t } = useTranslation(); const today = new Date(); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); @@ -41,22 +44,22 @@ const formatDateSeparator = (date: Date): string => { // Check if it's today if (messageDate.toDateString() === today.toDateString()) { - return "Hoje"; + return t("chat.date.today"); } // Check if it's yesterday if (messageDate.toDateString() === yesterday.toDateString()) { - return "Ontem"; + return t("chat.date.yesterday"); } // Check if it's within the last week const daysDiff = Math.floor((today.getTime() - messageDate.getTime()) / (1000 * 60 * 60 * 24)); if (daysDiff < 7) { - return messageDate.toLocaleDateString("pt-BR", { weekday: "long" }); + return messageDate.toLocaleDateString(t("chat.date.location"), { weekday: "long" }); } // For older dates, show the full date - return messageDate.toLocaleDateString("pt-BR", { + return messageDate.toLocaleDateString(t("chat.date.location"), { day: "2-digit", month: "2-digit", year: "numeric", @@ -139,6 +142,8 @@ const getMessageText = (messageObj: any): string => { // Component to render different message types based on messageType const MessageContent = ({ message }: { message: Message }) => { + const { t } = useTranslation(); + const messageType = message.messageType as string; switch (messageType) { @@ -149,10 +154,10 @@ const MessageContent = ({ message }: { message: Message }) => {
👤
- Contact + {t("chat.contact")}
{contactMsg.displayName &&

{contactMsg.displayName}

} - {contactMsg.vcard &&

Contact card

} + {contactMsg.vcard &&

{t("chat.contactCart")}

}
); } @@ -163,7 +168,7 @@ const MessageContent = ({ message }: { message: Message }) => {
📍
- Location + {t("chat.messageType.location.title")}
{locationMsg.name &&

{locationMsg.name}

} {locationMsg.address &&

{locationMsg.address}

} @@ -173,7 +178,7 @@ const MessageContent = ({ message }: { message: Message }) => { target="_blank" rel="noopener noreferrer" className="text-primary hover:underline text-sm mt-1 inline-block"> - View on Maps + {t("chat.messageType.location.viewOnMaps")} )}
@@ -207,8 +212,8 @@ const MessageContent = ({ message }: { message: Message }) => { /> ) : (
-

Image couldn't be loaded

-

Missing base64 data and mediaUrl

+

{t("chat.messageType.image.notFound")}

+

{t("chat.media.missingData")}

)} {message.message.imageMessage?.caption &&

{message.message.imageMessage.caption}

} @@ -235,8 +240,8 @@ const MessageContent = ({ message }: { message: Message }) => { /> ) : (
-

Video couldn't be loaded

-

Missing base64 data and mediaUrl

+

{t("chat.messageType.video.notFound")}

+

{t("chat.media.missingData")}

)} {message.message.videoMessage?.caption &&

{message.message.videoMessage.caption}

} @@ -252,12 +257,12 @@ const MessageContent = ({ message }: { message: Message }) => { return audioSrc ? ( ) : (
-

Audio couldn't be loaded

-

Missing base64 data and mediaUrl

+

{t("chat.messageType.audio.notFound")}

+

{t("chat.media.missingData")}

); @@ -280,7 +285,7 @@ const MessageContent = ({ message }: { message: Message }) => { return (
- Unknown message type: {messageType} + {t("chat.messageType.unknownMessage")}: {messageType}
{JSON.stringify(message.message, null, 2)}
@@ -416,7 +421,7 @@ function Messages({ textareaRef, handleTextareaChange, textareaHeight, lastMessa const messageMap = new Map(); // First add all messages from React Query - messages.forEach((message) => messageMap.set(message.key.id, message)); + messages.forEach((message: { key: { id: any; }; }) => messageMap.set(message.key.id, message)); // Then add/update with real-time messages realtimeMessages.forEach((message) => { From 8d1fbbbbfed7c7008c9d45e609e0eacd540274aa Mon Sep 17 00:00:00 2001 From: Oscar Isaac Tinajero Maldonado Date: Wed, 4 Feb 2026 22:13:03 -0600 Subject: [PATCH 3/6] Translator update --- src/translate/languages/en-US.json | 73 ++++++++++++++++++++++- src/translate/languages/es-ES.json | 74 ++++++++++++++++++++++- src/translate/languages/fr-FR.json | 94 +++++++++++++++++++++++++++++- src/translate/languages/pt-BR.json | 93 ++++++++++++++++++++++++++++- 4 files changed, 330 insertions(+), 4 deletions(-) diff --git a/src/translate/languages/en-US.json b/src/translate/languages/en-US.json index f63d13e..3f5b89e 100644 --- a/src/translate/languages/en-US.json +++ b/src/translate/languages/en-US.json @@ -46,7 +46,78 @@ } }, "chat": { + "title": "Chat", + "contacts": "Contacts", + "contact": "Contact", + "contactCard": "Contact card", + "recent": "Recent", + "noInstance": "No instance selected", + "messageType": { + "location": { + "title": "Location", + "viewOnMaps": "View on Maps" + }, + "image": { + "notFound": "Unable to load the image" + }, + "video": { + "notFound": "Unable to load the video" + }, + "audio": { + "notFound": "Unable to load the audio", + "notSupported": "Your browser does not support audio files" + }, + "unknownMessage": "Unknown message type" + }, + "groups": "Groups", + "date": { + "today": "Today", + "yesterday": "Yesterday", + "location": "en-US" + }, + "message": { + "placeholder": "Type the message", + "options": "Options", + "reply": "Forward", + "delete": "Delete" + }, + "newChat": { + "title": "New Chat", + "description": "Start a new chat", + "contact": "Contact", + "placeholder": "Type the message", + "submit": "Send" + }, + "buttons": { + "preview": { + "title": "Preview", + "buttonPlaceholder": "Preview" + }, + "form": { + "validation": { + "titleRequired": "Title required", + "descriptionRequired": "Description required", + "buttonTypeRequired": "Button type required", + "buttonTextRequired": "Button text required", + "minimumOneButton": "At least one button", + "replyIdRequired": "Reply ID required", + "copyTextRequired": "Copy text required", + "urlRequired": "URL required", + "phoneRequired": "Phone number required" + } + } + }, + "toast": { + "error": "Error", + "recordingError": "Recording error", + "sendError": "Send error" + }, + "window": { + "expired": "Expired", + "expiresIn": "Expires in" + }, "media": { + "missingData": "Missing base64 data and/or media URL", "attach": "Attach file", "document": "Document", "photosAndVideos": "Photos and Videos", @@ -1436,4 +1507,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/translate/languages/es-ES.json b/src/translate/languages/es-ES.json index 003e822..ac8517a 100644 --- a/src/translate/languages/es-ES.json +++ b/src/translate/languages/es-ES.json @@ -46,7 +46,78 @@ } }, "chat": { + "title": "Chat", + "contacts": "Contactos", + "contact": "Contacto", + "contactCard": "Tarjeta de contacto", + "recent": "Reciente", + "noInstance": "No hay ninguna instancia seleccionada", + "messageType": { + "location": { + "title": "Localización", + "viewOnMaps": "Ver en Maps" + }, + "image": { + "notFound": "No fue posible cargar la imagen" + }, + "video": { + "notFound": "No fue posible cargar el vídeo" + }, + "audio": { + "notFound": "No fue posible cargar el audio", + "notSupported": "Tu navegador no soporta archivos de audio" + }, + "unknownMessage": "Tipo de mensaje desconocido" + }, + "groups": "Grupos", + "date": { + "today": "Hoy", + "yesterday": "Ayer", + "location": "es-MX" + }, + "message": { + "placeholder": "Escriba el mensaje", + "options": "Opciones", + "reply": "Reenviar", + "delete": "Eliminar" + }, + "newChat": { + "title": "Nuevo Chat", + "description": "Inicia un nuevo chat", + "contact": "Contacto", + "placeholder": "Escriba el mensaje", + "submit": "Enviar" + }, + "buttons": { + "preview": { + "title": "Previo", + "buttonPlaceholder": "Previo" + }, + "form": { + "validation": { + "titleRequired": "Título requerido", + "descriptionRequired": "Descripción requerida", + "buttonTypeRequired": "Tipo de botón requerido", + "buttonTextRequired": "Texto de botón requerido", + "minimumOneButton": "Mínimo un botón", + "replyIdRequired": "ID de respuesta requerido", + "copyTextRequired": "Copia de texto requerida", + "urlRequired": "URL requerida", + "phoneRequired": "Teléfono requerido" + } + } + }, + "toast": { + "error": "Error", + "recordingError": "Error de grabación", + "sendError": "Enviar error" + }, + "window": { + "expired": "Expirado", + "expiresIn": "Expira en" + }, "media": { + "missingData": "Faltan datos base64 y/o el media URL", "attach": "Adjuntar archivo", "document": "Documento", "photosAndVideos": "Fotos y Vídeos", @@ -66,6 +137,7 @@ }, "sidebar": { "dashboard": "Dashboard", + "chat": "Chat", "configurations": "Configuraciones", "settings": "Ajustes", "proxy": "Proxy", @@ -1435,4 +1507,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/translate/languages/fr-FR.json b/src/translate/languages/fr-FR.json index 7b36399..fddedfd 100644 --- a/src/translate/languages/fr-FR.json +++ b/src/translate/languages/fr-FR.json @@ -41,11 +41,103 @@ "label": "Langue", "english": "Anglais", "portuguese": "Portugais", + "spanish": "Espagnol", "french": "Français" } }, + "chat": { + "title": "Chat", + "contacts": "Contacts", + "contact": "Contact", + "contactCard": "Carte de contact", + "recent": "Récent", + "noInstance": "Aucune instance sélectionnée", + "messageType": { + "location": { + "title": "Localisation", + "viewOnMaps": "Voir sur Maps" + }, + "image": { + "notFound": "Impossible de charger l’image" + }, + "video": { + "notFound": "Impossible de charger la vidéo" + }, + "audio": { + "notFound": "Impossible de charger l’audio", + "notSupported": "Votre navigateur ne prend pas en charge les fichiers audio" + }, + "unknownMessage": "Type de message inconnu" + }, + "groups": "Groupes", + "date": { + "today": "Aujourd’hui", + "yesterday": "Hier", + "location": "fr-FR" + }, + "message": { + "placeholder": "Saisissez le message", + "options": "Options", + "reply": "Transférer", + "delete": "Supprimer" + }, + "newChat": { + "title": "Nouveau chat", + "description": "Démarrer un nouveau chat", + "contact": "Contact", + "placeholder": "Saisissez le message", + "submit": "Envoyer" + }, + "buttons": { + "preview": { + "title": "Aperçu", + "buttonPlaceholder": "Aperçu" + }, + "form": { + "validation": { + "titleRequired": "Titre requis", + "descriptionRequired": "Description requise", + "buttonTypeRequired": "Type de bouton requis", + "buttonTextRequired": "Texte du bouton requis", + "minimumOneButton": "Au moins un bouton", + "replyIdRequired": "ID de réponse requis", + "copyTextRequired": "Texte de copie requis", + "urlRequired": "URL requise", + "phoneRequired": "Numéro de téléphone requis" + } + } + }, + "toast": { + "error": "Erreur", + "recordingError": "Erreur d’enregistrement", + "sendError": "Erreur d’envoi" + }, + "window": { + "expired": "Expiré", + "expiresIn": "Expire dans" + }, + "media": { + "missingData": "Données base64 et/ou URL du média manquantes", + "attach": "Joindre un fichier", + "document": "Document", + "photosAndVideos": "Photos et vidéos", + "errors": { + "audioSize": "La taille de l’audio doit être inférieure à 16 Mo", + "imageSize": "La taille de l’image doit être inférieure à 5 Mo", + "videoSize": "La taille de la vidéo doit être inférieure à 16 Mo", + "documentSize": "La taille du document doit être inférieure à 100 Mo", + "unsupportedType": "Type de fichier non pris en charge" + }, + "selectedMedia": { + "imageAlt": "Image sélectionnée", + "file": "Fichier", + "selectedFile": "Fichier sélectionné" + } + } + }, "sidebar": { "dashboard": "Vue d'ensemble", + "chat": "Chat", "configurations": "Configurations", "settings": "Comportement", "proxy": "Proxy", @@ -1415,4 +1507,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/translate/languages/pt-BR.json b/src/translate/languages/pt-BR.json index 7943d44..367d3d8 100644 --- a/src/translate/languages/pt-BR.json +++ b/src/translate/languages/pt-BR.json @@ -45,8 +45,99 @@ "french": "Francês" } }, + "chat": { + "title": "Chat", + "contacts": "Contatos", + "contact": "Contato", + "contactCard": "Cartão de contato", + "recent": "Recente", + "noInstance": "Nenhuma instância selecionada", + "messageType": { + "location": { + "title": "Localização", + "viewOnMaps": "Ver no Maps" + }, + "image": { + "notFound": "Não foi possível carregar a imagem" + }, + "video": { + "notFound": "Não foi possível carregar o vídeo" + }, + "audio": { + "notFound": "Não foi possível carregar o áudio", + "notSupported": "Seu navegador não suporta arquivos de áudio" + }, + "unknownMessage": "Tipo de mensagem desconhecido" + }, + "groups": "Grupos", + "date": { + "today": "Hoje", + "yesterday": "Ontem", + "location": "pt-BR" + }, + "message": { + "placeholder": "Digite a mensagem", + "options": "Opções", + "reply": "Encaminhar", + "delete": "Excluir" + }, + "newChat": { + "title": "Novo chat", + "description": "Inicie um novo chat", + "contact": "Contato", + "placeholder": "Digite a mensagem", + "submit": "Enviar" + }, + "buttons": { + "preview": { + "title": "Pré-visualização", + "buttonPlaceholder": "Pré-visualização" + }, + "form": { + "validation": { + "titleRequired": "Título obrigatório", + "descriptionRequired": "Descrição obrigatória", + "buttonTypeRequired": "Tipo de botão obrigatório", + "buttonTextRequired": "Texto do botão obrigatório", + "minimumOneButton": "No mínimo um botão", + "replyIdRequired": "ID de resposta obrigatório", + "copyTextRequired": "Texto de cópia obrigatório", + "urlRequired": "URL obrigatória", + "phoneRequired": "Telefone obrigatório" + } + } + }, + "toast": { + "error": "Erro", + "recordingError": "Erro de gravação", + "sendError": "Erro ao enviar" + }, + "window": { + "expired": "Expirado", + "expiresIn": "Expira em" + }, + "media": { + "missingData": "Faltam dados base64 e/ou a URL da mídia", + "attach": "Anexar arquivo", + "document": "Documento", + "photosAndVideos": "Fotos e vídeos", + "errors": { + "audioSize": "O tamanho do áudio deve ser menor que 16 MB", + "imageSize": "O tamanho da imagem deve ser menor que 5 MB", + "videoSize": "O tamanho do vídeo deve ser menor que 16 MB", + "documentSize": "O tamanho do documento deve ser menor que 100 MB", + "unsupportedType": "Tipo de arquivo não compatível" + }, + "selectedMedia": { + "imageAlt": "Imagem selecionada", + "file": "Arquivo", + "selectedFile": "Arquivo selecionado" + } + } +}, "sidebar": { "dashboard": "Visão Geral", + "chat": "Chat", "configurations": "Configurações", "settings": "Comportamento", "proxy": "Proxy", @@ -1416,4 +1507,4 @@ } } } -} +} \ No newline at end of file From 632186fc4328a30caaaccbf57e0c58ba660ad18e Mon Sep 17 00:00:00 2001 From: OscarTinajero117 Date: Wed, 4 Feb 2026 23:36:10 -0600 Subject: [PATCH 4/6] The translation in the messages component has been corrected and the placeholders have been updated. --- src/pages/instance/Chat/messages.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/instance/Chat/messages.tsx b/src/pages/instance/Chat/messages.tsx index 0dce6cd..ac0fb49 100644 --- a/src/pages/instance/Chat/messages.tsx +++ b/src/pages/instance/Chat/messages.tsx @@ -34,8 +34,7 @@ type MessagesProps = { }; // Utility function to format dates like WhatsApp -const formatDateSeparator = (date: Date): string => { - const { t } = useTranslation(); +const formatDateSeparator = (date: Date, t: any): string => { const today = new Date(); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); @@ -294,6 +293,7 @@ const MessageContent = ({ message }: { message: Message }) => { }; function Messages({ textareaRef, handleTextareaChange, textareaHeight, lastMessageRef, scrollToBottom }: MessagesProps) { + const { t } = useTranslation(); const { instance } = useInstance(); const [messageText, setMessageText] = useState(""); const [isSending, setIsSending] = useState(false); @@ -528,7 +528,7 @@ function Messages({ textareaRef, handleTextareaChange, textareaHeight, lastMessa if (dateString !== currentDate) { if (currentGroup.length > 0) { grouped.push({ - date: formatDateSeparator(new Date(currentDate)), + date: formatDateSeparator(new Date(currentDate), t), messages: currentGroup, }); } @@ -541,7 +541,7 @@ function Messages({ textareaRef, handleTextareaChange, textareaHeight, lastMessa if (currentGroup.length > 0) { grouped.push({ - date: formatDateSeparator(new Date(currentDate)), + date: formatDateSeparator(new Date(currentDate), t), messages: currentGroup, }); } @@ -656,7 +656,7 @@ function Messages({ textareaRef, handleTextareaChange, textareaHeight, lastMessa
{instance && }