{
  "LoginPage": {
    "titleAccept": "Inicia sesión para aceptar",
    "titleWelcome": "Bienvenido de nuevo",
    "descAccept": "Inicia sesión y te llevaremos a la invitación.",
    "descWelcome": "Inicia sesión en tu cuenta",
    "emailLabel": "Correo electrónico",
    "emailPlaceholder": "you@example.com",
    "passwordLabel": "Contraseña",
    "forgotPassword": "¿Olvidaste tu contraseña?",
    "passwordPlaceholder": "Ingresa tu contraseña",
    "signingIn": "Iniciando sesión...",
    "signIn": "Iniciar sesión",
    "noAccount": "¿No tienes una cuenta?",
    "createAccount": "Crear cuenta",
    "linkExpired": "Ese enlace expiró. Para restablecer la contraseña, usa “¿Olvidaste tu contraseña?” y pide uno nuevo; si estabas confirmando tu correo, regístrate de nuevo.",
    "linkInvalid": "No se pudo iniciar sesión con ese enlace. Si estabas confirmando tu correo, es posible que ya esté verificado; inicia sesión abajo. Para restablecer la contraseña, pide un enlace nuevo y ábrelo en el mismo navegador desde el que lo solicitaste."
  },
  "Sidebar": {
    "title": "Plantilla de CRM para WhatsApp",
    "primaryNav": "Principal",
    "dashboard": "Panel",
    "inbox": "Bandeja de entrada",
    "notifications": "Notificaciones",
    "contacts": "Contactos",
    "pipelines": "Pipelines",
    "broadcasts": "Difusiones",
    "automations": "Automatizaciones",
    "flows": "Flujos",
    "aiAgents": "Agentes de IA",
    "settings": "Configuración",
    "beta": "Beta",
    "unreadConversations": "{count} {count, plural, =1 {conversación sin leer} other {conversaciones sin leer}}",
    "unreadNotifications": "{count} {count, plural, =1 {notificación sin leer} other {notificaciones sin leer}}",
    "roleOwner": "Propietario",
    "roleAdmin": "Administrador",
    "roleAgent": "Agente",
    "roleViewer": "Observador",
    "closeMenu": "Cerrar menú",
    "defaultUser": "Usuario",
    "defaultAvatar": "Avatar",
    "menuProfile": "Perfil",
    "menuSettings": "Configuración",
    "menuSignOut": "Cerrar sesión"
  },
  "Header": {
    "dashboard": "Panel",
    "inbox": "Bandeja de entrada",
    "notifications": "Notificaciones",
    "contacts": "Contactos",
    "pipelines": "Pipelines",
    "broadcasts": "Difusiones",
    "automations": "Automatizaciones",
    "settings": "Configuración",
    "openMenu": "Abrir menú",
    "openAccountMenu": "Abrir menú de la cuenta",
    "defaultUser": "Usuario",
    "defaultAvatar": "Avatar",
    "menuProfile": "Perfil",
    "menuSettings": "Configuración",
    "menuSignOut": "Cerrar sesión"
  },
  "ModeToggle": {
    "switchMode": "Cambiar al modo {mode}"
  },
  "AccountAccess": {
    "unlinkedTitle": "Este usuario no está vinculado a una cuenta",
    "unlinkedBody": "Nada de lo que cambies se guardará mientras esto no se resuelva: la base de datos rechaza toda escritura de un usuario sin cuenta ni rol. Si te invitaron a un equipo, pide al propietario que reenvíe la invitación. En una instalación propia, verifica que la migración de bootstrap de la cuenta se haya ejecutado para este usuario.",
    "errorTitle": "No se pudieron cargar tus permisos",
    "errorBody": "El rol de tu cuenta no se cargó, así que toda acción se trata como de solo lectura y los cambios no se guardarán. Revisa tu conexión e inténtalo de nuevo.",
    "retry": "Reintentar"
  },
  "Dashboard": {
    "page": {
      "title": "Panel",
      "description": "Métricas en vivo de conversaciones, contactos, negocios, difusiones y automatizaciones.",
      "activeConversations": "Conversaciones activas",
      "newContactsToday": "Contactos nuevos hoy",
      "openDealsValue": "Valor de negocios abiertos",
      "messagesSentToday": "Mensajes enviados hoy",
      "newTodayVsYesterday": "nuevos hoy vs. ayer",
      "vsYesterday": "vs. ayer",
      "openDeals": "{count} {count, plural, =1 {negocio abierto} other {negocios abiertos}}",
      "noChange": "Sin cambios {suffix}"
    },
    "quickActions": {
      "newContact": "Nuevo contacto",
      "newDeal": "Nuevo negocio",
      "newBroadcast": "Nueva difusión",
      "newAutomation": "Nueva automatización"
    },
    "activityFeed": {
      "title": "Actividad reciente",
      "viewAll": "Ver todo →",
      "noActivity": "Aún no hay actividad",
      "noActivityHint": "La actividad de mensajes, negocios, difusiones y automatizaciones aparecerá aquí.",
      "showingOf": "Mostrando {visible} de {totalLoaded}{plus}",
      "show": "Mostrar",
      "timeS": "hace {sec}s",
      "timeM": "hace {min}min",
      "timeH": "hace {hr}h",
      "timeD": "hace {day}d",
      "items": {
        "newMessage": "Nuevo mensaje de {who}",
        "newContact": "Nuevo contacto: {name}",
        "dealInStage": "Negocio \"{title}\" en {stage}",
        "dealUpdated": "Negocio \"{title}\" actualizado",
        "broadcastSent": "Difusión \"{name}\" enviada a {count} contactos",
        "broadcastStatus": "Difusión \"{name}\" {status} ({count} destinatarios)",
        "broadcastStatusNames": {
          "draft": "en borrador",
          "scheduled": "programada",
          "sending": "enviándose",
          "sent": "enviada",
          "failed": "fallida"
        },
        "automationFailed": "Automatización \"{name}\" falló para {who}",
        "automationTriggered": "Automatización \"{name}\" activada para {who}",
        "unknown": "Desconocido",
        "aContact": "un contacto",
        "automationFallback": "Automatización"
      }
    },
    "conversationsChart": {
      "title": "Conversaciones a lo largo del tiempo",
      "description": "Volumen diario de mensajes por dirección",
      "days": "{count} días",
      "noActivity": "No hay actividad de mensajes en este rango",
      "noActivityHint": "Envía o recibe mensajes para empezar a llenar este gráfico.",
      "incoming": "Entrantes",
      "outgoing": "Salientes",
      "tooltipIncoming": "{count} entrantes",
      "tooltipOutgoing": "{count} salientes",
      "ariaLabel": "Conversaciones por día"
    },
    "pipelineDonut": {
      "title": "Valor del pipeline",
      "description": "Negocios abiertos por etapa",
      "noOpenDeals": "Aún no hay negocios abiertos",
      "noOpenDealsHint": "Crea negocios en Pipelines para ver aquí el desglose por etapa.",
      "dealCount": "{count} {count, plural, =1 {negocio} other {negocios}}",
      "total": "Total",
      "ariaLabel": "Valor del pipeline por etapa"
    },
    "responseTimeChart": {
      "title": "Tiempo promedio de primera respuesta",
      "description": "Minutos para responder al primer mensaje sin respuesta de un cliente, por día de la semana",
      "target": "objetivo {minutes}min",
      "thisWeek": "Esta semana:",
      "lastWeek": "Semana pasada:",
      "noReplies": "Aún no hay respuestas registradas",
      "noRepliesHint": "Este gráfico se llena a medida que respondes a los mensajes de los clientes.",
      "avgMinutes": "Promedio en minutos"
    },
    "emptyState": {
      "title": "Aún no hay datos suficientes"
    }
  },
  "Inbox": {
    "page": {
      "whatsappNotConnected": "WhatsApp® no está conectado. Ve a Configuración para conectar tu cuenta."
    },
    "conversationList": {
      "searchPlaceholder": "Buscar conversaciones...",
      "filterAll": "Todas",
      "filterUnread": "Sin leer",
      "filterOpen": "Abiertas",
      "filterPending": "Pendientes",
      "filterClosed": "Cerradas",
      "tags": "Etiquetas",
      "company": "Empresa",
      "allCompanies": "Todas las empresas",
      "clearAll": "Limpiar todo",
      "noConversations": "No se encontraron conversaciones",
      "noMessagesYet": "Aún no hay mensajes",
      "unknown": "Desconocido"
    },
    "messageThread": {
      "backToConversations": "Volver a las conversaciones",
      "hideContactPanel": "Ocultar panel del contacto",
      "showContactPanel": "Mostrar panel del contacto",
      "hideContact": "Ocultar contacto",
      "showContact": "Mostrar contacto",
      "refresh": "Actualizar",
      "refreshConversation": "Actualizar conversación",
      "status": "Estado",
      "statusOpen": "Abierta",
      "statusPending": "Pendiente",
      "statusClosed": "Cerrada",
      "assign": "Asignar",
      "assigned": "Asignada",
      "unassign": "Quitar asignación",
      "noTeammates": "No hay compañeros disponibles",
      "me": " (yo)",
      "noMessagesYet": "Aún no hay mensajes",
      "sendTemplateHint": "Envía una plantilla para iniciar la conversación",
      "selectConversation": "Selecciona una conversación",
      "selectConversationHint": "Elige una conversación a la izquierda para empezar a chatear",
      "today": "Hoy",
      "yesterday": "Ayer",
      "customer": "Cliente",
      "unknown": "Desconocido",
      "sendFailed": "Error al enviar: {reason}",
      "sendTemplateFailed": "Error al enviar la plantilla: {reason}",
      "waitForSending": "Espera a que el mensaje termine de enviarse",
      "reactionFailed": "Error en la reacción: {reason}",
      "assignmentUpdateFailed": "Error al actualizar la asignación",
      "networkError": "error de red",
      "documentFallback": "Documento",
      "you": "Tú"
    },
    "sessionTimer": {
      "expired": "Expirada",
      "xhRemaining": "{hours}h restantes",
      "xmRemaining": "{minutes}min restantes",
      "noCustomerMessages": "Sin mensajes del cliente"
    },
    "composer": {
      "draftHint": "Toca ✨ para redactar una respuesta con IA; puedes editarla antes de enviarla",
      "sessionExpiredHint": "La sesión de 24 horas expiró. Usa una plantilla para retomar el contacto.",
      "templates": "Plantillas",
      "readOnlyPlaceholder": "Solo lectura: los observadores pueden navegar, pero no responder",
      "sessionExpiredPlaceholder": "Sesión expirada - usa una plantilla",
      "typeMessagePlaceholder": "Escribe un mensaje... (Shift+Enter para nueva línea)",
      "readOnlyTitle": "Solo lectura: tu rol no puede enviar mensajes",
      "recording": "Grabando… {current} / {max}",
      "cancel": "Cancelar",
      "stopAndAttach": "Detener y adjuntar",
      "attachMedia": "Adjuntar archivo",
      "photo": "Foto",
      "video": "Video",
      "document": "Documento",
      "voiceNote": "Nota de voz",
      "sendTemplate": "Enviar plantilla",
      "aiNotConfigured": "La IA aún no está configurada; actívala en Configuración → Asistente de IA.",
      "draftFailed": "No se pudo redactar una respuesta.",
      "draftEmpty": "El asistente no devolvió una respuesta.",
      "aiUnreachable": "No se pudo conectar con el asistente de IA.",
      "recordingTooLong": "La grabación es demasiado larga (más de 16 MB).",
      "recordingUnsupported": "Este navegador no admite la grabación de voz.",
      "microphoneDenied": "Acceso al micrófono denegado o no disponible.",
      "draftWithAI": "Redactar una respuesta con IA",
      "addCaption": "Agregar una descripción…",
      "removeAttachment": "Quitar adjunto",
      "moreActions": "Más",
      "interactiveMessage": "Mensaje interactivo",
      "quickReplies": "Respuestas rápidas",
      "quickRepliesEmpty": "Aún no hay respuestas rápidas. Agrega algunas en Configuración → Respuestas rápidas.",
      "saveAsQuickReply": "Guardar como respuesta rápida",
      "send": "Enviar",
      "quickReplyNamePrompt": "Ponle un nombre a esta respuesta rápida:",
      "quickReplySaved": "Guardada como respuesta rápida.",
      "quickReplySaveError": "No se pudo guardar la respuesta rápida.",
      "fileTooLarge": "El archivo pesa {size} MB; el límite para {kind} es {max} MB.",
      "mediaKind": {
        "image": "imagen",
        "video": "video",
        "document": "documento",
        "audio": "audio"
      },
      "uploadFailed": "Falló la carga."
    },
    "bubble": {
      "photo": "Foto",
      "video": "Video",
      "audio": "Audio",
      "unavailable": "{label} no disponible",
      "document": "Documento",
      "locationShared": "Ubicación compartida",
      "template": "Plantilla",
      "buttonReply": "Respuesta de botón",
      "interactiveReply": "[Respuesta interactiva]",
      "unsupported": "[Tipo de mensaje no compatible]",
      "aiBadge": "IA",
      "aiBadgeTitle": "Enviado automáticamente por el asistente de IA",
      "notDelivered": "No entregado",
      "download": "Descargar",
      "downloadFailed": "No se pudo descargar el adjunto",
      "viewImage": "Ver imagen",
      "expandVideo": "Ampliar video",
      "imageAlt": "Imagen compartida"
    },
    "mediaViewer": {
      "counter": "{index} de {total}",
      "previous": "Anterior",
      "next": "Siguiente",
      "zoomIn": "Ampliar a tamaño completo",
      "zoomOut": "Ajustar a la pantalla",
      "openOriginal": "Abrir original",
      "download": "Descargar",
      "downloadFailed": "No se pudo descargar el adjunto",
      "failed": "Este adjunto ya no está disponible",
      "imageAlt": "Imagen compartida",
      "you": "Tú"
    },
    "actions": {
      "reply": "Responder",
      "copyText": "Copiar texto",
      "delete": "Eliminar",
      "react": "Reaccionar",
      "reactWith": "Reaccionar con {emoji}",
      "nothingToCopy": "Nada que copiar",
      "copied": "Copiado",
      "copyFailed": "Error al copiar"
    },
    "replyQuote": {
      "photo": "[Foto]",
      "video": "[Video]",
      "document": "[Documento]",
      "audio": "[Audio]",
      "voiceMessage": "[Mensaje de voz]",
      "location": "[Ubicación]",
      "template": "[Plantilla]",
      "message": "[Mensaje]",
      "cancelReply": "Cancelar respuesta"
    },
    "templatePicker": {
      "sendTemplate": "Enviar plantilla",
      "fillPlaceholders": "Completa las variables para renderizar esta plantilla. Meta exige que todas las variables estén definidas.",
      "pickTemplate": "Elige una plantilla aprobada de WhatsApp para enviar a este contacto.",
      "noApprovedTemplates": "No hay plantillas aprobadas",
      "noApprovedTemplatesHint": "Aprueba una plantilla en el Administrador de WhatsApp de Meta y luego sincronízala desde Configuración → Plantillas.",
      "preview": "Vista previa",
      "headerValuePlaceholder": "Valor para la variable del encabezado",
      "bodyValuePlaceholder": "Valor para {val}",
      "urlSuffixValuePlaceholder": "Valor del sufijo de la URL",
      "finalUrl": "URL final: {url}",
      "back": "Atrás",
      "cancel": "Cancelar",
      "send": "Enviar plantilla",
      "headerVarLabel": "Encabezado {var}",
      "bodyVarLabel": "Cuerpo {var}",
      "urlButtonVarLabel": "Botón de URL \"{text}\": valor para {var}"
    },
    "sidebar": {
      "contactInfo": "Información del contacto",
      "tags": "Etiquetas",
      "notes": "Notas",
      "deals": "Negocios",
      "noTags": "Sin etiquetas",
      "noDeals": "Sin negocios",
      "addNotePlaceholder": "Agregar una nota..."
    },
    "aiBanner": {
      "pausedTitle": "El asistente de IA está en pausa aquí",
      "activeText": "El asistente de IA está respondiendo automáticamente",
      "takeOver": "Tomar el control",
      "resume": "Reanudar IA",
      "tookOver": "Tomaste el control de este chat.",
      "resumed": "IA reanudada.",
      "updateError": "No se pudo actualizar el asistente de IA.",
      "networkError": "No se pudo conectar con el servidor."
    }
  },
  "Contacts": {
    "page": {
      "title": "Contactos",
      "subtitle": "Administra tu lista de contactos. {count} contactos en total.",
      "subtitleZero": "Administra tu lista de contactos.",
      "customFieldsBtn": "Campos personalizados",
      "selectAllOnPage": "Seleccionar todos los contactos de esta página",
      "importBtn": "Importar",
      "addContactBtn": "Agregar contacto",
      "searchPlaceholder": "Buscar por nombre, teléfono o correo...",
      "filterByTags": "Filtrar por etiquetas",
      "clearAll": "Limpiar todo",
      "noTagsYet": "Aún no hay etiquetas.",
      "selectedCount": "{count} seleccionados",
      "clearSelection": "Limpiar",
      "deleteSelected": "Eliminar seleccionados",
      "tableColumns": {
        "name": "Nombre",
        "phone": "Teléfono",
        "email": "Correo",
        "company": "Empresa",
        "tags": "Etiquetas",
        "createdAt": "Creado"
      },
      "loading": "Cargando contactos...",
      "noContactsMatch": "Ningún contacto coincide con tus filtros.",
      "noContactsYet": "Aún no hay contactos.",
      "addFirstContact": "Agrega tu primer contacto",
      "unnamed": "Sin nombre",
      "editAction": "Editar",
      "deleteAction": "Eliminar",
      "showingPagination": "Mostrando {start}-{end} de {total}",
      "pageCount": "Página {page} de {total}",
      "deleteContactTitle": "Eliminar contacto",
      "deleteContactDesc": "¿Seguro que quieres eliminar a {name}? Esta acción no se puede deshacer.",
      "cancel": "Cancelar",
      "deleteBtn": "Eliminar",
      "deleteBulkTitle": "Eliminar contactos",
      "deleteBulkDesc": "¿Seguro que quieres eliminar los {count} contactos seleccionados? Esta acción no se puede deshacer.",
      "toastFailedLoad": "Error al cargar los contactos",
      "toastFailedDelete": "Error al eliminar el contacto",
      "toastDeleted": "Contacto eliminado",
      "toastBulkFailedDelete": "Error al eliminar los contactos",
      "toastBulkDeleted": "{count} contactos eliminados",
      "filterByTag": "Filtrar por {name}",
      "removeTagFilter": "Quitar el filtro {name}",
      "selectContact": "Seleccionar {name}"
    },
    "form": {
      "addTitle": "Agregar contacto",
      "addDesc": "Crea un nuevo contacto. El nombre es obligatorio.",
      "editTitle": "Editar contacto",
      "editDesc": "Actualiza los datos y las etiquetas del contacto.",
      "nameLabel": "Nombre",
      "namePlaceholder": "María Pérez",
      "phoneLabel": "Número de teléfono",
      "phonePlaceholder": "+1234567890",
      "phoneHint": "Incluye el código de país, p. ej. +52 para México",
      "emailLabel": "Correo electrónico",
      "emailPlaceholder": "maria@example.com",
      "companyLabel": "Empresa",
      "companyPlaceholder": "Acme S.A.",
      "tagsLabel": "Etiquetas",
      "tagsPlaceholder": "Selecciona etiquetas...",
      "noTagsFound": "No se encontraron etiquetas.",
      "createTagAction": "Crear etiqueta \"{value}\"",
      "cancel": "Cancelar",
      "save": "Guardar contacto",
      "update": "Actualizar",
      "create": "Crear",
      "toastSuccessAdd": "Contacto creado correctamente",
      "toastSuccessEdit": "Contacto actualizado correctamente",
      "toastError": "Error al guardar el contacto",
      "toastConflict": "Ya existe un contacto con este número de teléfono",
      "viewExisting": "Ver {name}",
      "dupExact": "Ya existe un contacto con este número de teléfono.",
      "dupSimilar": "Ya existe un contacto con un número muy parecido.",
      "loadingTags": "Cargando etiquetas...",
      "noTagsAvailable": "No hay etiquetas disponibles. Crea etiquetas en Configuración.",
      "phoneRequired": "El número de teléfono es obligatorio",
      "phoneNeedsCountryCode": "Incluye el código de país — el número debe empezar con + (p. ej. +5215512345678)",
      "notAuthenticated": "No autenticado",
      "notLinkedToAccount": "Tu perfil no está vinculado a una cuenta."
    },
    "detailView": {
      "tabs": {
        "details": "Detalles",
        "activity": "Actividad",
        "notes": "Notas",
        "custom": "Campos personalizados",
        "deals": "Negocios",
        "tags": "Etiquetas",
        "noTags": "Sin etiquetas",
        "noDeals": "Sin negocios",
        "addNotePlaceholder": "Agregar una nota..."
      },
      "actions": {
        "edit": "Editar",
        "message": "Mensaje",
        "delete": "Eliminar"
      },
      "contactInfo": "Información del contacto",
      "unnamed": "Desconocido",
      "contactDetailsDesc": "Datos del contacto",
      "name": "Nombre",
      "phone": "Teléfono",
      "email": "Correo electrónico",
      "company": "Empresa",
      "createdAt": "Fecha de creación",
      "customFields": "Campos personalizados",
      "noCustomFields": "No hay campos personalizados definidos. Créalos en Configuración.",
      "manageFields": "Administrar campos",
      "enterCustomField": "Ingresa {name}...",
      "activityTab": {
        "title": "Historial de actividad",
        "noActivity": "Aún no hay actividad."
      },
      "notesTab": {
        "title": "Notas internas",
        "placeholder": "Escribe una nota...",
        "save": "Agregar nota",
        "noNotes": "Aún no hay notas."
      },
      "dealsTab": {
        "noDeals": "Aún no hay negocios"
      },
      "tagsTab": {
        "clickTagDesc": "Haz clic en una etiqueta para agregarla o quitarla de este contacto.",
        "noTagsAvailable": "No hay etiquetas disponibles. Crea etiquetas en Configuración."
      },
      "sendTemplateBtn": "Enviar plantilla",
      "saveChangesBtn": "Guardar cambios",
      "saveCustomFieldsBtn": "Guardar campos personalizados",
      "toastPhoneRequired": "El número de teléfono es obligatorio",
      "toastPhoneNeedsCountryCode": "Incluye el código de país — el número debe empezar con + (p. ej. +5215512345678)",
      "toastUpdateFailed": "Error al actualizar el contacto",
      "toastUpdated": "Contacto actualizado",
      "toastNotAuthenticated": "No autenticado",
      "toastNoteAddFailed": "Error al agregar la nota",
      "toastNoteAdded": "Nota agregada",
      "toastNoteDeleteFailed": "Error al eliminar la nota",
      "toastNoteDeleted": "Nota eliminada",
      "toastCustomFieldsSaved": "Campos personalizados guardados",
      "toastCustomFieldsFailed": "Error al guardar los campos personalizados",
      "toastTemplateSent": "Plantilla \"{name}\" enviada",
      "toastTemplateFailed": "Error al enviar la plantilla: {reason}",
      "networkError": "error de red"
    },
    "importModal": {
      "title": "Importar contactos",
      "desc": "Sube un CSV con una columna <phoneCode>phone</phoneCode> obligatoria. Opcionales: <nameCode>name</nameCode>, <emailCode>email</emailCode>, <companyCode>company</companyCode>, <tagsCode>tags</tagsCode> (separadas por comas; pon entre comillas las celdas con varias etiquetas).",
      "uploadDropzone": "Haz clic para elegir un archivo CSV",
      "uploadHint": ".csv hasta el límite de tu navegador",
      "rowsReady": "{count} fila lista",
      "rowsReady_plural": "{count} filas listas",
      "preview": "Vista previa · primeras {count}",
      "previewTags": "{tags} etiqueta · {contacts} contacto",
      "previewTags_plural": "{tags} etiquetas · {contacts} contactos",
      "moreRows": "+ {count} fila más no mostrada",
      "moreRows_plural": "+ {count} filas más no mostradas",
      "importComplete": "Importación completada",
      "resultImported": "{count} importados",
      "resultTags": "{count} etiqueta asignada",
      "resultTags_plural": "{count} etiquetas asignadas",
      "resultSkipped": "{count} omitidos",
      "resultInvalidPhone": "{count} teléfono no válido",
      "resultInvalidPhone_plural": "{count} teléfonos no válidos",
      "resultFailed": "{count} con error",
      "failedRowsHeading": "Filas con error",
      "unknownReason": "Error desconocido",
      "invalidPhoneHint": "Los números de teléfono deben empezar con + y el código de país (p. ej. +5215512345678). Los números sin código se entregarían en el país equivocado.",
      "willBeCreated": "{name} (se creará al importar)",
      "columns": {
        "phone": "Teléfono",
        "name": "Nombre",
        "email": "Correo",
        "company": "Empresa",
        "tags": "Etiquetas"
      },
      "cancel": "Cancelar",
      "close": "Cerrar",
      "importBtn": "Importar {count} contacto",
      "importBtn_plural": "Importar {count} contactos",
      "toastNoValidRows": "No se encontraron filas válidas. Asegúrate de que el CSV tenga un encabezado de columna \"phone\".",
      "toastTagsWarning": "Contactos importados, pero algunas asignaciones de etiquetas fallaron.",
      "toastImported": "{count} contacto importado",
      "toastImported_plural": "{count} contactos importados",
      "toastTagsAssigned": "{count} asignación de etiqueta aplicada",
      "toastTagsAssigned_plural": "{count} asignaciones de etiqueta aplicadas",
      "toastTagsSkipped": "Etiquetas desconocidas omitidas (créalas primero en Configuración): {sample}{more}",
      "toastSkipped": "{count} duplicado omitido",
      "toastSkipped_plural": "{count} duplicados omitidos",
      "toastInvalidPhone": "{count} contacto no tenía un número de teléfono utilizable",
      "toastInvalidPhone_plural": "{count} contactos no tenían un número de teléfono utilizable",
      "toastFailed": "{count} contacto no se pudo importar",
      "toastFailed_plural": "{count} contactos no se pudieron importar",
      "toastError": "Error en la importación",
      "notAuthenticated": "No autenticado",
      "notLinkedToAccount": "Tu perfil no está vinculado a una cuenta.",
      "toastTagsSkippedMore": " (+{count} más)"
    },
    "customFields": {
      "title": "Campos personalizados",
      "desc": "Define campos adicionales para los contactos (p. ej. código postal, origen del lead). Aparecen en todos los contactos y en la acción de automatización “Actualizar campo del contacto”.",
      "addField": "Agregar",
      "fieldName": "Nombre del nuevo campo…",
      "loading": "Cargando…",
      "empty": "Aún no hay campos personalizados.",
      "renameAria": "Renombrar {name}",
      "deleteTitle": "Eliminar campo",
      "deleteConfirm": "¿Eliminar \"{name}\"? Esto también elimina su valor guardado en todos los contactos. No se puede deshacer.",
      "toastNoAccount": "Tu perfil no está vinculado a una cuenta.",
      "toastDuplicate": "Ya existe un campo llamado \"{name}\".",
      "toastCreateFailed": "No se pudo crear el campo. Quizá no tengas permiso.",
      "toastCreated": "\"{name}\" creado.",
      "toastRenameFailed": "No se pudo renombrar el campo.",
      "toastDeleteFailed": "No se pudo eliminar el campo.",
      "toastDeleted": "\"{name}\" eliminado."
    }
  },
  "Pipelines": {
    "page": {
      "selectPipeline": "Seleccionar pipeline",
      "noPipelinesYet": "Aún no hay pipelines",
      "managePipelines": "Administrar pipelines",
      "addPipeline": "Agregar pipeline",
      "addDeal": "Agregar negocio",
      "createToStartTracking": "Crea un pipeline para empezar a dar seguimiento a los negocios",
      "createPipeline": "Crear pipeline",
      "newPipeline": "Nuevo pipeline",
      "pipelineName": "Nombre del pipeline",
      "pipelineNamePlaceholder": "p. ej. Ventas corporativas",
      "defaultStagesDesc": "Las etapas predeterminadas (Nuevo lead → Ganado) se crearán automáticamente.",
      "cancel": "Cancelar",
      "creating": "Creando...",
      "createPipelineBtn": "Crear pipeline",
      "toastFailedLoadPipelines": "Error al cargar los pipelines",
      "toastFailedMoveDeal": "Error al mover el negocio",
      "toastFailedCreatePipeline": "Error al crear el pipeline",
      "toastPipelineCreated": "Pipeline creado",
      "toastNotLinkedToAccount": "Tu perfil no está vinculado a una cuenta.",
      "defaultPipelineName": "Pipeline de ventas",
      "defaultStages": {
        "newLead": "Nuevo lead",
        "qualified": "Calificado",
        "proposalSent": "Propuesta enviada",
        "negotiation": "Negociación",
        "won": "Ganado"
      }
    },
    "board": {
      "dropDealHere": "Suelta un negocio aquí",
      "addDeal": "Agregar negocio"
    },
    "card": {
      "noContact": "Sin contacto",
      "won": "Ganado",
      "lost": "Perdido"
    },
    "form": {
      "editDeal": "Editar negocio",
      "newDeal": "Nuevo negocio",
      "title": "Título",
      "titlePlaceholder": "Título del negocio",
      "contact": "Contacto",
      "selectContact": "Selecciona un contacto",
      "linkToConversation": "Vincular a una conversación",
      "value": "Valor",
      "currency": "Moneda",
      "expectedCloseDate": "Fecha estimada de cierre",
      "stage": "Etapa",
      "assignedTo": "Asignado a",
      "unassigned": "Sin asignar",
      "notes": "Notas",
      "notesPlaceholder": "Agregar notas...",
      "status": "Estado",
      "markAsWon": "Marcar como ganado",
      "markAsLost": "Marcar como perdido",
      "reopenDeal": "Reabrir negocio",
      "cancel": "Cancelar",
      "saving": "Guardando...",
      "saveChanges": "Guardar cambios",
      "createDeal": "Crear negocio",
      "deletePrompt": "¿Eliminar este negocio?",
      "confirm": "Confirmar",
      "deleting": "Eliminando...",
      "deleteDeal": "Eliminar negocio",
      "toastRequired": "Título, contacto y etapa son obligatorios",
      "toastFailedSave": "Error al guardar el negocio",
      "toastNotSignedIn": "No has iniciado sesión",
      "toastNotLinked": "Tu perfil no está vinculado a una cuenta.",
      "toastFailedCreate": "Error al crear el negocio",
      "toastUpdated": "Negocio actualizado",
      "toastCreated": "Negocio creado",
      "toastFailedStatus": "Error al actualizar el estado del negocio",
      "toastMarkedWon": "Marcado como ganado",
      "toastMarkedLost": "Marcado como perdido",
      "toastReopened": "Negocio reabierto",
      "toastFailedDelete": "Error al eliminar el negocio",
      "toastDeleted": "Negocio eliminado"
    },
    "settings": {
      "managePipeline": "Administrar pipeline",
      "deletePipeline": "Eliminar pipeline",
      "deletePipelineDesc": "Esto archivará todos los negocios de este pipeline. No se puede deshacer.",
      "cancel": "Cancelar",
      "deleting": "Eliminando...",
      "deletePipelineBtn": "Eliminar pipeline",
      "pipelineName": "Nombre del pipeline",
      "stages": "Etapas",
      "newStageNamePlaceholder": "Nombre de la nueva etapa",
      "add": "Agregar",
      "createNewPipeline": "Crear un nuevo pipeline",
      "saving": "Guardando...",
      "saveChanges": "Guardar cambios",
      "dragToReorder": "Arrastra para reordenar",
      "changeColor": "Cambiar color",
      "toastFailedSave": "Error al guardar el pipeline",
      "toastSaved": "Pipeline guardado",
      "toastFailedAddStage": "Error al agregar la etapa",
      "toastMoveOrDeleteDeals": "Primero mueve o elimina los negocios de esta etapa",
      "toastFailedDeleteStage": "Error al eliminar la etapa",
      "toastFailedDeletePipeline": "Error al eliminar el pipeline",
      "toastDeleted": "Pipeline eliminado",
      "pickColor": "Elegir el color {color}"
    },
    "analytics": {
      "totalDeals": "Total de negocios",
      "totalDealsTooltip": "Cantidad de negocios de este pipeline que no están marcados como perdidos. Los negocios ganados siguen incluidos.",
      "pipelineValue": "Valor del pipeline",
      "pipelineValueTooltip": "Suma de los valores de todos los negocios de este pipeline, excluyendo los marcados como perdidos.",
      "avgDealSize": "Ticket promedio",
      "avgDealSizeTooltip": "Valor del pipeline dividido por el total de negocios: el valor promedio de un solo negocio no perdido.",
      "weightedValue": "Valor ponderado",
      "weightedValueTooltip": "Ingresos esperados: el valor de cada negocio abierto × la probabilidad de su etapa. Primera etapa ≈ 10%, las etapas avanzan hasta 90%, Ganado = 100%. Los negocios perdidos se excluyen.",
      "wonThisMonth": "Ganados este mes",
      "wonThisMonthTooltip": "Negocios marcados como ganados desde el primer día del mes actual.",
      "lostThisMonth": "Perdidos este mes",
      "lostThisMonthTooltip": "Negocios marcados como perdidos desde el primer día del mes actual.",
      "howCalculated": "Cómo se calcula {label}"
    }
  },
  "Broadcasts": {
    "page": {
      "title": "Difusiones",
      "subtitle": "Envía mensajes masivos a tus contactos usando plantillas aprobadas.",
      "newBroadcast": "Nueva difusión",
      "noBroadcastsYet": "Aún no hay difusiones",
      "createFirst": "Crea tu primera difusión para llegar a tus contactos a gran escala.",
      "table": {
        "name": "Nombre",
        "template": "Plantilla",
        "recipients": "Destinatarios",
        "delivery": "Entrega",
        "read": "Leídos",
        "status": "Estado",
        "date": "Fecha"
      },
      "errorLoad": "Error al cargar las difusiones",
      "broadcastInProgress": "Difusión en curso",
      "retry": "Reintentar"
    },
    "status": {
      "draft": "Borrador",
      "scheduled": "Programada",
      "sending": "Enviando",
      "sent": "Enviada",
      "failed": "Fallida",
      "pending": "Pendiente",
      "delivered": "Entregado",
      "read": "Leído",
      "replied": "Respondido",
      "unknown": "Desconocido"
    },
    "detail": {
      "backToBroadcasts": "Volver a difusiones",
      "notFound": "Difusión no encontrada",
      "template": "Plantilla: {name}",
      "createdAt": "Creada el {date}",
      "deletePrompt": "¿Eliminar esta difusión?",
      "cancel": "Cancelar",
      "confirm": "Confirmar",
      "deleting": "Eliminando…",
      "delete": "Eliminar",
      "cannotDeleteSending": "No se puede eliminar mientras una difusión se está enviando",
      "deleteHover": "Eliminar esta difusión",
      "funnel": "Embudo",
      "recipientsHeader": "Destinatarios ({filtered} de {total})",
      "recipientsHeaderAll": "Destinatarios ({total})",
      "allStatuses": "Todos los estados",
      "exportCsv": "Exportar CSV",
      "noRecipients": "No se encontraron destinatarios.",
      "noRecipientsFilter": "Ningún destinatario coincide con este filtro.",
      "table": {
        "contact": "Contacto",
        "phone": "Teléfono",
        "status": "Estado",
        "sent": "Enviado",
        "delivered": "Entregado",
        "read": "Leído",
        "error": "Error"
      },
      "stats": {
        "totalRecipients": "Total de destinatarios",
        "sent": "Enviados",
        "delivered": "Entregados",
        "read": "Leídos",
        "replied": "Respondidos",
        "failed": "Fallidos"
      },
      "toastFailedDelete": "Error al eliminar: {error}",
      "toastDeleted": "Difusión eliminada",
      "resumeTitle": "Algunos destinatarios necesitan otro intento",
      "resumeStalledTitle": "Esta campaña se detuvo a medio camino",
      "resumeHint": "{count} destinatarios fallaron. Reintentar les vuelve a enviar desde el servidor.",
      "resumeStalledHint": "{count} destinatarios nunca recibieron el envío: la pestaña del navegador que ejecutaba esta campaña se cerró antes de terminar. Reanudar la completa desde el servidor.",
      "resumePending": "Reanudar envío ({count})",
      "retryFailed": "Reintentar fallidos ({count})",
      "toastResumeStarted": "Enviando a {count} destinatarios en segundo plano.",
      "toastResumeStartedCapped": "Enviando a {count} destinatarios en segundo plano. Otros {remaining} necesitarán otra ejecución.",
      "toastResumeFailed": "No se pudo reanudar: {error}",
      "unknownError": "Error desconocido",
      "unknownContact": "Desconocido"
    },
    "new": {
      "title": "Nueva difusión",
      "subtitle": "Crea y envía un mensaje masivo a tus contactos.",
      "steps": {
        "template": "Plantilla",
        "audience": "Audiencia",
        "personalize": "Personalizar",
        "send": "Enviar"
      },
      "toastGiveName": "Ponle un nombre a la difusión antes de guardar un borrador.",
      "toastNotSignedIn": "No has iniciado sesión.",
      "toastNotLinked": "Tu perfil no está vinculado a una cuenta.",
      "toastFailedDraft": "Error al guardar el borrador: {error}",
      "toastDraftSaved": "Borrador guardado",
      "broadcastFailed": "Falló la difusión"
    },
    "wizard": {
      "next": "Siguiente",
      "back": "Atrás",
      "cancel": "Cancelar",
      "chooseTemplate": {
        "title": "Elige una plantilla",
        "subtitle": "Selecciona una plantilla de mensaje aprobada para tu difusión.",
        "noTemplates": "No hay plantillas disponibles.",
        "createFirst": "Primero crea una plantilla en Configuración.",
        "errorLoad": "Error al cargar las plantillas"
      },
      "selectAudience": {
        "title": "Seleccionar audiencia",
        "subtitle": "Elige quién recibirá esta difusión.",
        "method": {
          "all": "Todos los contactos",
          "tags": "Filtrar por etiquetas",
          "customField": "Campo personalizado",
          "csv": "Subir CSV"
        },
        "allDesc": "Enviar a los {count} contactos de tu base de datos.",
        "allDescLoading": "Enviar a todos los contactos de tu base de datos.",
        "tagDesc": "Enviar a contactos con etiquetas específicas.",
        "customFieldDesc": "Enviar a contactos que cumplan una regla de campo personalizado.",
        "csvDesc": "Sube un CSV con números de teléfono (y nombres opcionales).",
        "selectTags": "Seleccionar etiquetas",
        "searchTags": "Buscar etiquetas...",
        "noTagsFound": "No se encontraron etiquetas.",
        "excludeTags": "Excluir etiquetas (opcional)",
        "searchExcludeTags": "Buscar etiquetas para excluir...",
        "field": "Campo",
        "selectField": "Selecciona un campo...",
        "operator": "Operador",
        "operatorIs": "Es",
        "operatorIsNot": "No es",
        "operatorContains": "Contiene",
        "value": "Valor",
        "valuePlaceholder": "Valor a comparar",
        "uploadCsv": "Subir archivo CSV",
        "csvFormatDesc": "Debe contener una columna 'phone' (formato E.164). La columna 'name' es opcional.",
        "csvContactsFound": "{count} contacto(s) válido(s) encontrado(s) en el CSV.",
        "csvInvalidPhones": "{count} fila(s) omitida(s): los números de teléfono deben empezar con + y el código de país (p. ej. +5215512345678).",
        "errorLoadTags": "Error al cargar las etiquetas",
        "errorLoadFields": "Error al cargar los campos personalizados",
        "errorCsvParse": "No se pudo leer el archivo CSV.",
        "errorCsvMissingPhone": "El CSV debe tener una columna 'phone'.",
        "audienceSummary": "Resumen de la audiencia",
        "calculating": "Calculando…",
        "estimatedRecipients": "destinatarios estimados",
        "selectTypeForEstimate": "Selecciona un tipo de audiencia para ver la estimación."
      },
      "personalize": {
        "title": "Personalizar variables",
        "subtitle": "Asigna las variables de la plantilla a campos del contacto o ingresa valores fijos.",
        "headerImage": "Imagen del encabezado",
        "headerImageDesc": "Esta plantilla requiere una imagen de encabezado.",
        "imageUrl": "URL de la imagen",
        "imageUrlPlaceholder": "https://example.com/image.jpg",
        "variables": "Variables",
        "varDesc": "Define valores para {{name}}",
        "type": "Tipo",
        "typeStatic": "Valor fijo",
        "typeContact": "Campo del contacto",
        "typeCustom": "Campo personalizado",
        "staticValue": "Valor fijo",
        "contactField": "Campo del contacto",
        "selectContactField": "Selecciona el campo...",
        "customField": "Campo personalizado",
        "selectCustomField": "Selecciona el campo personalizado...",
        "preview": "Vista previa",
        "previewSample": "Mostrando vista previa con datos de ejemplo.",
        "noPreview": "Vista previa no disponible.",
        "headerPreviewAlt": "Vista previa del encabezado",
        "mediaUrlRequired": "Se necesita una URL de archivo para enviar esta plantilla.",
        "mediaUrlInvalid": "Ingresa una URL http(s) válida.",
        "enterValue": "Ingresa un valor...",
        "loadingFields": "Cargando…",
        "noCustomFields": "Sin campos personalizados",
        "unmappedWarning": "Asigna todas las variables antes de continuar; aún faltan <mono>{keys}</mono>. De lo contrario, esas variables se enviarán a Meta como cadenas vacías.",
        "fieldMap": {
          "name": "Nombre",
          "phone": "Teléfono",
          "email": "Correo"
        },
        "sampleName": "Juan Pérez",
        "sampleCompany": "Empresa Ejemplo S.A."
      },
      "scheduleSend": {
        "title": "Revisar y enviar",
        "subtitle": "Ponle un nombre a tu difusión y confirma el envío.",
        "broadcastName": "Nombre de la difusión",
        "broadcastNamePlaceholder": "p. ej. Promo de verano",
        "summary": "Resumen",
        "template": "Plantilla:",
        "audience": "Audiencia:",
        "audienceAll": "Todos los contactos",
        "audienceTags": "Filtrada por etiquetas",
        "audienceField": "Filtrada por campo personalizado",
        "audienceCsv": "Carga de CSV",
        "variables": "Variables:",
        "variablesMapped": "{count} asignadas",
        "saveDraft": "Guardar como borrador",
        "sendNow": "Enviar difusión",
        "sending": "Enviando...",
        "preparing": "Preparando...",
        "progressDesc": "Procesando {current} de {total} destinatarios...",
        "toastFailedPreview": "Error al cargar los datos de la vista previa",
        "estimatedReach": "Alcance estimado",
        "language": "Idioma",
        "confirmTitle": "Confirmar difusión",
        "confirmDesc": "Estás a punto de enviar esta difusión a <b>{count, number}</b> {count, plural, =1 {contacto} other {contactos}} con la plantilla <b>{template}</b>. Esta acción no se puede deshacer."
      }
    },
    "sending": {
      "notSignedIn": "No has iniciado sesión.",
      "notLinkedToAccount": "Tu perfil no está vinculado a una cuenta.",
      "lookupCsvContactsFailed": "No se pudieron buscar los contactos del CSV: {error}",
      "createCsvContactsFailed": "No se pudieron crear los contactos del CSV: {error}",
      "noContactsForAudience": "No se encontraron contactos para esta audiencia.",
      "createBroadcastFailed": "No se pudo crear la difusión: {error}",
      "unknownErrorLower": "error desconocido",
      "insertRecipientBatchFailed": "No se pudo insertar el lote de destinatarios {batch}: {error}",
      "fetchRecipientsFailed": "No se pudieron obtener los destinatarios de la difusión",
      "apiRequestFailed": "Falló la solicitud a la API de difusión",
      "noPhoneOnContact": "El contacto no tiene número de teléfono",
      "unknownError": "Error desconocido"
    }
  },
  "Automations": {
    "list": {
      "title": "Automatizaciones",
      "subtitle": "Crea flujos de trabajo que reaccionan automáticamente a eventos de WhatsApp®.",
      "create": "Crear automatización",
      "retry": "Reintentar",
      "templatesTitle": "Plantillas de inicio rápido",
      "emptyTitle": "Aún no hay automatizaciones",
      "emptyDesc": "Elige una plantilla de arriba o crea una desde cero.",
      "runs": "{count} ejecución",
      "runsPlural": "{count} ejecuciones",
      "lastRun": "última {time}",
      "activate": "Activar",
      "deactivate": "Desactivar",
      "edit": "Editar",
      "duplicate": "Duplicar",
      "viewLogs": "Ver registros",
      "delete": "Eliminar",
      "cancel": "Cancelar",
      "deleteTitle": "Eliminar automatización",
      "deleteDesc": "Esto elimina permanentemente {name} y su historial de ejecuciones. No se puede deshacer.",
      "activeIndicator": "activa",
      "openMenu": "Abrir menú",
      "toasts": {
        "activated": "Automatización activada",
        "paused": "Automatización pausada",
        "duplicated": "Automatización duplicada",
        "deleted": "Automatización eliminada",
        "updateError": "Error al actualizar",
        "duplicateError": "Error al duplicar",
        "deleteError": "Error al eliminar"
      },
      "loadFailed": "No se pudieron cargar las automatizaciones"
    },
    "edit": {
      "loading": "Cargando...",
      "loadError": "Error al cargar ({status})",
      "back": "Volver a automatizaciones"
    },
    "logs": {
      "title": "Registros de ejecución",
      "loadError": "Error al cargar los registros",
      "emptyTitle": "Aún no hay ejecuciones",
      "emptyDesc": "Activa esta automatización para ver sus ejecuciones aquí.",
      "unknownContact": "Contacto desconocido",
      "step": "{count} paso",
      "stepPlural": "{count} pasos",
      "noSteps": "No se registraron pasos.",
      "status": {
        "success": "éxito",
        "partial": "parcial",
        "failed": "fallida"
      },
      "back": "Atrás",
      "backAria": "Atrás"
    },
    "relative": {
      "never": "nunca",
      "justNow": "justo ahora",
      "minutesAgo": "hace {n}min",
      "hoursAgo": "hace {n}h",
      "daysAgo": "hace {n}d"
    },
    "builder": {
      "steps": {
        "send_message": "Enviar mensaje",
        "send_buttons": "Enviar botones",
        "send_list": "Enviar lista",
        "send_template": "Enviar plantilla",
        "add_tag": "Agregar etiqueta",
        "remove_tag": "Quitar etiqueta",
        "assign_conversation": "Asignar conversación",
        "update_contact_field": "Actualizar campo del contacto",
        "create_deal": "Crear negocio",
        "wait": "Esperar",
        "condition": "Condición (Si/Si no)",
        "send_webhook": "Enviar webhook",
        "close_conversation": "Cerrar conversación"
      },
      "triggers": {
        "new_message_received": {
          "label": "Nuevo mensaje recibido",
          "hint": "Cualquier mensaje entrante"
        },
        "first_inbound_message": {
          "label": "Primer mensaje del contacto",
          "hint": "La primera vez que este contacto te escribe (también funciona con contactos agregados manualmente)"
        },
        "keyword_match": {
          "label": "Palabra clave",
          "hint": "El mensaje contiene palabra(s) clave específica(s)"
        },
        "interactive_reply": {
          "label": "Respuesta de botón / lista",
          "hint": "El cliente toca un botón o fila de lista cuyo id coincide; encadena menús entre automatizaciones"
        },
        "new_contact_created": {
          "label": "Nuevo contacto creado",
          "hint": "Cuando un contacto se crea automáticamente a partir de un mensaje entrante"
        },
        "conversation_assigned": {
          "label": "Conversación asignada",
          "hint": "Cuando se asigna a un agente"
        },
        "tag_added": {
          "label": "Etiqueta agregada",
          "hint": "Cuando se agrega una etiqueta a un contacto"
        },
        "time_based": {
          "label": "Por horario",
          "hint": "Según una programación recurrente"
        }
      },
      "trigger": "Disparador",
      "triggerType": "Tipo de disparador",
      "keywords": "Palabras clave",
      "keywordsHint": "Lista separada por comas (p. ej. hola, ayuda, comprar)",
      "replyIds": "IDs de respuesta",
      "replyIdsHint": "si, no, mas_info",
      "replyIdsHelp": "IDs de botón/fila de lista separados por comas, coincidencia exacta. Usa los mismos ids que definiste en un paso Enviar botones / Enviar lista.",
      "schedule": "Programación",
      "scheduleHint": "Expresión cron (p. ej. 0 9 * * 1-5)",
      "schedulePlaceholder": "Expresión cron o HH:mm",
      "active": "Activa",
      "activeAria": "Activa",
      "save": "Guardar",
      "saveDraft": "Guardar borrador",
      "untitled": "Automatización sin título",
      "backToAutomations": "Volver a automatizaciones",
      "toasts": {
        "saved": "Automatización guardada",
        "created": "Automatización creada",
        "saveFailed": "Error al guardar",
        "issueAt": "en {path}"
      },
      "tags": {
        "select": "Selecciona una etiqueta…",
        "placeholder": "ID de etiqueta",
        "unknown": "{id} (etiqueta desconocida)"
      },
      "fields": {
        "name": "Nombre",
        "email": "Correo",
        "company": "Empresa",
        "customFields": "Campos personalizados",
        "unknown": "{id} (campo desconocido)"
      },
      "agents": {
        "select": "Selecciona un agente…",
        "placeholder": "ID de agente",
        "unknown": "{id} (agente desconocido)"
      },
      "pipelines": {
        "pipelineLabel": "Pipeline",
        "pipelineIdLabel": "ID del pipeline",
        "stageLabel": "Etapa",
        "stageIdLabel": "ID de la etapa",
        "selectPipeline": "Selecciona un pipeline…",
        "selectStage": "Selecciona una etapa…",
        "selectPipelineFirst": "Primero selecciona un pipeline…",
        "unknownPipeline": "{id} (pipeline desconocido)",
        "unknownStage": "{id} (etapa desconocida)"
      },
      "templates": {
        "templateLabel": "Plantilla",
        "templateNameLabel": "Nombre de la plantilla",
        "languageLabel": "Idioma",
        "select": "Selecciona una plantilla…",
        "unknown": "{name} ({lang}): no está en la lista de aprobadas",
        "unknownLang": "desconocido"
      },
      "branches": {
        "yes": "Sí",
        "no": "No"
      },
      "addStep": "Agregar paso",
      "moveUp": "Subir",
      "moveDown": "Bajar",
      "kindCondition": "Condición",
      "kindWait": "Espera",
      "kindAction": "Acción",
      "delete": "Eliminar",
      "config": {
        "messageText": "Texto del mensaje",
        "placeholderMessageText": "¡Hola! Gracias por escribirnos…",
        "tagLabel": "Etiqueta",
        "modeLabel": "Modo",
        "modes": {
          "round_robin": "Rotativo",
          "specific": "Agente específico"
        },
        "agentLabel": "Agente",
        "fieldLabel": "Campo",
        "valueLabel": "Valor",
        "placeholderValue": "Texto o {{ vars.x }} / {{ message.text }}",
        "titleLabel": "Título",
        "amountLabel": "Cantidad",
        "unitLabel": "Unidad",
        "units": {
          "minutes": "Minutos",
          "hours": "Horas",
          "days": "Días"
        },
        "subjectLabel": "Sujeto",
        "subjects": {
          "tag_presence": "Presencia de etiqueta",
          "contact_field": "Campo del contacto",
          "message_content": "Contenido del mensaje",
          "time_of_day": "Hora del día"
        },
        "operandLabel": "Operando",
        "placeholderTime": "HH:mm-HH:mm",
        "placeholderContact": "name / email / company",
        "placeholderTag": "id de etiqueta",
        "urlLabel": "URL",
        "headersLabel": "Encabezados",
        "placeholderHeaders": "{\"Authorization\": \"Bearer ...\"}",
        "bodyTemplateLabel": "Plantilla del cuerpo",
        "placeholderBody": "{\"id\": \"{{ contact.id }}\"}",
        "matchType": "Tipo de coincidencia",
        "matchContains": "Contiene",
        "matchWord": "Palabra completa",
        "matchWordHint": "Coincide con la palabra clave solo como palabra independiente, así \"k\" ya no se activa con \"thanks\". Ideal para palabras clave cortas en idiomas con espacios; usa Contiene para idiomas que se escriben sin espacios.",
        "matchExact": "Exacta",
        "waitForReply": "Esperar respuesta antes de continuar",
        "waitForReplyHint": "Se detiene aquí hasta que el cliente toque un botón o responda (hasta 24 h). Los pasos siguientes, incluido Si/Si no sobre el contenido del mensaje, usan esa respuesta.",
        "closeConversationHint": "Cambia el estado de la conversación a \"cerrada\". No requiere configuración."
      },
      "preview": {
        "noText": "sin texto aún",
        "noBody": "sin cuerpo aún",
        "withWaitForReply": "{preview} · espera respuesta",
        "pickTemplate": "elige una plantilla",
        "wait": "{amount} {unit}",
        "units": {
          "minutes": "minutos",
          "hours": "horas",
          "days": "días"
        },
        "when": "cuando {subject}",
        "noUrl": "sin URL"
      }
    }
  },
  "Flows": {
    "list": {
      "title": "Flujos",
      "beta": "Beta",
      "description": "Crea conversaciones de WhatsApp con ramificaciones y botones. Útil para menús, preguntas frecuentes y triaje antes de que intervenga una persona.",
      "newFlow": "Nuevo flujo",
      "statusDraft": "Borrador",
      "statusActive": "Activo",
      "statusArchived": "Archivado",
      "loadError": "No se pudieron cargar los flujos.",
      "createError": "No se pudo crear el flujo.",
      "cloneError": "Error al clonar",
      "deleteConfirm": "¿Eliminar \"{name}\"? Todas las ejecuciones activas terminarán de inmediato.",
      "deleteSuccess": "Flujo eliminado.",
      "deleteError": "No se pudo eliminar el flujo.",
      "emptyTitle": "Aún no hay flujos",
      "emptyDesc": "Crea tu primera conversación: un menú de bienvenida, una consulta de pedido, un bot de preguntas frecuentes. Los clientes tocan botones; el bot los lleva a la respuesta correcta (o al agente correcto).",
      "createFirst": "Crea tu primer flujo",
      "createTitle": "Crear un nuevo flujo",
      "createDesc": "Empieza desde una plantilla o desde cero.",
      "startTemplate": "Empezar desde una plantilla",
      "nodeCount": "{count} {count, plural, =1 {nodo} other {nodos}}",
      "startBlank": "O empieza en blanco",
      "placeholderName": "p. ej. Menú de bienvenida",
      "cancel": "Cancelar",
      "createBlank": "Crear flujo en blanco",
      "runCount": "{count} {count, plural, =1 {ejecución} other {ejecuciones}}",
      "edit": "Editar",
      "delete": "Eliminar",
      "triggerKeywordNone": "Se activa por palabra clave (ninguna definida)",
      "triggerKeyword": "Se activa con: {keywords}",
      "triggerFirstInbound": "Se activa con el primer mensaje entrante de un contacto",
      "triggerManual": "Activación manual",
      "cloneFailedStatus": "Error al clonar: {status}"
    },
    "edit": {
      "notFound": "Flujo no encontrado.",
      "backToFlows": "← Volver a flujos",
      "loadError": "No se pudo cargar el flujo."
    },
    "logs": {
      "title": "Ejecuciones",
      "description": "Las 50 ejecuciones más recientes de este flujo. Expande una fila para ver el registro paso a paso del motor.",
      "emptyState": "Aún no hay ejecuciones. Activa el flujo desde un número personal de WhatsApp para verlo aparecer aquí.",
      "loadError": "No se pudieron cargar las ejecuciones.",
      "unknownContact": "Contacto desconocido",
      "atNode": "en {node}",
      "started": "Iniciada {time}",
      "reprompts": "{count} repreguntas",
      "ranFor": "duró {duration}",
      "capturedVars": "Variables capturadas ({count})",
      "noEvents": "No se registraron eventos para esta ejecución.",
      "statusActive": "Activa",
      "statusCompleted": "Completada",
      "statusHandedOff": "Transferida",
      "statusTimedOut": "Tiempo agotado",
      "statusPaused": "Pausada por el agente",
      "statusFailed": "Fallida"
    },
    "builder": {
      "triggerTitle": "Disparador",
      "whenLabel": "Cuando…",
      "triggerKeywordTitle": "Un mensaje contiene una palabra clave",
      "triggerFirstInboundTitle": "Primer mensaje entrante del cliente",
      "triggerManualTitle": "Solo manual (sin activación automática)",
      "keywordsLabel": "Palabras clave (separadas por comas)",
      "keywordsPlaceholder": "soporte, ayuda, hola",
      "entryNodeTitle": "Nodo de entrada:",
      "entryNodePlaceholder": "Elige el primer nodo…",
      "nodesTitle": "Nodos ({count})",
      "nodesEmpty": "Agrega un nodo <strong>Inicio</strong>, luego un nodo <strong>Enviar botones</strong> y después una <strong>Transferencia</strong>: esa es la forma del menú de bienvenida del brief.",
      "addNode": "Agregar nodo",
      "setAsEntry": "Definir como entrada",
      "removeNode": "Quitar nodo",
      "showAdvanced": "Mostrar avanzado",
      "hideAdvanced": "Ocultar avanzado",
      "nodeKeyLabel": "Clave del nodo (identificador interno; mantenla estable para las analíticas)",
      "replyIdsHint": "Los IDs de respuesta de cada opción se muestran arriba. WhatsApp los devuelve cuando un cliente toca; normalmente no necesitas tocarlos.",
      "badgeEntry": "Entrada",
      "noNodesYet": "Aún no hay nodos.",
      "deleteNode": "Eliminar nodo",
      "canvasView": "Lienzo",
      "listView": "Lista",
      "noNodeSelected": "Ningún nodo seleccionado",
      "noNodeDesc": "Selecciona un nodo en el lienzo para editar su configuración.",
      "editorView": "Vista del editor",
      "form": {
        "advancesTo": "Avanza a",
        "textToCustomer": "Texto enviado al cliente",
        "promptToCustomer": "Pregunta enviada al cliente",
        "varKeyLabel": "Clave de la variable (guardada en flow_runs.vars; alfanumérica + guion bajo)",
        "varKeyPlaceholder": "p. ej. name, email, company",
        "varKeyHelp": "Interpólala en preguntas posteriores y notas de transferencia con",
        "advanceAfterCapture": "Después de capturar, avanzar a",
        "internalNote": "Nota interna (para el agente que la tome)",
        "endNodeHelp": "Nodo terminal. Cuando el ejecutor llega a este nodo, la ejecución se marca como completada. No requiere configuración.",
        "bodyText": "Texto del cuerpo",
        "footerText": "Pie (opcional, 60 caracteres)",
        "buttonsHelp": "Botones (1–3): cada uno lleva a un nodo siguiente distinto",
        "optionTitlePlaceholder": "Título visible (≤20 caracteres)",
        "nextNodePlaceholder": "Siguiente nodo…",
        "addButton": "Agregar botón",
        "buttonLabel": "Texto del botón para expandir (≤20 caracteres)",
        "rowsHelp": "Filas (1–10 en total entre todas las secciones)",
        "sectionTitlePlaceholder": "Título de la sección {count} (opcional)",
        "rowTitlePlaceholder": "Título de la fila (≤24)",
        "addRow": "Agregar fila",
        "addSection": "Agregar sección",
        "ifLabel": "Si",
        "capturedVariable": "Variable capturada",
        "contactHasTag": "El contacto tiene la etiqueta",
        "contactField": "Campo del contacto",
        "varName": "nombre de variable",
        "tagLabel": "Etiqueta",
        "fieldLabel": "Campo",
        "pickTag": "Elige una etiqueta…",
        "pickField": "Elige un campo…",
        "operatorLabel": "Operador",
        "isPresent": "está presente",
        "isAbsent": "está ausente",
        "equals": "es igual a",
        "contains": "contiene",
        "valueLabel": "Valor",
        "ifTrueAdvance": "Si es verdadero → avanzar a",
        "ifFalseAdvance": "Si es falso → avanzar a",
        "actionLabel": "Acción",
        "addTag": "Agregar etiqueta",
        "removeTag": "Quitar etiqueta",
        "tagUuidPlaceholder": "UUID de la etiqueta",
        "thenAdvanceTo": "Luego avanzar a",
        "mediaTypeLabel": "Tipo de archivo",
        "imageLabel": "Imagen (PNG, JPEG, WebP)",
        "videoLabel": "Video (MP4, 3GP)",
        "documentLabel": "Documento (PDF, Word, Excel, PowerPoint, TXT)",
        "fileLabel": "Archivo",
        "removeFile": "Quitar archivo",
        "uploading": "Subiendo…",
        "clickToUpload": "Haz clic para subir (máx. 16 MB)",
        "captionLabel": "Descripción (opcional, se muestra debajo del archivo)",
        "filenameLabel": "Nombre de archivo que ve el cliente (solo documentos)",
        "filenamePlaceholder": "factura.pdf",
        "advanceAfterSending": "Después de enviar, avanzar a",
        "pickNextNode": "Elige el siguiente nodo…",
        "none": "— Ninguno —",
        "removeSection": "Quitar sección",
        "fileUploaded": "Archivo subido.",
        "uploadFailed": "Error al subir.",
        "fileTooLarge": "El archivo pesa {size} MB; el límite es 16 MB.",
        "defaultOptionTitle": "Opción",
        "optionN": "Opción {n}"
      },
      "categories": {
        "messaging": "Mensajería",
        "logic": "Lógica y datos",
        "flow": "Control de flujo"
      },
      "nodes": {
        "start": {
          "label": "Inicio",
          "blurb": "Punto de entrada del flujo"
        },
        "send_message": {
          "label": "Enviar mensaje",
          "blurb": "Envía un mensaje de texto de WhatsApp"
        },
        "send_buttons": {
          "label": "Enviar botones",
          "blurb": "Envía botones de respuesta rápida"
        },
        "send_list": {
          "label": "Enviar lista",
          "blurb": "Envía una lista de opciones para tocar"
        },
        "send_media": {
          "label": "Enviar archivo",
          "blurb": "Envía una imagen, video o documento"
        },
        "collect_input": {
          "label": "Capturar respuesta",
          "blurb": "Hace una pregunta y guarda la respuesta"
        },
        "condition": {
          "label": "Si / si no",
          "blurb": "Ramifica según una regla"
        },
        "set_tag": {
          "label": "Etiquetar contacto",
          "blurb": "Agrega o quita una etiqueta del contacto"
        },
        "handoff": {
          "label": "Transferir a agente",
          "blurb": "Pasa la conversación a una persona"
        },
        "end": {
          "label": "Fin",
          "blurb": "Termina el flujo"
        }
      }
    },
    "validation": {
      "noIssues": "Sin problemas. Listo para activar.",
      "summary": "{errorCount} {errorCount, plural, =1 {error} other {errores}}, {warningCount} {warningCount, plural, =1 {advertencia} other {advertencias}}",
      "jumpToNode": "Ir al nodo {key}"
    },
    "editorState": {
      "saved": "Guardado.",
      "fixIssues": "Corrige los problemas de abajo antes de activar.",
      "statusActivated": "Flujo activado.",
      "statusArchived": "Archivado.",
      "statusDraft": "Guardado como borrador.",
      "deleteConfirm": "¿Eliminar \"{name}\"? Todas las ejecuciones activas terminan de inmediato. No se puede deshacer.",
      "defaultYes": "Sí",
      "defaultListButton": "Ver opciones",
      "saveFailedStatus": "Error al guardar: {status}",
      "saveFailed": "Error al guardar",
      "statusUpdateFailedStatus": "Error al actualizar el estado: {status}",
      "statusUpdateFailed": "Error al actualizar el estado",
      "deleteFailedStatus": "Error al eliminar: {status}",
      "deleteFailed": "Error al eliminar"
    },
    "summary": {
      "options": "{count} {count, plural, =1 {opción} other {opciones}}",
      "optionsAcrossSections": "{rowCount} {rowCount, plural, =1 {opción} other {opciones}} en {sectionCount} {sectionCount, plural, =1 {sección} other {secciones}}",
      "noFile": "{label} (sin archivo subido)",
      "media": "Archivo",
      "image": "Imagen",
      "video": "Video",
      "document": "Documento",
      "audio": "Audio",
      "hasTag": "tiene la etiqueta {tag}",
      "opContains": "contiene",
      "opExists": "existe",
      "opMissing": "falta",
      "modeAdd": "Agregar",
      "modeRemove": "Quitar",
      "tagPicked": "{mode} etiqueta {tag}…",
      "tagNone": "{mode} etiqueta (ninguna elegida)"
    },
    "header": {
      "backToFlows": "Volver a flujos",
      "namePlaceholder": "Nombre del flujo",
      "unsavedHint": "Cambios sin guardar; pulsa Guardar para conservarlos",
      "edited": "Editado",
      "runs": "Ejecuciones",
      "delete": "Eliminar",
      "pause": "Pausar",
      "activate": "Activar",
      "fixIssues": "Corrige los problemas de abajo antes de activar",
      "save": "Guardar",
      "descriptionPlaceholder": "Agrega una breve descripción (interna; los clientes no la ven)",
      "descriptionLabel": "Descripción del flujo"
    }
  },
  "Settings": {
    "pageTitle": "Configuración",
    "pageDesc": "Todo en un solo lugar: tu cuenta y tu espacio de trabajo. Elige una sección para administrarla.",
    "sectionsNav": "Secciones de configuración",
    "overview": {
      "notSetup": "Aún sin configurar",
      "connected": "Conectado",
      "needsReconnecting": "Necesita reconectarse",
      "viewTeamMembers": "Ver miembros del equipo",
      "membersCount": "{count} {count, plural, =1 {miembro} other {miembros}}",
      "pendingInvites": "{count} {count, plural, =1 {invitación pendiente} other {invitaciones pendientes}}",
      "manageTemplates": "Administrar plantillas de mensaje",
      "templatesCount": "{count} {count, plural, =1 {plantilla} other {plantillas}}",
      "pendingReview": "{count} en revisión",
      "tagsAndFields": "Etiquetas y campos personalizados",
      "tagsCount": "{count} {count, plural, =1 {etiqueta} other {etiquetas}}",
      "fieldsCount": "{count} {count, plural, =1 {campo personalizado} other {campos personalizados}}",
      "appearance": "modo {mode} · acento {theme}",
      "yourAccount": "Tu cuenta",
      "loading": "Cargando…"
    },
    "members": {
      "title": "Miembros del equipo",
      "description": "Personas con acceso a esta cuenta. Los roles controlan lo que cada compañero puede hacer.",
      "inviteMember": "Invitar miembro",
      "online": "en línea",
      "away": "ausente",
      "offline": "desconectado",
      "memberCount": "{count} {count, plural, =1 {miembro} other {miembros}}",
      "you": "Tú",
      "unnamed": "Sin nombre",
      "joined": "Se unió el {date}",
      "remove": "Quitar",
      "removedToast": "{name} eliminado",
      "updatedToast": "{name} actualizado a {role}",
      "pendingInvitations": "Invitaciones pendientes",
      "inviteHint": "Por seguridad, la URL de la invitación en texto plano solo se muestra una vez, al crearla. Para volver a compartirla, revoca la invitación abajo y crea una nueva.",
      "noPendingTitle": "No hay invitaciones pendientes.",
      "noPendingDesc": "Haz clic en <bold>Invitar miembro</bold> arriba para generar un enlace para compartir.",
      "untitledInvite": "Invitación sin título",
      "created": "Creada el {date}",
      "expiresInDays": "expira en {days} {days, plural, =1 {día} other {días}}",
      "expiresInHours": "expira en {hours} {hours, plural, =1 {hora} other {horas}}",
      "expired": "expirada",
      "revoke": "Revocar",
      "revokedToast": "Invitación revocada",
      "loadFailed": "Error al cargar los miembros",
      "loadInvitationsFailed": "Error al cargar las invitaciones",
      "updateRoleFailed": "Error al actualizar el rol",
      "removeFailed": "Error al quitar al miembro",
      "revokeFailed": "Error al revocar la invitación",
      "networkError": "No se pudo conectar con el servidor",
      "memberAlt": "Miembro",
      "removeDialogTitle": "Quitar miembro",
      "removeDialogDesc": "¿Quitar a <bold>{name}</bold> de la cuenta? Se cerrará su sesión en esta cuenta y recibirá una cuenta personal nueva en su próximo inicio de sesión. Su acceso no se elimina.",
      "cancel": "Cancelar",
      "removing": "Quitando...",
      "removeBtn": "Quitar miembro"
    },
    "invite": {
      "inviteCreated": "Invitación creada",
      "inviteCreatedDesc": "Comparte este enlace con tu nuevo compañero. Podrá registrarse (o iniciar sesión) y unirse a la cuenta como <bold>{role}</bold>. El enlace es válido por <bold>{days} {days, plural, =1 {día} other {días}}</bold>.",
      "inviteLink": "Enlace de invitación",
      "copy": "Copiar",
      "saveLinkNow": "Guarda este enlace ahora.",
      "saveLinkHint": "Nunca almacenamos el texto plano: cuando cierres este diálogo, la URL desaparece. Para volver a compartirla, revoca esta invitación y crea una nueva.",
      "sendViaWhatsApp": "Enviar por WhatsApp",
      "done": "Listo",
      "dialogTitle": "Invitar a un compañero",
      "networkError": "No se pudo conectar con el servidor. ¿Intentar de nuevo?",
      "fallbackAccountName": "nuestra cuenta de wacrm",
      "dialogDesc": "Genera un enlace de invitación de un solo uso. Compártelo por WhatsApp, Slack o el canal que prefieras; no se necesita servicio de correo.",
      "roleLabel": "Rol",
      "validForLabel": "Enlace válido por",
      "days1": "1 día",
      "days7": "7 días",
      "days30": "30 días",
      "labelTitle": "Etiqueta",
      "optional": "(opcional)",
      "labelPlaceholder": "p. ej. Sara — equipo de soporte",
      "labelHint": "Te ayuda a recordar a quién enviaste el enlace en la lista de pendientes de abajo.",
      "cancel": "Cancelar",
      "creating": "Creando...",
      "generateLink": "Generar enlace",
      "labelTooLong": "La etiqueta debe tener {max} caracteres o menos",
      "copied": "Enlace de invitación copiado",
      "clipboardBlocked": "Portapapeles bloqueado: copia el enlace manualmente",
      "whatsappMessage": "Únete a {accountName} en wacrm con este enlace (válido por {expiresInDays} días): {url}",
      "createFailed": "No se pudo crear la invitación"
    },
    "tagsAndFields": {
      "title": "Campos y etiquetas",
      "description": "Dos formas de organizar contactos: etiquetas de colores para agrupar rápido y campos personalizados para datos estructurados.",
      "tagsTitle": "Etiquetas",
      "tagsDesc": "Rótulos de colores para agrupar y filtrar contactos.",
      "fieldsTitle": "Campos personalizados",
      "fieldsDesc": "Campos adicionales para los contactos (p. ej. código postal, origen del lead). Aparecen en todos los contactos y en la acción de automatización “Actualizar campo del contacto”.",
      "adminRole": "Administrador",
      "failedToLoadTags": "Error al cargar las etiquetas",
      "nameRequired": "El nombre de la etiqueta es obligatorio",
      "notAuthenticated": "No autenticado",
      "tagCreated": "Etiqueta creada",
      "failedToCreateTag": "Error al crear la etiqueta",
      "tagDeleted": "Etiqueta eliminada",
      "failedToDeleteTag": "Error al eliminar la etiqueta",
      "deleteAria": "Eliminar {name}",
      "noTags": "Aún no hay etiquetas; crea la primera abajo.",
      "placeholder": "p. ej. Newsletter",
      "useColor": "Usar {color}",
      "addTag": "Agregar etiqueta",
      "deleteTag": "Eliminar etiqueta",
      "deleteConfirm": "¿Eliminar la etiqueta \"{name}\"? Se quitará de todos los contactos y no se puede deshacer.",
      "cancel": "Cancelar",
      "deleting": "Eliminando...",
      "colors": {
        "red": "Rojo",
        "orange": "Naranja",
        "amber": "Ámbar",
        "emerald": "Esmeralda",
        "cyan": "Cian",
        "blue": "Azul",
        "violet": "Violeta",
        "pink": "Rosa"
      }
    },
    "templates": {
      "title": "Plantillas de mensaje",
      "description": "Crea plantillas y envíalas a Meta para su aprobación. Usa \"Sincronizar desde Meta\" para traer plantillas aprobadas en otro lugar.",
      "syncFromMeta": "Sincronizar desde Meta",
      "qualityScoreTitle": "Puntuación de calidad de Meta",
      "headerTextLabel": "Texto del encabezado",
      "editFailedHttp": "Error al editar (HTTP {status})",
      "submitFailedHttp": "Error al enviar (HTTP {status})",
      "syncing": "Sincronizando…",
      "syncTitle": "Traer las plantillas aprobadas de tu cuenta de WhatsApp Business en Meta",
      "newTemplate": "Nueva plantilla",
      "noTemplates": "Aún no hay plantillas.",
      "createFirst": "Crea tu primera plantilla de mensaje para empezar.",
      "editTitle": "Editar provoca una nueva revisión de Meta: el estado vuelve a PENDIENTE.",
      "editLabel": "Editar plantilla",
      "edit": "Editar",
      "resubmitTitle": "Edita la plantilla y reenvíala a Meta para su revisión.",
      "resubmitLabel": "Editar y reenviar plantilla",
      "resubmit": "Reenviar",
      "deleteMetaLocallyAria": "Eliminar plantilla de Meta y localmente",
      "deleteLocallyAria": "Eliminar plantilla localmente",
      "deleteMetaLocallyTitle": "Eliminar de Meta y localmente",
      "deleteLocallyTitle": "Eliminar localmente",
      "dialogEditTitle": "Editar plantilla de mensaje",
      "dialogNewTitle": "Nueva plantilla de mensaje",
      "dialogEditDesc": "Guarda tus cambios para reenviarla a Meta. El estado volverá a PENDIENTE durante la revisión.",
      "dialogNewDesc": "Crea una plantilla y envíala a Meta para su aprobación. Una vez aprobada, podrás usarla en difusiones y en la bandeja de entrada.",
      "authWarning": "Las plantillas de AUTENTICACIÓN tienen un formato fijo de cuerpo + botón OTP que necesita otro constructor. Por ahora, créalas en el Administrador de WhatsApp de Meta y usa <bold>Sincronizar desde Meta</bold> para traerlas.",
      "templateName": "Nombre de la plantilla",
      "namePlaceholder": "p. ej. order_confirmation",
      "nameFixed": "El nombre es fijo una vez que la plantilla existe en Meta; crea una plantilla nueva para cambiarlo.",
      "nameHint": "Solo letras minúsculas, dígitos y guiones bajos.",
      "category": "Categoría",
      "language": "Idioma",
      "langFixed": "El idioma es fijo una vez que la plantilla existe en Meta.",
      "langHint": "Debe coincidir exactamente con el código en Meta: <code>en_US</code> y <code>en</code> son distintos.",
      "header": "Encabezado",
      "headerNone": "Ninguno",
      "headerText": "Texto",
      "headerImage": "Imagen",
      "headerVideo": "Video",
      "headerDocument": "Documento",
      "headerTextPlaceholder": "Texto del encabezado (máx. 60 caracteres, {{1}} opcional)",
      "headerSampleAria": "Valor de ejemplo para la variable del encabezado",
      "headerSamplePlaceholder": "Valor de ejemplo para {{1}} (obligatorio para la revisión de Meta)",
      "uploadImage": "Subir imagen",
      "uploadVideo": "Subir video",
      "uploadDocument": "Subir documento",
      "uploadHint": "JPEG o PNG, ≤5 MB",
      "uploadHintVideo": "MP4 o 3GPP, ≤16 MB",
      "uploadHintDocument": "PDF, Word, PowerPoint, Excel o texto, ≤16 MB",
      "mediaUrlPlaceholder": "https://… (o pega un enlace público de {format})",
      "imageHint": "Sube un JPEG/PNG (≤5 MB, ≥800×418 px recomendado) o pega un enlace HTTPS público; lo subimos a Meta para su revisión automáticamente.",
      "mediaHint": "Sube un archivo o pega un enlace HTTPS público; lo subimos a Meta para su revisión automáticamente.",
      "videoHint": " MP4 o 3GPP, ≤16 MB, ≤60 segundos recomendado.",
      "documentHint": " PDF, Word, PowerPoint, Excel o texto, ≤100 MB por enlace (≤16 MB si se sube aquí).",
      "bodyText": "Texto del cuerpo",
      "bodyPlaceholder": "Hola {{1}}, tu pedido {{2}} está confirmado.",
      "bodyHint": "Usa {{1}}, {{2}} para las variables (deben ser contiguas empezando en {{1}}).",
      "sampleValues": "Valores de ejemplo (Meta los usa para revisar tu plantilla)",
      "sampleAria": "Valor de ejemplo para la variable del cuerpo {var}",
      "samplePlaceholder": "Ejemplo para {var}",
      "footer": "Pie (opcional)",
      "footerPlaceholder": "Texto de pie opcional (máx. 60 caracteres)",
      "buttons": "Botones (opcional)",
      "addButton": "Agregar botón",
      "buttonsLimit": "Hasta {max} botones. Los botones QUICK_REPLY deben ir antes de los botones de URL / teléfono / copiar código.",
      "btnQuickReply": "Respuesta rápida",
      "btnUrl": "URL",
      "btnPhone": "Teléfono",
      "btnCopyCode": "Copiar código",
      "btnLabelPlaceholder": "Texto del botón",
      "urlPlaceholder": "https://example.com/path o con sufijo {{1}}",
      "urlSamplePlaceholder": "Valor de ejemplo para {{1}} (obligatorio cuando la URL tiene una variable)",
      "phonePlaceholder": "+15551234567",
      "codePlaceholder": "Código de ejemplo (p. ej. VERANO20)",
      "cancel": "Cancelar",
      "saving": "Guardando…",
      "submitting": "Enviando…",
      "saveResubmit": "Guardar y reenviar",
      "submitApproval": "Enviar para aprobación",
      "deleteDialogTitle": "¿Eliminar plantilla?",
      "deleteMetaDesc": "\"{name}\" se eliminará de Meta y de wacrm. Las difusiones activas que usen esta plantilla empezarán a fallar en su próximo envío. No se puede deshacer.",
      "deleteLocalDesc": "\"{name}\" se eliminará de wacrm. Nunca se envió a Meta, así que no hace falta limpieza remota.",
      "deleting": "Eliminando…",
      "delete": "Eliminar",
      "toastLoadFailed": "Error al cargar las plantillas",
      "toastSubmitFailed": "Error al enviar",
      "toastSubmitEditSuccess": "Edición enviada; Meta suele revisar en menos de 24 horas.",
      "toastSubmitNewSuccess": "Enviada a Meta; el tiempo de revisión habitual es de 24 horas. El estado se actualiza automáticamente.",
      "toastSaveEditDry": "Plantilla actualizada (simulación, sin llamada a Meta)",
      "toastSaveNewDry": "Plantilla guardada (simulación, sin llamada a Meta)",
      "toastSyncCount": "{total} {total, plural, =1 {plantilla sincronizada} other {plantillas sincronizadas}} desde Meta",
      "toastSyncDetails": " ({inserted} nuevas, {updated} actualizadas)",
      "toastSyncFailed": "Error al sincronizar: {preview}",
      "toastSyncTruncated": "Solo se sincronizaron las primeras 2000 plantillas; tu cuenta tiene más. Sincroniza de nuevo para continuar o contacta a soporte si esto persiste.",
      "toastSyncError": "Error al sincronizar las plantillas",
      "toastDeleteSuccess": "Plantilla eliminada",
      "toastDeleteError": "Error al eliminar la plantilla",
      "toastInvalidImage": "La imagen del encabezado debe ser JPEG o PNG.",
      "toastInvalidVideo": "El video del encabezado debe ser un archivo MP4 o 3GPP.",
      "toastInvalidDocument": "El documento del encabezado debe ser un archivo PDF, Word, PowerPoint, Excel o de texto.",
      "toastMediaTooLarge": "El archivo pesa {size} MB; el límite de carga es {max} MB.",
      "toastUploadSuccess": "Archivo subido.",
      "toastUploadFailed": "Error al subir.",
      "syncFailedHttp": "Falló la sincronización (HTTP {status})",
      "deleteFailedHttp": "Falló la eliminación (HTTP {status})",
      "syncMoreSuffix": ", +{count} más",
      "headerSampleAlt": "Ejemplo de encabezado",
      "categoryLabels": {
        "Marketing": "Marketing",
        "Utility": "Utilidad",
        "Authentication": "Autenticación"
      }
    },
    "roles": {
      "admin": "Administrador",
      "adminHint": "Administra miembros + todo lo demás",
      "agent": "Agente",
      "agentHint": "Usa las funciones; sin configuración",
      "viewer": "Observador",
      "viewerHint": "Solo lectura en toda la app",
      "owner": "Propietario",
      "ownerHint": "Control total de la cuenta y la facturación"
    },
    "whatsapp": {
      "title": "Conexión con WhatsApp",
      "description": "Conecta tu API de WhatsApp Business de Meta. Credenciales, webhook y pasos de configuración, todo está aquí.",
      "tokenCorrupted": "No se puede descifrar el token almacenado",
      "resetting": "Restableciendo...",
      "resetConfig": "Restablecer configuración",
      "credentialsValid": "Credenciales válidas",
      "notConnected": "No conectado",
      "connectedDesc": "Tu token de acceso se autentica con Meta. Revisa el estado de registro abajo para saber si los webhooks están realmente conectados.",
      "notConnectedDesc": "Configura abajo tus credenciales de la API de Meta para conectar tu cuenta de WhatsApp Business.",
      "registered": "Registrado: Meta entregará los eventos a wacrm",
      "notRegistered": "No registrado: Meta no entregará eventos",
      "verifyWithMeta": "Verificar con Meta",
      "subscribedSince": "Suscrito desde {date}. Haz clic en Verificar con Meta si los eventos dejan de llegar.",
      "unknownDate": "desconocida",
      "lastAttemptFailed": "El último intento falló con: ",
      "retryHint": "Ingresa (o corrige) el PIN de dos pasos abajo y haz clic en Guardar configuración para reintentar.",
      "noRegistrationHint": "Este número se guardó antes de que existiera el seguimiento de registro, o el registro se omitió. Ingresa el PIN de dos pasos abajo y haz clic en Guardar configuración para suscribirlo.",
      "diagnosticLastRun": "Diagnóstico — última ejecución: ",
      "live": "activo",
      "notLive": "inactivo",
      "apiCredentialsTitle": "Credenciales de la API",
      "apiCredentialsDesc": "Ingresa tus credenciales de la API de WhatsApp Business de Meta.",
      "phoneNumberId": "Phone Number ID",
      "wabaId": "ID de la cuenta de WhatsApp Business",
      "accessToken": "Token de acceso permanente",
      "accessTokenPlaceholder": "Ingresa tu token de acceso",
      "tokenHidden": "El token está oculto por seguridad. Vuelve a ingresarlo para actualizar la configuración.",
      "webhookVerifyToken": "Token de verificación del webhook",
      "webhookVerifyTokenPlaceholder": "Crea un token de verificación personalizado",
      "webhookVerifyTokenHint": "Una cadena personalizada que tú creas. Debe coincidir con el token que configuraste en los ajustes de webhook de Meta.",
      "webhookVerifyTokenSaved": "Guardado. Déjalo así para conservarlo o escribe un valor nuevo para rotarlo.",
      "twoStepPin": "PIN de verificación en dos pasos",
      "optional": "(opcional)",
      "pinPlaceholder": "PIN de 6 dígitos del Administrador de WhatsApp de Meta",
      "pinHint": "Solo se necesita para recibir mensajes entrantes en un número de producción. Configúralo en Meta Business Manager → Cuentas de WhatsApp → Números de teléfono → Verificación en dos pasos y pégalo aquí para que wacrm pueda suscribir el número; de lo contrario, Meta envía los eventos entrantes a la última app que reclamó el número (el síntoma que afecta a segundos números bajo una WABA compartida). Los números de prueba de Meta no tienen PIN y ya vienen registrados: déjalo en blanco para ellos. Dejarlo en blanco también mantiene intacto un registro existente.",
      "webhookTitle": "Configuración del webhook",
      "webhookDesc": "Usa esta URL como callback del webhook en el panel de la app de Meta.",
      "webhookUrl": "URL de callback del webhook",
      "mediaTitle": "Almacenamiento de adjuntos",
      "mediaDesc": "Meta elimina los archivos recibidos unos 30 días después de su llegada. Los adjuntos pueden copiarse a tu propio almacenamiento para que sigan visibles.",
      "mirrorInbound": "Conservar adjuntos entrantes",
      "mirrorInboundDesc": "Guarda una copia de cada foto, video, nota de voz y documento que envían los clientes. Usa tu almacenamiento de Supabase; los archivos de más de 16 MB se omiten.",
      "mirrorInboundOffWarning": "Los nuevos adjuntos dejarán de copiarse y quedarán inaccesibles unos 30 días después de su llegada.",
      "mirrorInboundSaveFailed": "No se pudo actualizar la configuración de adjuntos.",
      "loadFailed": "Error al cargar la configuración de WhatsApp",
      "phoneNumberIdRequired": "El Phone Number ID es obligatorio",
      "accessTokenRequired": "El token de acceso es obligatorio para la configuración inicial",
      "reenterAccessToken": "Vuelve a ingresar el token de acceso para guardar los cambios",
      "saveFailed": "Error al guardar la configuración",
      "savedButRegistrationFailed": "Guardado, pero Meta no pudo registrar el número: {error}",
      "savedRegistrationSkipped": "Credenciales guardadas y verificadas. El registro de entrada se omitió (sin PIN); revisa el estado de registro abajo.",
      "liveWithName": "Activo: {name} ya puede recibir eventos.",
      "connectedGeneric": "WhatsApp conectado. Los eventos empezarán a llegar en menos de un minuto.",
      "connectedTo": "Conectado a {name}",
      "apiConnectionOk": "Conexión con la API exitosa",
      "apiConnectionFailed": "Error de conexión con la API",
      "connectionTestFailed": "La prueba de conexión falló. Revisa la red e inténtalo de nuevo.",
      "fullyWired": "El número está completamente conectado: Meta está entregando eventos.",
      "notFullyRegistered": "El número no está completamente registrado. Revisa abajo qué paso falló.",
      "verifyEndpointUnreachable": "No se pudo acceder al endpoint de verificación.",
      "resetConfirm": "Esto eliminará la configuración actual de WhatsApp para que puedas ingresarla de nuevo. ¿Continuar?",
      "resetFailed": "Error al restablecer la configuración",
      "resetDone": "Configuración borrada. Ya puedes volver a ingresar tus credenciales.",
      "webhookCopied": "URL del webhook copiada al portapapeles",
      "phoneNumberIdPlaceholder": "p. ej. 100234567890123",
      "wabaIdPlaceholder": "p. ej. 100234567890456",
      "saving": "Guardando...",
      "saveConfig": "Guardar configuración",
      "testing": "Probando...",
      "testConnection": "Probar conexión con la API",
      "setupInstructions": "Instrucciones de configuración",
      "setupInstructionsDesc": "Sigue estos pasos para conectar tu API de WhatsApp Business.",
      "step1": "Crea una app en Meta",
      "step1_1": "Ve a developers.facebook.com",
      "step1_2": "Haz clic en \"Mis apps\" y luego en \"Crear app\"",
      "step1_3": "Selecciona \"Empresa\" como tipo de app",
      "step1_4": "Completa los datos de la app y créala",
      "step2": "Agrega el producto WhatsApp",
      "step2_1": "En el panel de tu app, haz clic en \"Agregar producto\"",
      "step2_2": "Busca \"WhatsApp\" y haz clic en \"Configurar\"",
      "step2_3": "Sigue el asistente de configuración para vincular tu empresa",
      "step3": "Obtén las credenciales de la API",
      "step3_1": "Ve a WhatsApp > Configuración de la API",
      "step3_2": "Copia tu <strong class=\"text-foreground\">Phone Number ID</strong>",
      "step3_3": "Copia tu <strong class=\"text-foreground\">ID de la cuenta de WhatsApp Business</strong>",
      "step3_4": "Genera un <strong class=\"text-foreground\">Token de acceso permanente</strong> en Configuración del negocio > Usuarios del sistema",
      "step4": "Configura los webhooks",
      "step4_1": "Ve a WhatsApp > Configuración",
      "step4_2": "Haz clic en \"Editar\" en la sección Webhook",
      "step4_3": "Pega la <strong class=\"text-foreground\">URL de callback del webhook</strong> de arriba",
      "step4_4": "Ingresa el mismo <strong class=\"text-foreground\">Token de verificación</strong> que configuraste aquí",
      "step4_5": "Suscríbete al campo de webhook \"messages\"",
      "metaDocs": "Documentación de la API de WhatsApp de Meta",
      "lastSaveFailed": "El último guardado falló",
      "metaErrorStep": "Paso",
      "metaErrorCode": "Código de error de Meta",
      "metaErrorTrace": "Trace ID",
      "metaErrorMessage": "Respuesta de Meta",
      "metaErrorDetailsHint": "Cita estos detalles al contactar al soporte de Meta.",
      "phoneNumberIdNotNumeric": "El Phone Number ID debe contener solo dígitos. Copia el id numérico desde Meta → WhatsApp → Configuración de la API, no el número de teléfono en sí.",
      "wabaIdNotNumeric": "El ID de la cuenta de WhatsApp Business debe contener solo dígitos. Cópialo desde Meta → WhatsApp → Configuración de la API.",
      "wabaSubscribed": "La cuenta de WhatsApp Business está suscrita a esta app: los webhooks entrantes pueden entregarse.",
      "wabaNotSubscribed": "La cuenta de WhatsApp Business no está suscrita a esta app, así que Meta no entregará webhooks entrantes. Vuelve a ingresar el token de acceso y guarda de nuevo para suscribirla."
    },
    "sections": {
      "overview": "Resumen",
      "profile": "Tu perfil",
      "security": "Acceso y seguridad",
      "appearance": "Apariencia",
      "whatsapp": "WhatsApp",
      "templates": "Plantillas",
      "quick-replies": "Respuestas rápidas",
      "fields": "Campos y etiquetas",
      "deals": "Negocios y moneda",
      "members": "Miembros del equipo",
      "api": "Claves de API"
    },
    "groups": {
      "account": "Cuenta",
      "workspace": "Espacio de trabajo"
    },
    "profile": {
      "title": "Tu perfil",
      "description": "Cómo te ves en la app. Tu avatar y nombre aparecen en el encabezado, la barra lateral y en cualquier lugar donde tus compañeros te vean.",
      "changePhoto": "Cambiar foto",
      "uploadPhoto": "Subir foto",
      "remove": "Quitar",
      "photoHint": "PNG, JPG, WebP o GIF. Hasta 2 MB.",
      "unknownError": "Error desconocido",
      "displayName": "Nombre para mostrar",
      "email": "Correo electrónico",
      "emailChangeHint": "Revisa la bandeja de entrada de <bold>{oldEmail}</bold> y de <bold>{newEmail}</bold>; ambas deben confirmar antes de que el cambio surta efecto.",
      "accountDetails": "Detalles de la cuenta",
      "role": "Rol",
      "joined": "Se unió",
      "userId": "ID de usuario",
      "loading": "Cargando tu perfil…",
      "saving": "Guardando…",
      "saveChanges": "Guardar cambios",
      "unsupportedImage": "Tipo de imagen no compatible",
      "unsupportedImageDesc": "Usa PNG, JPG, WebP o GIF.",
      "imageTooLarge": "La imagen es demasiado grande",
      "imageTooLargeDesc": "Máximo 2 MB.",
      "nameRequired": "El nombre para mostrar es obligatorio",
      "invalidEmail": "Ingresa una dirección de correo válida",
      "uploadFailed": "Error al subir: {message}",
      "saveFailed": "Error al guardar: {message}",
      "profileSaved": "Perfil guardado",
      "emailChangeFailed": "Error al cambiar el correo: {message}",
      "profileSavedEmailCheck": "Perfil guardado; revisa tu correo para confirmar el cambio de dirección",
      "passwordTitle": "Contraseña",
      "passwordDesc": "Usa al menos {min} caracteres. Seguirás con la sesión iniciada en este dispositivo después de cambiarla.",
      "currentPassword": "Contraseña actual",
      "newPassword": "Nueva contraseña",
      "confirmPassword": "Confirmar nueva contraseña",
      "updating": "Actualizando…",
      "updatePassword": "Actualizar contraseña",
      "cannotChangeNoEmail": "No se puede cambiar la contraseña sin un correo actual",
      "passwordTooShort": "La contraseña debe tener al menos {min} caracteres",
      "passwordMismatch": "La nueva contraseña y la confirmación no coinciden",
      "currentPasswordIncorrect": "La contraseña actual es incorrecta",
      "passwordUpdateFailed": "Error al actualizar la contraseña: {message}",
      "passwordUpdated": "Contraseña actualizada",
      "sessionsTitle": "Sesiones activas",
      "sessionsDesc": "Cierra sesión en todos los dispositivos donde estés conectado, incluido este. Útil si perdiste una laptop o compartiste tu contraseña.",
      "signOutAll": "Cerrar sesión en todos los dispositivos",
      "signOutConfirmTitle": "¿Cerrar sesión en todas partes?",
      "signOutConfirmDesc": "Se cerrará la sesión de todos los dispositivos conectados a esta cuenta y tendrán que iniciar sesión de nuevo. Se te redirigirá a la página de inicio de sesión.",
      "cancel": "Cancelar",
      "signingOut": "Cerrando sesión…",
      "signOutEverywhere": "Cerrar sesión en todas partes",
      "signOutFailed": "Error al cerrar sesión: {message}",
      "avatarAlt": "Avatar",
      "fullNamePlaceholder": "María García"
    },
    "appearance": {
      "title": "Apariencia",
      "description": "Define el modo y el color de acento que se usan en toda la app. Se guarda en este dispositivo; pruébalo, cambia al instante.",
      "mode": "Modo",
      "colorMode": "Modo de color",
      "useMode": "Usar el modo {mode}",
      "active": "Activo",
      "accentColor": "Color de acento",
      "useTheme": "Usar el tema {name}",
      "themeId": "ID del tema: {id}"
    },
    "security": {
      "title": "Acceso y seguridad",
      "description": "Cambia tu contraseña y cierra sesión en tus dispositivos. Esto mantiene tu cuenta segura."
    },
    "browserNotifications": {
      "title": "Notificaciones del navegador",
      "description": "Recibe una alerta de escritorio por cada nuevo mensaje de cliente, incluso cuando estés en otra página. Se guarda en este dispositivo.",
      "toggleLabel": "Avisarme de nuevos mensajes de clientes",
      "toggleDesc": "Solo funciona mientras la app esté abierta en una pestaña del navegador.",
      "statusGranted": "Permitido por tu navegador.",
      "statusDefault": "Al activarlo, tu navegador pedirá permiso.",
      "statusDenied": "Bloqueado en la configuración del navegador",
      "deniedHint": "Permite las notificaciones de este sitio en la configuración de sitios de tu navegador (normalmente el ícono de candado junto a la barra de direcciones) y luego recarga la página.",
      "unsupported": "Este navegador no admite notificaciones de escritorio.",
      "sendTest": "Enviar notificación de prueba",
      "testTitle": "Notificación de prueba",
      "testBody": "Las notificaciones funcionan. Los nuevos mensajes de clientes aparecerán así.",
      "permissionDeniedToast": "Tu navegador bloqueó las notificaciones",
      "labels": {
        "fallbackTitle": "Nuevo mensaje",
        "image": "📷 Foto",
        "audio": "🎤 Mensaje de voz",
        "video": "🎬 Video",
        "document": "📄 Documento",
        "location": "📍 Ubicación",
        "template": "📋 Plantilla"
      }
    },
    "apiKeys": {
      "title": "Claves de API",
      "description": "Las claves autentican la API REST pública (<apiCode>/api/v1</apiCode>) para que construyas tus propias automatizaciones. Envíalas como <headerCode>Authorization: Bearer &lt;key&gt;</headerCode>.",
      "newApiKey": "Nueva clave de API",
      "noApiKeys": "Aún no hay claves de API.",
      "createOneHint": "Haz clic en <bold>Nueva clave de API</bold> para crear una.",
      "askAdminHint": "Pide a un administrador que cree una.",
      "revoked": "Revocada",
      "expired": "Expirada",
      "noScopes": "Sin alcances",
      "created": "Creada el {date}",
      "lastUsed": "último uso {date}",
      "neverUsed": "nunca usada",
      "expires": "expira {date}",
      "revoke": "Revocar",
      "revokeSuccess": "\"{name}\" revocada",
      "revokeFailed": "Error al revocar la clave",
      "loadFailed": "Error al cargar las claves de API",
      "createError": "Error al crear la clave",
      "nameRequired": "Ponle un nombre a la clave",
      "nameLabel": "Nombre",
      "namePlaceholder": "p. ej. Automatización de Zapier",
      "scopesLabel": "Alcances",
      "scopesHint": "Una clave sin alcances aún puede llamar a <code>GET /api/v1/me</code> para verificar que funciona.",
      "cancel": "Cancelar",
      "creating": "Creando…",
      "createKey": "Crear clave",
      "copyTitle": "Copia tu clave de API",
      "copyDesc": "Esta es la única vez que se muestra la clave completa. Guárdala en un lugar seguro; si la pierdes, revócala y crea una nueva.",
      "apiKeyLabel": "Clave de API",
      "copy": "Copiar",
      "copySuccess": "Clave de API copiada",
      "copyFailed": "Error al copiar: selecciona y copia manualmente",
      "newKeyTitle": "Nueva clave de API",
      "newKeyDesc": "Nómbrala según la integración que la usará y concede solo los alcances que necesite.",
      "done": "Listo",
      "networkError": "No se pudo conectar con el servidor"
    },
    "deals": {
      "title": "Negocios y moneda",
      "description": "La moneda que se usa para los nuevos negocios y para los totales del pipeline y del panel.",
      "defaultCurrency": "Moneda predeterminada",
      "defaultCurrencyDesc": "Los nuevos negocios usan esta moneda por defecto, y los totales del pipeline y del panel se muestran en ella. Los negocios existentes conservan la moneda con la que se guardaron.",
      "currencyLabel": "Moneda",
      "adminOnlyHint": "Solo los administradores de la cuenta pueden cambiar la moneda predeterminada.",
      "save": "Guardar",
      "saving": "Guardando...",
      "saveFailed": "Error al guardar la moneda predeterminada",
      "saveSuccess": "Moneda predeterminada actualizada"
    },
    "aiConfig": {
      "title": "Configuración del agente",
      "description": "Usa tu propia clave de OpenAI, Anthropic o de una API compatible con OpenAI. wacrm llama al proveedor directamente con tu clave, sin cargos de IA por puesto, y tus datos siguen siendo tuyos. Esto impulsa las respuestas redactadas por IA, el bot de respuesta automática y el Playground.",
      "adminOnlyConfig": "Solo los administradores y propietarios pueden cambiar la configuración de IA.",
      "loadFailed": "Error al cargar la configuración de IA",
      "providerAndKey": "Proveedor y clave",
      "encryptionNotice": "Tu clave se cifra en reposo (AES-256-GCM) y no se vuelve a mostrar después de guardarla.",
      "provider": "Proveedor",
      "model": "Modelo",
      "apiKey": "Clave de API",
      "testKey": "Probar clave",
      "testSuccess": "La clave funciona: el proveedor respondió.",
      "testRejected": "El proveedor rechazó la solicitud.",
      "testNetworkError": "No se pudo conectar con el proveedor.",
      "embeddingsKey": "Clave de embeddings",
      "optionalSemanticSearch": "(opcional: habilita la búsqueda semántica en la base de conocimiento)",
      "embeddingsHint": "Una clave de OpenAI que se usa solo para generar embeddings de tu base de conocimiento (text-embedding-3-small){sameKeyText}. Déjala en blanco para usar búsqueda por palabras clave. Bórrala para desactivar la búsqueda semántica.",
      "sameKeyText": ": puede ser la misma clave de arriba",
      "behaviour": "Comportamiento",
      "behaviourDesc": "Cuéntale al asistente sobre tu negocio: productos, tono, qué puede y qué no puede prometer. Este contexto alimenta tanto los borradores como las respuestas automáticas.",
      "businessContext": "Contexto del negocio e instrucciones",
      "promptPlaceholder": "p. ej. Somos Acme, una tienda de equipos para café. Sé cálido y conciso. Nunca des precios ni fechas de entrega; deriva a una persona para eso.",
      "enableAssistant": "Activar asistente de IA",
      "enableAssistantDesc": "Interruptor general. Activa el botón “Redactar con IA” en la bandeja de entrada.",
      "autoReply": "Responder automáticamente a mensajes entrantes",
      "autoReplyDesc": "El bot responde automáticamente a los nuevos mensajes entrantes (solo cuando ningún flujo los atiende y no hay agente asignado). Deriva a una persona cuando no puede ayudar.",
      "maxAutoReplies": "Máximo de respuestas automáticas por conversación",
      "maxAutoRepliesDesc": "Después de esta cantidad de respuestas del bot en un mismo hilo, el bot guarda silencio.",
      "handoffTo": "Derivar a",
      "handoffToDesc": "Cuando el bot no puede ayudar, o alcanza el límite de respuestas, se pausa y dirige el chat aquí, con una breve nota de lo que pasó.",
      "handoffQueue": "Cola sin asignar (cualquier agente puede tomarlo)",
      "remove": "Quitar",
      "save": "Guardar",
      "missingModel": "Ingresa el nombre de un modelo.",
      "missingApiKey": "Ingresa tu clave de API.",
      "saveSuccess": "Asistente de IA guardado.",
      "saveFailed": "Error al guardar.",
      "removeSuccess": "Configuración de IA eliminada.",
      "removeFailed": "Error al eliminar.",
      "providerOpenAiCompatible": "API compatible con OpenAI",
      "baseUrl": "URL base",
      "baseUrlHint": "URL base de la API compatible con OpenAI, por ejemplo https://api.groq.com/openai/v1. /chat/completions se añade automáticamente, salvo que incluyas esa ruta.",
      "missingBaseUrl": "Introduce la URL base de la API compatible con OpenAI."
    },
    "aiKnowledge": {
      "loadFailed": "Error al cargar la base de conocimiento",
      "openFailed": "Error al abrir el documento",
      "titleContentRequired": "El título y el contenido son obligatorios.",
      "saveSuccessNew": "Documento agregado.",
      "saveSuccessUpdate": "Documento actualizado.",
      "saveFailed": "Error al guardar.",
      "removeSuccess": "Documento eliminado.",
      "removeFailed": "Error al eliminar.",
      "reindexSuccess": "{count} documento(s) reindexado(s).",
      "reindexFailed": "Error al reindexar.",
      "title": "Base de conocimiento",
      "description": "Agrega preguntas frecuentes, políticas o detalles de productos. El asistente recupera los fragmentos relevantes al redactar y responder automáticamente, para poder responder en lugar de derivar.{searchType}",
      "semanticSearchOn": " La búsqueda semántica está activada (clave de embeddings configurada).",
      "keywordSearchOn": " Usando búsqueda por palabras clave; agrega una clave de embeddings arriba para la búsqueda semántica.",
      "noDocs": "Aún no hay documentos.",
      "editDocTitle": "Título",
      "editDocTitlePlaceholder": "p. ej. Política de devoluciones y reembolsos",
      "editDocContent": "Contenido",
      "editDocContentPlaceholder": "Pega la respuesta de la pregunta frecuente, el texto de la política o los detalles del producto…",
      "cancel": "Cancelar",
      "saveDoc": "Guardar documento",
      "addDoc": "Agregar documento",
      "reindex": "Reindexar",
      "reindexTooltip": "Volver a generar los embeddings de todos los documentos (p. ej. después de agregar una clave de embeddings)",
      "editDoc": "Editar",
      "deleteDoc": "Eliminar",
      "loading": "Cargando…"
    },
    "quickReplies": {
      "nameRequired": "Ponle un nombre a la respuesta rápida.",
      "saveError": "No se pudo guardar la respuesta rápida.",
      "updated": "Respuesta rápida actualizada.",
      "created": "Respuesta rápida creada.",
      "deleteConfirm": "¿Eliminar esta respuesta rápida?",
      "deleteError": "No se pudo eliminar la respuesta rápida.",
      "title": "Respuestas rápidas",
      "description": "Fragmentos reutilizables (texto simple o un mensaje interactivo guardado) que los agentes pueden insertar desde el editor de la bandeja de entrada.",
      "new": "Nueva respuesta rápida",
      "edit": "Editar respuesta rápida",
      "empty": "Aún no hay respuestas rápidas. Crea una para reutilizarla en tus conversaciones.",
      "nameLabel": "Nombre",
      "namePlaceholder": "p. ej. Horario de atención",
      "kindText": "Texto",
      "kindInteractive": "Interactiva",
      "textPlaceholder": "El texto del mensaje que se insertará",
      "cancel": "Cancelar",
      "save": "Guardar"
    }
  },
  "SignupPage": {
    "passwordsMismatch": "Las contraseñas no coinciden",
    "passwordTooShort": "La contraseña debe tener al menos 6 caracteres",
    "checkEmailTitle": "Revisa tu correo",
    "checkEmailDesc": "Enviamos un enlace de confirmación a <strong>{email}</strong>. Revisa tu bandeja de entrada y haz clic en el enlace para verificar tu cuenta.",
    "backToSignIn": "Volver a iniciar sesión",
    "titleJoin": "Crear cuenta y unirse",
    "title": "Crear cuenta",
    "descJoin": "Verifica tu correo y luego acepta la invitación para unirte a tu equipo.",
    "desc": "Empieza a usar la Plantilla de CRM para WhatsApp",
    "fullNameLabel": "Nombre completo",
    "fullNamePlaceholder": "Juan Pérez",
    "emailLabel": "Correo electrónico",
    "emailPlaceholder": "you@example.com",
    "passwordLabel": "Contraseña",
    "passwordPlaceholder": "Al menos 6 caracteres",
    "confirmPasswordLabel": "Confirmar contraseña",
    "confirmPasswordPlaceholder": "Repite tu contraseña",
    "creating": "Creando cuenta...",
    "submit": "Crear cuenta",
    "haveAccount": "¿Ya tienes una cuenta?",
    "signIn": "Iniciar sesión"
  },
  "ForgotPasswordPage": {
    "checkEmailTitle": "Revisa tu correo",
    "checkEmailDesc": "Enviamos un enlace para restablecer la contraseña a <strong>{email}</strong>. Revisa tu bandeja de entrada.",
    "backToSignIn": "Volver a iniciar sesión",
    "title": "Restablecer contraseña",
    "desc": "Ingresa tu correo y te enviaremos un enlace para restablecerla",
    "emailLabel": "Correo electrónico",
    "emailPlaceholder": "you@example.com",
    "sending": "Enviando...",
    "sendLink": "Enviar enlace de restablecimiento"
  },
  "ResetPasswordPage": {
    "title": "Elige una nueva contraseña",
    "desc": "Ingresa una nueva contraseña para tu cuenta.",
    "passwordLabel": "Nueva contraseña",
    "passwordPlaceholder": "Al menos 6 caracteres",
    "confirmPasswordLabel": "Confirmar nueva contraseña",
    "confirmPasswordPlaceholder": "Repite la nueva contraseña",
    "submit": "Actualizar contraseña",
    "saving": "Actualizando...",
    "passwordsMismatch": "Las contraseñas no coinciden",
    "passwordTooShort": "La contraseña debe tener al menos 6 caracteres",
    "checking": "Comprobando tu enlace...",
    "expiredTitle": "Este enlace ya no es válido",
    "expiredDesc": "Los enlaces para restablecer la contraseña funcionan una sola vez y expiran pronto. Pide uno nuevo y ábrelo en el mismo navegador desde el que lo solicitaste.",
    "requestNewLink": "Pedir un enlace nuevo",
    "backToSignIn": "Volver a iniciar sesión",
    "successTitle": "Contraseña actualizada",
    "successDesc": "Has iniciado sesión con tu nueva contraseña.",
    "continueToDashboard": "Ir al panel"
  },
  "JoinPage": {
    "fail": {
      "notFoundTitle": "Invitación no encontrada",
      "notFoundBody": "Este enlace no corresponde a una invitación válida. Verifica la URL o pide a quien te invitó que envíe una nueva.",
      "usedTitle": "Invitación ya usada",
      "usedBody": "Esta invitación ya fue aceptada. Si no fuiste tú, pide al administrador de la cuenta que envíe un enlace nuevo.",
      "expiredTitle": "Invitación expirada",
      "expiredBody": "Esta invitación expiró. Pide al administrador de la cuenta que envíe una nueva; generarla toma solo unos segundos.",
      "serverErrorTitle": "Algo salió mal",
      "serverErrorBody": "No pudimos verificar esta invitación en este momento. Intenta recargar la página en un momento."
    },
    "conflictDefault": "Ya perteneces a otra cuenta. Inicia sesión con un correo distinto para unirte a esta.",
    "acceptFailed": "Error al aceptar la invitación",
    "welcome": "Bienvenido al equipo",
    "serverUnreachable": "No se pudo conectar con el servidor",
    "signOutFailed": "No se pudo cerrar sesión. Intenta recargar la página.",
    "verifying": "Verificando invitación…",
    "tryAgain": "Intentar de nuevo",
    "createNewAccount": "Crear una cuenta nueva en su lugar",
    "signIn": "Iniciar sesión",
    "invitedTo": "Te invitaron a <account>{name}</account>",
    "joinAs": "Te unirás como <badge>{role}</badge>. Enlace válido hasta {date}.",
    "accepting": "Aceptando…",
    "acceptInvitation": "Aceptar invitación",
    "acceptNote": "Al aceptar, tu acceso pasa a {name}. La cuenta personal vacía que se creó al registrarte se eliminará.",
    "conflictTitle": "No puedes unirte a {name} con esta cuenta",
    "conflictBody": "Para unirte a <account>{name}</account>, cierra sesión y regístrate de nuevo con otra dirección de correo. El enlace de invitación sigue siendo válido mientras no haya expirado.",
    "staySignedIn": "Seguir con la sesión iniciada",
    "signingOut": "Cerrando sesión…",
    "signOutSwitch": "Cerrar sesión y usar otro correo",
    "createAndJoin": "Crear cuenta y unirse",
    "haveAccount": "Ya tengo una cuenta"
  },
  "Notifications": {
    "title": "Notificaciones",
    "description": "Las conversaciones que otros compañeros te asignan aparecen aquí.",
    "markAllRead": "Marcar todas como leídas",
    "markReadFailed": "Error al marcar la notificación como leída",
    "markAllFailed": "Error al marcar todas como leídas",
    "retry": "Reintentar",
    "emptyTitle": "Aún no hay notificaciones",
    "emptyDesc": "Verás una alerta aquí cuando alguien te asigne una conversación.",
    "unread": "Sin leer"
  },
  "Agents": {
    "title": "Agentes de IA",
    "description": "Tu agente de IA con clave propia: configúralo y pruébalo en el playground antes de que responda a los clientes en la bandeja de entrada.",
    "tabPlayground": "Playground",
    "tabSetup": "Configuración",
    "tabUsage": "Uso",
    "playground": {
      "title": "Playground",
      "subtitle": "— prueba respuestas como si fueras un cliente",
      "reset": "Reiniciar",
      "emptyTitle": "Envía un mensaje para ver cómo respondería tu agente.",
      "emptyDesc": "Usa tu base de conocimiento y se comporta exactamente como el bot de respuesta automática, incluida la derivación.",
      "goToSetup": "¿Aún no está configurado? Ve a Configuración",
      "handoff": "Aquí derivaría la conversación a una persona",
      "thinking": "Pensando…",
      "placeholder": "Escribe un mensaje de cliente…",
      "notConfigured": "Aún no hay un agente configurado; completa primero la Configuración.",
      "noReply": "No se pudo obtener una respuesta.",
      "unreachable": "No se pudo conectar con el agente."
    },
    "usage": {
      "title": "Uso de tokens",
      "description": "Tokens gastados con la clave de tu proveedor por los borradores y el bot de respuesta automática. Solo conteos; aquí no se guarda contenido de mensajes.",
      "window": "Últimos {days} días",
      "loadFailed": "Error al cargar el uso",
      "empty": "Aún no hay uso de IA en los últimos {days} días.",
      "emptyHint": "Esto se llena a medida que el asistente redacta y responde automáticamente.",
      "totalTokens": "Tokens totales",
      "llmCalls": "Llamadas al LLM",
      "autoReply": "Respuesta automática",
      "drafts": "Borradores",
      "tokens": "Tokens",
      "tokensPerDay": "Tokens por día",
      "byModel": "Por modelo",
      "modelCalls": "{tokens} tok · {count, plural, =1 {# llamada} other {# llamadas}}",
      "partialWindow": "Se muestra una ventana parcial: el uso es tan alto que aquí solo se resumen los registros más recientes."
    }
  },
  "Interactive": {
    "replyButtons": "Botones de respuesta",
    "list": "Lista",
    "body": "Cuerpo",
    "bodyPlaceholder": "Lo que el cliente lee encima de las opciones",
    "header": "Encabezado (opcional)",
    "footer": "Pie (opcional)",
    "showIds": "Mostrar IDs de respuesta (avanzado)",
    "preview": "Vista previa",
    "previewBody": "Cuerpo del mensaje…",
    "previewButton": "Botón",
    "previewMenu": "Menú",
    "buttonsCount": "Botones ({count}/{max})",
    "idPlaceholder": "id",
    "buttonLabelPlaceholder": "Texto del botón",
    "addButton": "Agregar botón",
    "listButtonLabel": "Texto del botón de la lista",
    "rowsCount": "Filas ({count}/{max})",
    "sectionTitlePlaceholder": "Título de la sección (opcional)",
    "rowTitlePlaceholder": "Título de la fila",
    "rowDescriptionPlaceholder": "Descripción (opcional)",
    "addRow": "Agregar fila",
    "addSection": "Agregar sección",
    "defaultListButton": "Menú"
  },
  "DashboardShell": {
    "loading": "Cargando..."
  },
  "UiPrimitives": {
    "close": "Cerrar"
  },
  "GatedButton": {
    "readOnly": "Solo lectura: tu rol no puede {action}",
    "reasons": {
      "createAutomations": "crear automatizaciones",
      "createBroadcasts": "crear difusiones",
      "addOrImportContacts": "agregar o importar contactos",
      "deleteContacts": "eliminar contactos",
      "createFlows": "crear flujos",
      "createPipelines": "crear pipelines",
      "createDeals": "crear negocios",
      "sendMessages": "enviar mensajes"
    }
  },
  "Metadata": {
    "description": "Plantilla de CRM para WhatsApp que puedes alojar tú mismo."
  },
  "Currency": {
    "USD": "Dólar estadounidense",
    "EUR": "Euro",
    "GBP": "Libra esterlina",
    "INR": "Rupia india",
    "AUD": "Dólar australiano",
    "CAD": "Dólar canadiense",
    "BRL": "Real brasileño",
    "JPY": "Yen japonés",
    "CNY": "Yuan chino",
    "AED": "Dírham de los EAU",
    "ZAR": "Rand sudafricano",
    "NGN": "Naira nigeriana",
    "SGD": "Dólar de Singapur",
    "MXN": "Peso mexicano",
    "COP": "Peso colombiano"
  },
  "TemplateStatus": {
    "DRAFT": "Borrador",
    "PENDING": "Pendiente",
    "APPROVED": "Aprobada",
    "REJECTED": "Rechazada",
    "PAUSED": "Pausada",
    "DISABLED": "Desactivada",
    "IN_APPEAL": "En apelación",
    "PENDING_DELETION": "Eliminación pendiente"
  },
  "StarterAutomations": {
    "welcome_message": {
      "name": "Mensaje de bienvenida",
      "description": "Responde automáticamente a los contactos nuevos con un saludo.",
      "text": "¡Hola! 👋 Gracias por escribirnos. Te responderemos en breve."
    },
    "out_of_office": {
      "name": "Fuera de horario",
      "description": "Responde automáticamente fuera de horario para que nadie se quede esperando.",
      "text": "¡Gracias por tu mensaje! Nuestro equipo no está disponible ahora (9:00–18:00) y te responderá mañana a primera hora."
    },
    "lead_qualifier": {
      "name": "Calificador de leads",
      "description": "Haz preguntas de calificación para filtrar los leads entrantes.",
      "keywords": "precio,cotización,comprar",
      "text": "¡Genial! Con gusto te ayudamos con los precios. Una pregunta rápida: ¿cuántas licencias necesitas aproximadamente?"
    },
    "follow_up_reminder": {
      "name": "Recordatorio de seguimiento",
      "description": "Envía un recordatorio si un contacto no ha respondido en 24 horas.",
      "text": "Solo para dar seguimiento: ¿tienes alguna otra pregunta? ¡Con gusto te ayudamos!"
    }
  },
  "StarterFlows": {
    "welcome_menu": {
      "name": "Menú de bienvenida",
      "description": "Saluda a los clientes que escriben una palabra clave y dirígelos al agente adecuado según sean nuevos o existentes.",
      "keywords": "soporte,ayuda,hola",
      "text": "¡Hola! 👋 Bienvenido a soporte. ¿Ya eres cliente o eres nuevo?",
      "footer": "Toca un botón abajo para continuar.",
      "existingButton": "Ya soy cliente",
      "newButton": "Soy cliente nuevo",
      "existingNote": "Un cliente existente necesita ayuda: revisa el historial de la cuenta antes de responder.",
      "newNote": "Cliente nuevo: comparte los precios + el enlace de onboarding."
    },
    "faq_bot": {
      "name": "Bot de preguntas frecuentes",
      "description": "Responde preguntas comunes automáticamente. El cliente elige un tema de una lista; el bot responde y termina.",
      "keywords": "faq,pregunta,info",
      "text": "¿En qué te puedo ayudar?",
      "buttonLabel": "Ver temas",
      "commonSection": "Preguntas frecuentes",
      "hoursRow": "Horario de atención",
      "pricingRow": "Precios",
      "refundsRow": "Política de reembolso",
      "otherSection": "Otros",
      "humanRow": "Hablar con una persona",
      "hoursAnswer": "Atendemos de lunes a viernes, de 9:00 a 18:00 (hora local). El soporte de fin de semana se limita a casos urgentes.",
      "pricingAnswer": "Nuestros precios empiezan en US$9/mes. Visita https://example.com/pricing para ver el detalle completo.",
      "refundsAnswer": "Aceptamos reembolsos dentro de los 30 días posteriores a la compra. Responde con tu número de pedido y lo procesaremos.",
      "humanNote": "El cliente pidió hablar con una persona desde el bot de preguntas frecuentes."
    },
    "lead_capture": {
      "name": "Captura de leads",
      "description": "Saluda a quienes escriben por primera vez, captura nombre + email + empresa y deriva a ventas con las respuestas en la nota.",
      "intro": "¡Bienvenido! 👋 Te haré unas preguntas rápidas para ponerte en contacto con la persona adecuada.",
      "askName": "¿Cómo te llamas?",
      "askEmail": "¡Gracias, {name}! ¿Cuál es tu email de trabajo?",
      "askCompany": "Casi terminamos: ¿cómo se llama tu empresa?",
      "handoffNote": "Nuevo lead: nombre={name}, email={email}, empresa={company}."
    }
  },
  "LibErrors": {
    "upload": {
      "notSignedIn": "No has iniciado sesión.",
      "accountUnresolved": "No se pudo identificar tu cuenta."
    },
    "media": {
      "noAttachment": "Este mensaje no tiene archivo adjunto."
    },
    "ai": {
      "timeout": "El proveedor de IA tardó demasiado en responder.",
      "unreachable": "No se pudo conectar con el proveedor de IA: {message}",
      "emptyResponse": "{provider} devolvió una respuesta vacía.",
      "compatBaseUrlRequired": "La URL base de la API compatible con OpenAI es obligatoria.",
      "compatBaseUrlInvalid": "La URL base de la API compatible con OpenAI debe ser una URL válida.",
      "compatBaseUrlProtocol": "La URL base de la API compatible con OpenAI debe usar http:// o https://.",
      "compatBaseUrlHttpsRequired": "La URL base de la API compatible con OpenAI debe usar https://, salvo que el host figure en {envVar}.",
      "compatBaseUrlCredentials": "La URL base de la API compatible con OpenAI no debe contener credenciales incrustadas.",
      "compatBaseUrlQuery": "La URL base de la API compatible con OpenAI no debe contener una cadena de consulta ni un fragmento.",
      "compatBlockedUrl": "La URL del proveedor compatible con OpenAI está bloqueada por la política de URL salientes del servidor. Para un host privado aprobado por el operador, agrégalo a {envVar}.",
      "invalidKey": "{provider} rechazó la clave de API",
      "rateLimited": "Se alcanzó el límite de solicitudes de {provider}",
      "apiError": "Error de la API de {provider} ({status})",
      "embeddingsMalformed": "La respuesta de embeddings tenía un formato incorrecto.",
      "embeddingsMissingIndices": "A la respuesta de embeddings le faltaban los índices de resultados.",
      "embeddingsMissingVector": "A la respuesta de embeddings le falta un vector."
    },
    "tags": {
      "verifyFailed": "No se pudo verificar la propiedad del contacto y la etiqueta",
      "contactNotFound": "Contacto no encontrado",
      "tagNotFound": "Etiqueta no encontrada",
      "addFailed": "No se pudo agregar la etiqueta al contacto: {message}",
      "removeFailed": "No se pudo quitar la etiqueta del contacto: {message}"
    },
    "auth": {
      "unauthorized": "No autorizado",
      "forbidden": "Acceso denegado",
      "internal": "Error interno del servidor",
      "loadContext": "No se pudo cargar el contexto de la cuenta",
      "notLinked": "El perfil no está vinculado a una cuenta",
      "requiresRole": "Esta acción requiere el rol {min} o superior",
      "roleNames": {
        "owner": "Propietario",
        "admin": "Administrador",
        "agent": "Agente",
        "viewer": "Observador"
      }
    },
    "rateLimitExceeded": "Se superó el límite de solicitudes",
    "send": {
      "contactNotFound": "contacto no encontrado en esta cuenta",
      "noWhatsAppAddress": "el contacto no tiene una dirección de WhatsApp utilizable (teléfono: {phone})",
      "none": "ninguno",
      "notConfigured": "WhatsApp no está configurado para esta cuenta",
      "dbInsertFailed": "enviado a Meta, pero falló el guardado en la base de datos: {message}",
      "conversationLookupFailed": "falló la búsqueda de la conversación: {message}",
      "conversationNotFound": "conversación no encontrada en esta cuenta"
    },
    "engine": {
      "needsContact": "{step} necesita un contacto",
      "emptyText": "send_message tiene el texto vacío",
      "needsTemplateName": "send_template necesita template_name",
      "needsContactAndTag": "{step} necesita contacto + tag_id",
      "needsPipelineStage": "create_deal necesita pipeline + etapa",
      "needsUrl": "send_webhook necesita URL",
      "pausedWhileWaitingForReply": "automatización pausada mientras esperaba respuesta",
      "noReplyWithin24h": "sin respuesta en 24 h",
      "parkForReplyFailed": "no se pudo esperar la respuesta: {message}",
      "destinationNotAllowed": "send_webhook: destino no permitido",
      "webhookStatus": "el webhook devolvió {status}",
      "conversationNotInAccount": "la conversación no pertenece a esta cuenta",
      "noContactForConversation": "no se pudo resolver la conversación: sin contacto",
      "noConversation": "no se puede enviar: el contacto no tiene una conversación existente",
      "tagAddedNoConversation": "la automatización tag_added no puede enviar: el contacto no tiene una conversación existente"
    }
  },
  "Validation": {
    "flows": {
      "nameRequired": "El nombre del flujo es obligatorio.",
      "entryRequired": "Elige un nodo de entrada antes de activar.",
      "needsNode": "Un flujo necesita al menos un nodo antes de activarse.",
      "entryMissing": "El nodo de entrada \"{id}\" no existe.",
      "duplicateNodeKey": "node_key duplicado: \"{key}\".",
      "unreachable": "El nodo \"{key}\" no es accesible desde el nodo de entrada.",
      "keywordsRequired": "Los disparadores por palabra clave necesitan al menos una palabra clave.",
      "blankKeywords": "{count} {count, plural, =1 {palabra clave está vacía} other {palabras clave están vacías}}: no coincidirán con nada.",
      "startNeedsNext": "El nodo Inicio debe apuntar a un nodo siguiente.",
      "startMissingNext": "El nodo Inicio apunta a un nodo inexistente: \"{key}\".",
      "sendMessageNeedsText": "El nodo Enviar mensaje necesita un texto.",
      "sendMessageNeedsNext": "El nodo Enviar mensaje debe apuntar a un nodo siguiente.",
      "sendMessageMissingNext": "El nodo Enviar mensaje apunta a un nodo inexistente: \"{key}\".",
      "sendMediaNeedsType": "El nodo Enviar archivo necesita un tipo de medio (imagen, video o documento).",
      "sendMediaNeedsFile": "El nodo Enviar archivo necesita un archivo (sube uno antes de activar).",
      "captionTooLong": "El pie de foto supera los {max} caracteres (límite de WhatsApp).",
      "sendMediaNeedsNext": "El nodo Enviar archivo debe apuntar a un nodo siguiente.",
      "sendMediaMissingNext": "El nodo Enviar archivo apunta a un nodo inexistente: \"{key}\".",
      "sendButtonsNeedsText": "El nodo Enviar botones necesita un texto.",
      "sendButtonsNeedsButton": "El nodo Enviar botones necesita al menos un botón.",
      "tooManyButtons": "WhatsApp permite como máximo {max} botones por mensaje.",
      "buttonNeedsReplyId": "El botón {n} necesita un ID de respuesta.",
      "duplicateButtonReplyId": "ID de respuesta de botón duplicado: \"{id}\".",
      "buttonNeedsTitle": "El botón {n} necesita un título.",
      "buttonTitleTooLong": "El título del botón {n} supera los {max} caracteres (límite de WhatsApp).",
      "buttonNeedsNext": "El botón {n} necesita un nodo siguiente.",
      "buttonMissingNext": "El botón {n} apunta a un nodo inexistente: \"{key}\".",
      "sendListNeedsText": "El nodo Enviar lista necesita un texto.",
      "sendListNeedsLabel": "El nodo Enviar lista necesita una etiqueta de botón (el texto que despliega la lista).",
      "sendListNeedsRow": "El nodo Enviar lista necesita al menos una fila.",
      "tooManyRows": "El nodo Enviar lista permite como máximo {max} filas en total entre secciones.",
      "rowNeedsReplyId": "La fila {row} de la sección {section} necesita un ID de respuesta.",
      "duplicateRowId": "ID de fila de lista duplicado: \"{id}\".",
      "rowNeedsTitle": "La fila {n} necesita un título.",
      "rowTitleTooLong": "El título de la fila {n} supera los {max} caracteres.",
      "rowDescriptionTooLong": "La descripción de la fila {n} supera los {max} caracteres.",
      "rowNeedsNext": "La fila {n} necesita un nodo siguiente.",
      "rowMissingNext": "La fila {n} apunta a un nodo inexistente: \"{key}\".",
      "collectNeedsPrompt": "El nodo Capturar respuesta necesita una pregunta para enviar al cliente.",
      "collectNeedsVarKey": "El nodo Capturar respuesta necesita una var_key para guardar la respuesta.",
      "invalidVarKey": "La var_key \"{key}\" solo puede contener letras, números y guion bajo, y debe empezar con una letra o guion bajo.",
      "collectNeedsNext": "El nodo Capturar respuesta debe apuntar a un nodo siguiente.",
      "collectMissingNext": "El nodo Capturar respuesta apunta a un nodo inexistente: \"{key}\".",
      "conditionNeedsSubject": "La condición necesita un sujeto (var / tag / contact_field).",
      "conditionNeedsSubjectKey": "La condición necesita una subject_key (nombre de variable, ID de etiqueta o nombre de campo).",
      "conditionNeedsOperator": "La condición necesita un operador.",
      "operatorNeedsValue": "El operador \"{operator}\" normalmente espera un valor de comparación; un valor vacío solo coincidirá con sujetos vacíos.",
      "conditionNeedsBranch": "La condición necesita un nodo para la rama \"{branch}\".",
      "conditionMissingBranch": "La rama \"{branch}\" de la condición apunta a un nodo inexistente: \"{key}\".",
      "setTagNeedsMode": "El nodo Etiquetar contacto necesita un modo (agregar o quitar).",
      "setTagNeedsTag": "El nodo Etiquetar contacto necesita una etiqueta para aplicar.",
      "setTagNeedsNext": "El nodo Etiquetar contacto debe apuntar a un nodo siguiente.",
      "setTagMissingNext": "El nodo Etiquetar contacto apunta a un nodo inexistente: \"{key}\".",
      "unknownNodeType": "Tipo de nodo desconocido: \"{type}\"."
    },
    "automations": {
      "needsStep": "las automatizaciones activas necesitan al menos un paso",
      "messageTextRequired": "el texto del mensaje es obligatorio",
      "templateNameRequired": "el nombre de la plantilla es obligatorio",
      "tagRequired": "la etiqueta es obligatoria",
      "agentRequired": "el agente es obligatorio cuando el modo es \"specific\"",
      "fieldNameRequired": "el nombre del campo es obligatorio",
      "fieldValueRequired": "el valor del campo es obligatorio",
      "pipelineRequired": "el pipeline es obligatorio",
      "stageRequired": "la etapa es obligatoria",
      "titleRequired": "el título es obligatorio",
      "waitAmountInvalid": "la cantidad de espera debe ser mayor que 0",
      "waitUnitInvalid": "la unidad de espera debe ser minutos, horas o días",
      "conditionSubjectRequired": "el sujeto de la condición es obligatorio",
      "conditionOperandRequired": "el operando de la condición es obligatorio",
      "webhookUrlRequired": "la URL del webhook es obligatoria",
      "webhookUrlScheme": "la URL del webhook debe usar http o https",
      "webhookUrlInvalid": "la URL del webhook no es una URL válida",
      "unknownStepType": "tipo de paso desconocido: {type}",
      "keywordRequired": "se requiere al menos una palabra clave",
      "keywordsEmpty": "las palabras clave no pueden estar vacías",
      "matchTypeInvalid": "el tipo de coincidencia debe ser \"exact\", \"contains\" o \"word\"",
      "scheduleRequired": "la programación es obligatoria",
      "replyIdRequired": "se requiere al menos un ID de respuesta",
      "replyIdsEmpty": "los IDs de respuesta no pueden estar vacíos"
    },
    "templates": {
      "nameRequired": "El nombre de la plantilla es obligatorio.",
      "nameInvalid": "El nombre de la plantilla solo puede usar letras minúsculas, dígitos y guiones bajos (1-512 caracteres).",
      "bodyNotContiguous": "Las variables del cuerpo deben ser consecutivas a partir de {first}; se encontraron: {found}.",
      "bodyRequired": "El texto del cuerpo es obligatorio.",
      "bodyTooLong": "El texto del cuerpo supera los {max} caracteres (tiene {got}).",
      "footerTooLong": "El texto del pie supera los {max} caracteres (tiene {got}).",
      "footerNoVariables": "El texto del pie no puede contener variables {placeholder} (regla de Meta).",
      "headerTextRequired": "El encabezado de texto requiere header_content.",
      "headerTextTooLong": "El texto del encabezado supera los {max} caracteres (tiene {got}).",
      "headerTooManyVariables": "El encabezado de texto admite como máximo una variable; se encontraron {count} (regla de Meta).",
      "headerVariableMustBeFirst": "La variable del encabezado de texto debe ser {var} (regla de Meta).",
      "mediaHeaderRequiresSource": "El encabezado {type} requiere una URL pública de ejemplo (header_media_url) o un handle de Resumable Upload (header_handle).",
      "headerMediaUrlScheme": "header_media_url debe usar el esquema http(s).",
      "headerMediaUrlInvalid": "header_media_url debe ser una URL válida.",
      "tooManyButtons": "Las plantillas pueden tener como máximo {max} botones (tiene {got}).",
      "tooManyUrlButtons": "Se permiten como máximo {max} botones URL (tiene {got}).",
      "tooManyPhoneButtons": "Se permite como máximo {max} botón PHONE_NUMBER (tiene {got}).",
      "tooManyCopyCodeButtons": "Se permite como máximo {max} botón COPY_CODE (tiene {got}).",
      "quickReplyInterleaved": "Los botones QUICK_REPLY no pueden intercalarse con botones URL / PHONE_NUMBER / COPY_CODE; agrúpalos al principio.",
      "buttonMissingText": "Al botón #{n} ({type}) le falta el texto.",
      "buttonTextTooLong": "El texto del botón #{n} supera los {max} caracteres.",
      "urlButtonMissingUrl": "Al botón URL #{n} le falta la url.",
      "urlButtonInvalidUrl": "El botón URL #{n} tiene una url no válida.",
      "urlButtonTooManyVariables": "El botón URL #{n} puede tener como máximo una variable (regla de Meta).",
      "urlButtonVariableMustBeFirst": "La variable del botón URL #{n} debe ser {var} (regla de Meta).",
      "urlButtonNeedsExample": "El botón URL #{n} usa {var}; Meta requiere un valor de ejemplo.",
      "phoneButtonMissingNumber": "Al botón PHONE_NUMBER #{n} le falta phone_number.",
      "copyCodeButtonMissingExample": "Al botón COPY_CODE #{n} le falta el valor de ejemplo.",
      "bodySampleCountMismatch": "El cuerpo tiene {count} variable(s); proporciona exactamente {count} valor(es) de ejemplo (recibidos: {got}).",
      "headerSampleCountMismatch": "El encabezado tiene {count} variable(s); proporciona exactamente {count} valor(es) de ejemplo (recibidos: {got}).",
      "bodySampleEmpty": "El valor de ejemplo #{n} del cuerpo está vacío.",
      "headerSampleEmpty": "El valor de ejemplo #{n} del encabezado está vacío.",
      "languageRequired": "El idioma es obligatorio.",
      "metaAppIdRequired": "Las plantillas con encabezado multimedia necesitan META_APP_ID configurado (se usa para el Resumable Upload de Meta). Agrégalo a tu entorno o quita el encabezado multimedia.",
      "headerUrlUnreachable": "No se pudo obtener la URL del medio del encabezado. Asegúrate de que sea accesible públicamente.",
      "headerUrlStatus": "La URL del encabezado {kind} devolvió {status}. Debe ser accesible públicamente.",
      "headerWrongType": "El encabezado {kind} debe ser {formats} (recibido: {contentType}).",
      "headerEmpty": "El encabezado {kind} está vacío.",
      "headerTooLarge": "El encabezado {kind} pesa {size} MB; el límite de Meta es {max} MB.",
      "headerTextValueRequired": "La variable {var} del encabezado de texto requiere un valor; envía headerText.",
      "mediaHeaderSendSource": "El encabezado {type} requiere un enlace o id de medio al enviar; define header_media_url en la plantilla o envía headerMediaUrl/headerMediaId.",
      "bodyValuesMissing": "El cuerpo tiene {count} variable(s), pero solo se proporcionaron {got} valor(es).",
      "urlButtonParamRequired": "El botón URL #{n} usa {var}; requiere un valor en buttonParams[{index}]."
    },
    "interactive": {
      "buttonCount": "El mensaje interactivo con botones requiere de 1 a {max} botones (tiene {got}).",
      "buttonMissingId": "Al botón interactivo le falta el id.",
      "duplicateButtonId": "El mensaje interactivo tiene un id de botón duplicado: \"{id}\".",
      "buttonMissingTitle": "Al botón interactivo \"{id}\" le falta el título.",
      "buttonTitleTooLong": "El título del botón interactivo \"{title}\" supera los {max} caracteres.",
      "listRequiresButtonLabel": "La lista interactiva requiere un buttonLabel.",
      "listButtonLabelTooLong": "El buttonLabel \"{label}\" de la lista interactiva supera los {max} caracteres.",
      "listSectionCount": "La lista interactiva requiere de 1 a {max} secciones (tiene {got}).",
      "listRowCount": "La lista interactiva requiere de 1 a {max} filas en total entre todas las secciones (tiene {got}).",
      "listRowMissingId": "A la fila de la lista interactiva le falta el id.",
      "duplicateRowId": "La lista interactiva tiene un id de fila duplicado: \"{id}\".",
      "listRowMissingTitle": "A la fila \"{id}\" de la lista interactiva le falta el título.",
      "listRowTitleTooLong": "El título de fila \"{title}\" de la lista interactiva supera los {max} caracteres.",
      "listRowDescriptionTooLong": "La descripción de la fila \"{id}\" de la lista interactiva supera los {max} caracteres.",
      "bodyRequired": "El mensaje interactivo requiere bodyText.",
      "bodyTooLong": "El bodyText interactivo supera los {max} caracteres.",
      "headerTooLong": "El headerText interactivo supera los {max} caracteres.",
      "footerTooLong": "El footerText interactivo supera los {max} caracteres."
    }
  },
  "Api": {
    "common": {
      "notFound": "No encontrado",
      "invalidJson": "JSON no válido",
      "unauthorized": "No autorizado",
      "internalServerError": "Error interno del servidor",
      "profileNotLinked": "Tu perfil no está vinculado a una cuenta.",
      "conversationNotFound": "Conversación no encontrada",
      "failedToLoadConversation": "Error al cargar la conversación",
      "whatsappNotConfigured": "WhatsApp no configurado",
      "whatsappNotConfiguredDot": "WhatsApp no configurado.",
      "whatsappNotConfiguredSetup": "WhatsApp no configurado. Configura primero tu integración con WhatsApp.",
      "whatsappNotConfiguredConnect": "WhatsApp no configurado. Conecta primero tu cuenta de WhatsApp Business en Configuración.",
      "wabaIdMissing": "Falta el ID de WABA (WhatsApp Business Account). Vuelve a conectar tu cuenta en Configuración.",
      "unknownError": "Error desconocido",
      "invalidRequestBody": "Cuerpo de la solicitud no válido",
      "titleEmpty": "El título no puede estar vacío",
      "insertFailed": "error al insertar"
    },
    "account": {
      "apiKeys": {
        "revokeFailed": "Error al revocar la clave de API",
        "notFoundOrRevoked": "Clave de API no encontrada o ya revocada",
        "loadFailed": "Error al cargar las claves de API",
        "nameRequired": "El nombre es obligatorio",
        "nameTooLong": "El nombre debe tener {max} caracteres o menos",
        "scopesInvalid": "Los alcances deben ser una lista de alcances válidos",
        "createFailed": "Error al crear la clave de API"
      },
      "invitations": {
        "revokeFailed": "Error al revocar la invitación",
        "notFound": "Invitación no encontrada",
        "loadFailed": "Error al cargar las invitaciones",
        "roleInvalid": "El rol debe ser admin, agent o viewer",
        "labelTooLong": "La etiqueta debe tener {max} caracteres o menos",
        "createFailed": "Error al crear la invitación"
      },
      "members": {
        "loadFailed": "Error al cargar los miembros",
        "updateFailed": "Error al actualizar el miembro",
        "roleInvalid": "El rol debe ser owner, admin, agent o viewer",
        "useTransferOwnership": "Usa POST /api/account/transfer-ownership para promover a un miembro a propietario"
      },
      "nameMustBeString": "El nombre debe ser un texto",
      "nameEmpty": "El nombre de la cuenta no puede estar vacío",
      "nameTooLong": "El nombre de la cuenta debe tener {max} caracteres o menos",
      "updateFailed": "Error al actualizar la cuenta",
      "transferFailed": "Error al transferir la propiedad",
      "newOwnerInvalid": "newOwnerUserId debe ser un UUID válido"
    },
    "invitations": {
      "redeemFailed": "Error al aceptar la invitación",
      "missingToken": "Falta el token de invitación"
    },
    "ai": {
      "pausedRequired": "paused (booleano) es obligatorio",
      "updateConversationFailed": "Error al actualizar la conversación",
      "loadConfigFailed": "Error al cargar la configuración de IA",
      "providerInvalid": "El proveedor debe ser \"openai\", \"anthropic\" o \"openai_compatible\"",
      "baseUrlRequired": "base_url es obligatorio para openai_compatible",
      "baseUrlInvalid": "base_url debe ser una URL http(s) válida",
      "modelRequired": "El modelo es obligatorio",
      "handoffNotMember": "El agente de transferencia (handoff_agent_id) debe ser miembro de esta cuenta",
      "storedKeyReenter": "No se pudo descifrar la clave de API guardada; vuelve a ingresar tu clave.",
      "apiKeyRequired": "La clave de API es obligatoria",
      "validateWithProviderFailed": "No se pudo validar la clave de API con el proveedor.",
      "embeddingsKeyError": "Clave de embeddings: {message}",
      "validateEmbeddingsFailed": "No se pudo validar la clave de embeddings.",
      "saveConfigFailed": "Error al guardar la configuración de IA",
      "deleteConfigFailed": "Error al eliminar la configuración de IA",
      "conversationIdRequired": "conversation_id es obligatorio",
      "storedKeyUndecryptable": "No se pudo descifrar la clave de API guardada.",
      "notConfigured": "El asistente de IA no está configurado. Actívalo en Configuración → Asistente de IA.",
      "noMessages": "Aún no hay mensajes para generar un borrador.",
      "messagesRequired": "messages es obligatorio",
      "sendMessageToTest": "Envía un mensaje para probar el agente.",
      "noAgentConfigured": "Aún no hay ningún agente configurado. Agrega la clave de tu proveedor en Configuración.",
      "enterApiKey": "Ingresa una clave de API para probar.",
      "validateFailed": "No se pudo validar la clave de API.",
      "loadUsageFailed": "Error al cargar el uso",
      "knowledge": {
        "loadDocFailed": "Error al cargar el documento",
        "nothingToUpdate": "Nada que actualizar",
        "contentEmpty": "El contenido no puede estar vacío",
        "updateDocFailed": "Error al actualizar el documento",
        "indexingFailed": "error de indexación",
        "updatedIndexFailed": "Actualizado, pero la indexación semántica falló ({message}). La búsqueda por palabras clave sigue funcionando; usa Reindexar para reintentar.",
        "updatedKeywordOnly": "Actualizado solo con búsqueda por palabras clave: no se pudo descifrar tu clave de embeddings (revisa ENCRYPTION_KEY y vuelve a ingresar la clave).",
        "deleteDocFailed": "Error al eliminar el documento",
        "loadDocsFailed": "Error al cargar los documentos",
        "reindexKeyCorrupt": "No se pudo descifrar tu clave de embeddings (revisa ENCRYPTION_KEY y vuelve a ingresar la clave en Configuración → Asistente de IA). No se reindexó nada.",
        "reindexPartial": "Se reindexaron {reindexed} y luego ocurrió un error: {message}",
        "loadKbFailed": "Error al cargar la base de conocimiento",
        "titleContentRequired": "El título y el contenido son obligatorios",
        "saveDocFailed": "Error al guardar el documento",
        "savedIndexFailed": "Guardado, pero la indexación semántica falló ({message}). La búsqueda por palabras clave sigue funcionando; usa Reindexar para reintentar.",
        "savedKeywordOnly": "Guardado solo con búsqueda por palabras clave: no se pudo descifrar tu clave de embeddings (revisa ENCRYPTION_KEY y vuelve a ingresar la clave)."
      }
    },
    "automations": {
      "copyName": "{name} (Copia)",
      "copyFailed": "error al duplicar",
      "invalidActiveConfig": "No se puede mantener la automatización activa con una configuración no válida",
      "invalidActivateConfig": "No se puede activar la automatización con una configuración no válida",
      "nameTriggerRequired": "El nombre y el disparador son obligatorios"
    },
    "contacts": {
      "tagIdRequired": "tag_id es obligatorio"
    },
    "flows": {
      "statusInvalid": "El estado debe ser 'draft', 'active' o 'archived'",
      "cannotActivate": "No se puede activar el flujo: primero corrige los problemas de abajo.",
      "nameEmpty": "El nombre no puede estar vacío",
      "unknownTemplate": "Plantilla de flujo desconocida \"{slug}\"",
      "insertFailed": "error al crear el flujo",
      "nameRequired": "El nombre es obligatorio"
    },
    "quickReplies": {
      "kindInvalid": "El tipo debe ser \"text\" o \"interactive\"",
      "contentTextRequired": "El texto es obligatorio para las respuestas rápidas de texto",
      "titleRequired": "El título es obligatorio"
    },
    "broadcast": {
      "alreadyRunning": "Ya hay un envío en curso para esta difusión. Espera a que termine antes de reanudar de nuevo.",
      "recipientsRequired": "Proporciona `recipients` (preferido) o `phone_numbers`; debe ser una lista no vacía",
      "templateNameRequired": "El nombre de la plantilla es obligatorio",
      "templateMalformed": "El registro local de la plantilla está dañado: usa \"Sincronizar desde Meta\" en Configuración para repararlo antes de enviar la difusión.",
      "invalidPhoneFormat": "Formato de número de teléfono no válido"
    },
    "whatsappConfig": {
      "fetchFailed": "Error al obtener la configuración",
      "noConfig": "Aún no hay ninguna configuración de WhatsApp guardada. Completa el formulario y haz clic en Guardar configuración.",
      "tokenCorrupted": "El token de acceso guardado no se puede descifrar con la ENCRYPTION_KEY actual. Normalmente significa que la clave cambió o que es distinta entre entornos (local vs Hostinger vs Vercel). Haz clic en \"Restablecer configuración\" abajo y vuelve a guardar.",
      "credentialsRequired": "access_token y phone_number_id son obligatorios",
      "phoneIdDigits": "El Phone Number ID debe contener solo dígitos: es el ID numérico que aparece en Meta → WhatsApp → API Setup, no el número de teléfono en sí.",
      "wabaIdDigits": "El WhatsApp Business Account ID debe contener solo dígitos: cópialo de Meta → WhatsApp → API Setup.",
      "pinDigits": "El PIN debe tener exactamente 6 dígitos.",
      "validateFailed": "Error al validar la configuración",
      "numberLinkedElsewhere": "Este número de WhatsApp ya está vinculado a otra cuenta en esta instancia. Cada número de teléfono solo puede conectarse a un usuario de wacrm.",
      "encryptFailed": "Error al cifrar el token. Verifica que ENCRYPTION_KEY sea una cadena hexadecimal válida de 64 caracteres en tus variables de entorno.",
      "updateFailed": "Error al actualizar la configuración",
      "saveFailed": "Error al guardar la configuración",
      "deleteFailed": "Error al eliminar la configuración",
      "noConfigShort": "Aún no hay ninguna configuración de WhatsApp guardada.",
      "tokenUndecryptable": "No se puede descifrar el token de acceso guardado; probablemente cambió ENCRYPTION_KEY. Vuelve a ingresar el token para repararlo.",
      "phoneCheckFailed": "Falló la verificación de los datos del número: {message}",
      "wabaNoApps": "La WABA no tiene apps suscritas. Vuelve a guardar la configuración para suscribirla.",
      "wabaCheckFailed": "Falló la verificación de la suscripción de la WABA: {message}",
      "noWabaId": "No hay ningún WABA ID registrado; los webhooks no se pueden conectar sin él. Agrégalo en el formulario y vuelve a guardar."
    },
    "media": {
      "idRequired": "El ID del archivo multimedia es obligatorio",
      "fetchFailed": "Error al obtener el archivo multimedia"
    },
    "react": {
      "idEmojiRequired": "message_id y emoji son obligatorios",
      "messageNotFound": "Mensaje no encontrado",
      "notSent": "No se puede reaccionar a un mensaje que no se ha enviado a WhatsApp",
      "contactNoPhone": "El contacto no tiene número de teléfono ni ID de usuario de WhatsApp",
      "unknownMetaError": "Error desconocido de la API de Meta",
      "metaError": "Error de la API de Meta: {message}",
      "dbDeleteFailed": "Reacción enviada a Meta, pero falló su eliminación en la base de datos",
      "dbUpsertFailed": "Reacción enviada a Meta, pero falló al guardarla en la base de datos"
    },
    "send": {
      "idsRequired": "Se requiere conversation_id o contact_id, además de message_type",
      "contactNotFound": "Contacto no encontrado",
      "openConversationFailed": "Error al abrir una conversación con este contacto"
    },
    "templates": {
      "invalidId": "ID de plantilla no válido.",
      "invalidJsonBody": "Cuerpo JSON no válido.",
      "notFound": "Plantilla no encontrada.",
      "neverSubmitted": "Esta plantilla nunca se envió a Meta: usa Nueva plantilla para enviarla.",
      "statusNotEditable": "Las plantillas con estado {status} no se pueden editar. Permitidos: APPROVED, REJECTED, PAUSED.",
      "authNotEditable": "Las plantillas de AUTENTICACIÓN no se pueden editar aquí: adminístralas en el Administrador de WhatsApp de Meta.",
      "validationFailed": "Error de validación.",
      "headerUploadFailed": "Error al subir el archivo multimedia del encabezado.",
      "metaEditFailed": "Error al editar en Meta.",
      "editedSaveFailed": "Editada en Meta, pero falló el guardado local: {message}. Usa \"Sincronizar desde Meta\" para recuperarla.",
      "editFailed": "Error al editar la plantilla.",
      "notConfiguredDelete": "WhatsApp no configurado: no se puede eliminar en Meta.",
      "metaDeleteFailed": "Error al eliminar en Meta.",
      "deletedLocalFailed": "Eliminada en Meta, pero falló la eliminación local: {message}.",
      "deleteFailed": "Error al eliminar la plantilla.",
      "authNotSupported": "Las plantillas de AUTENTICACIÓN aún no se admiten aquí: créalas en el Administrador de WhatsApp de Meta y usa \"Sincronizar desde Meta\".",
      "metaSubmitFailed": "Error al enviar a Meta.",
      "rateLimit": "Se alcanzó el límite de Meta (100 creaciones de plantillas por hora). Inténtalo de nuevo más tarde.",
      "submittedSaveFailed": "Enviada a Meta, pero falló el guardado local: {message}. Usa \"Sincronizar desde Meta\" para recuperarla.",
      "submitFailed": "Error al enviar la plantilla.",
      "metaApiStatus": "Error de la API de Meta: {status}",
      "syncFailed": "Error al sincronizar las plantillas"
    }
  }
}
