{
  "common": {
    "save": "Guardar",
    "cancel": "Cancelar",
    "delete": "Eliminar",
    "loading": "Cargando…",
    "back": "Atrás",
    "next": "Siguiente",
    "previous": "Anterior",
    "confirm": "Confirmar",
    "close": "Cerrar",
    "status": "Estado",
    "language": "Idioma",
    "required": "Obligatorio",
    "optional": "Opcional",
    "success": "Operación realizada correctamente",
    "searchClient": "Buscar cliente…",
    "noDate": "Sin fecha",
    "toasts": {
      "deleted": "Eliminado",
      "noChanges": "No hay cambios para guardar",
      "selectPatient": "Selecciona un cliente"
    },
    "requiredHint": "* Campo obligatorio"
  },
  "nav": {
    "calendar": "Agenda",
    "patients": "Clientes",
    "clinicInfo": "Información de la empresa",
    "billingSub": "Facturación y suscripción",
    "catalogs": "Catálogos (servicios/profesionales/sedes)",
    "timeBlocks": "Bloqueos de horario",
    "bookingSettings": "Ajustes de reserva online",
    "auditLog": "Auditoría",
    "platform": "Plataforma",
    "bonos": "Bonos",
    "bookings": "Reservas",
    "settings": "Ajustes",
    "goToAgenda": "Ir a mi agenda",
    "main": "Navegación principal",
    "account": "Mi cuenta",
    "pendingCount": "{{count}} reservas pendientes de revisar",
    "team": "Equipo"
  },
  "auth": {
    "login": "Iniciar sesión",
    "logout": "Cerrar sesión",
    "email": "Correo electrónico",
    "password": "Contraseña",
    "forgotPassword": "¿Olvidaste tu contraseña?",
    "signin": "Entrar",
    "sessionExpired": "Tu sesión ha caducado, vuelve a iniciar sesión",
    "systemTitle": "Sistema de Gestión",
    "emailPlaceholder": "tu@email.com",
    "passwordPlaceholder": "********",
    "showPassword": "Mostrar contraseña",
    "hidePassword": "Ocultar contraseña",
    "signinLoading": "Iniciando sesión…",
    "forgotTitle": "Recuperar contraseña",
    "forgotDescription": "Introduce tu correo y te enviaremos instrucciones para restablecer tu contraseña.",
    "sendEmail": "Enviar correo",
    "sending": "Enviando…",
    "backToLogin": "Volver al inicio de sesión",
    "noAccount": "¿No tienes cuenta?",
    "createAccount": "Crea tu empresa",
    "errors": {
      "generic": "Error de autenticación",
      "invalidCredentials": "Email o contraseña incorrectos",
      "emailNotConfirmed": "Debes confirmar tu email antes de iniciar sesión",
      "userNotFound": "Usuario no encontrado",
      "tooManyAttempts": "Demasiados intentos. Espera unos minutos y vuelve a probar",
      "passwordMin": "La contraseña debe tener al menos 8 caracteres",
      "alreadyRegistered": "Este email ya está registrado",
      "network": "Error de conexión. Verifica tu internet",
      "invalidEmail": "La dirección de email no es válida",
      "signupsDisabled": "El registro está deshabilitado en este negocio",
      "weakPassword": "La contraseña es demasiado débil",
      "operationFailed": "No se ha podido completar la operación. Inténtalo de nuevo",
      "userInfo": "No se pudo obtener información del usuario",
      "unexpected": "Error inesperado al iniciar sesión",
      "resetSent": "Se ha enviado un email con las instrucciones para restablecer tu contraseña",
      "resetError": "Error al solicitar recuperación de contraseña",
      "passwordUpdated": "Contraseña actualizada correctamente",
      "passwordUpdateError": "Error al actualizar la contraseña",
      "samePassword": "La contraseña nueva debe ser distinta de la anterior"
    },
    "reset": {
      "title": "Elige una contraseña nueva",
      "description": "Escribe la contraseña con la que entrarás a partir de ahora.",
      "inviteTitle": "Crea tu contraseña",
      "inviteDescription": "Te han invitado a un equipo. Elige la contraseña con la que entrarás a partir de ahora.",
      "newPassword": "Contraseña nueva",
      "confirmPassword": "Repite la contraseña",
      "submit": "Guardar contraseña",
      "saving": "Guardando…",
      "mismatch": "Las contraseñas no coinciden",
      "checking": "Comprobando el enlace…",
      "linkInvalidTitle": "El enlace ya no es válido",
      "linkInvalid": "Este enlace de recuperación ha caducado o ya se ha usado. Pide uno nuevo y te lo enviamos al momento.",
      "requestNew": "Pedir un enlace nuevo",
      "doneTitle": "Contraseña actualizada",
      "done": "Ya puedes entrar con tu contraseña nueva."
    }
  },
  "appointments": {
    "new": "Nueva cita",
    "status": {
      "pending": "Pendiente",
      "booked": "Confirmada",
      "completed": "Completada",
      "cancelled": "Cancelada",
      "noShow": "No asistió"
    },
    "duration": "Duración",
    "service": "Servicio",
    "practitioner": "Profesional",
    "location": "Sede",
    "paid": "Pagada",
    "toasts": {
      "created": "Cita creada exitosamente",
      "createError": "Error al crear la cita",
      "updated": "Cita actualizada exitosamente",
      "updateError": "Error al actualizar la cita",
      "deleted": "Cita eliminada exitosamente",
      "deleteError": "Error al eliminar la cita",
      "rescheduled": "Cita reprogramada correctamente",
      "rescheduleError": "Error al reprogramar la cita"
    }
  },
  "booking": {
    "title": "Reserva online",
    "step": {
      "service": "Elige un servicio",
      "practitioner": "Elige profesional",
      "slot": "Elige fecha y hora",
      "details": "Tus datos",
      "location": "Elige una sede"
    },
    "loading": "Cargando…",
    "errorTitle": "No se puede continuar",
    "payment": {
      "successTitle": "Pago confirmado.",
      "successText": "Hemos recibido tu pago y tu cita queda confirmada. Recibirás un email con los detalles.",
      "cancelTitle": "Pago cancelado.",
      "cancelText": "No se ha cobrado nada. Puedes volver a intentarlo eligiendo de nuevo el servicio."
    },
    "noServices": "No hay servicios disponibles.",
    "changeService": "← Cambiar servicio",
    "changePractitioner": "← Cambiar profesional",
    "loadingSlots": "Cargando huecos…",
    "noSlotsDay": "No quedan huecos el {{date}}.",
    "patient": {
      "firstName": "Nombre",
      "lastName": "Apellidos",
      "phone": "Teléfono",
      "email": "Email",
      "contactNote": "Indica teléfono o email para que podamos confirmarte la cita.",
      "comments": "Comentarios (opcional)",
      "accept": "Acepto el tratamiento de mis datos para gestionar la cita"
    },
    "confirmBook": "Confirmar reserva",
    "result": {
      "booked": "¡Reserva confirmada!",
      "pending": "Solicitud enviada",
      "pendingText": "{{business}} todavía tiene que confirmar tu cita: hasta entonces no está garantizada. Te avisaremos en cuanto la acepte.",
      "redirecting": "Redirigiendo al pago seguro…",
      "confirmedBadge": "Confirmada",
      "pendingBadge": "Pendiente de aprobación",
      "manageNote": "Puedes gestionar o cancelar tu cita desde el enlace que te hemos enviado.",
      "notifiedEmail": "Te hemos enviado los detalles de la cita por email.",
      "notifiedSms": "Te hemos enviado los detalles de la cita por SMS.",
      "notifiedNone": "No hemos podido enviarte un aviso. Guarda esta página o añade la cita a tu calendario.",
      "addToCalendar": "Añadir al calendario",
      "googleCalendar": "Google Calendar",
      "manage": "Gestionar mi cita",
      "bookAnother": "Reservar otra cita"
    },
    "submitError": "No se pudo completar la reserva. Inténtalo de nuevo.",
    "chooseAnotherSlot": "Elegir otro horario",
    "practitionersError": "No pudimos cargar los profesionales. Inténtalo de nuevo.",
    "slotsError": "No pudimos cargar los horarios disponibles. Vuelve a intentarlo.",
    "retry": "Reintentar",
    "poweredBy": "Reservas con BookingForNow — crea la tuya gratis",
    "createYours": {
      "question": "¿Tienes un negocio?",
      "link": "Crea tu página de reservas como esta, gratis"
    },
    "metaDescription": "Reserva online con {{name}}: elige servicio, fecha y hora en menos de un minuto.",
    "otherDate": "Otra fecha:",
    "noSlotsShort": "Sin huecos",
    "depositNote": "Reserva con depósito de {{amount}} — se descuenta del precio total.",
    "eyebrow": "Reserva online",
    "stepCounter": "Paso {{current}} de {{total}}",
    "depositTitle": "Reserva con depósito",
    "anyProfessional": "Cualquiera disponible",
    "anyProfessionalHint": "Te asignamos un profesional libre en el horario que elijas.",
    "morning": "Mañana",
    "afternoon": "Tarde",
    "errors": {
      "loadServices": "Error al cargar los servicios",
      "businessNotFound": "No hemos encontrado este negocio. Revisa el enlace.",
      "loadFailed": "No se pudo cargar la página de reservas. Inténtalo de nuevo en unos minutos.",
      "onlineBookingDisabled": "Este negocio no acepta reservas online en este momento.",
      "slotTaken": "Ese hueco acaba de ocuparse. Hemos actualizado los horarios: elige otro.",
      "outsideHours": "Ese horario está fuera del horario de atención. Elige otro hueco.",
      "tooSoon": "Ese horario está demasiado próximo para reservarlo online. Elige uno más tarde.",
      "tooFar": "Esa fecha está demasiado lejos para reservar online. Elige una más cercana.",
      "invalidStart": "El horario elegido no es válido. Elige otro hueco.",
      "invalidEmail": "Revisa el email: no parece válido.",
      "invalidPhone": "Revisa el teléfono: no parece válido.",
      "missingFields": "Faltan datos obligatorios. Revisa el formulario.",
      "contactRequired": "Indica un teléfono o un email para poder avisarte.",
      "acceptRequired": "Necesitamos tu aceptación para gestionar la cita.",
      "rateLimited": "Demasiados intentos seguidos. Espera unos minutos y vuelve a probar.",
      "tooManyActive": "Ya tienes varias reservas activas. Contacta con el negocio para gestionarlas.",
      "captchaFailed": "No se pudo completar la verificación de seguridad. Inténtalo de nuevo.",
      "serviceNotFound": "Este servicio ya no está disponible. Elige otro.",
      "practitionerUnavailable": "Ese profesional ya no está disponible para este servicio. Elige otro.",
      "invalidLocation": "Esa sede ya no está disponible. Elige otra.",
      "network": "Sin conexión. Comprueba tu internet e inténtalo de nuevo."
    },
    "stepNames": {
      "location": "Sede",
      "service": "Servicio",
      "practitioner": "Profesional",
      "slot": "Fecha y hora",
      "details": "Tus datos",
      "done": "Confirmación"
    },
    "changeLocation": "← Cambiar sede",
    "changeSlot": "← Cambiar fecha u hora",
    "durationShort": "{{minutes}} min",
    "price": "Precio",
    "noPractitionersFor": "Ahora mismo no hay profesionales disponibles para «{{service}}». Elige otro servicio.",
    "callBusiness": "Llamar al {{phone}}",
    "dateOutOfRange": "Solo se puede reservar entre el {{from}} y el {{to}}.",
    "tzNotice": "Las horas se muestran en la hora local del negocio: {{zone}}.",
    "closedDay": "El negocio está cerrado el {{date}}.",
    "searchingNext": "Buscando el siguiente día con huecos…",
    "noNextAvailable": "No hemos encontrado huecos en los próximos días. Prueba con otra fecha u otro profesional.",
    "nextAvailable": "Siguiente día disponible: {{date}}",
    "requiredHint": "* Campo obligatorio",
    "privacyNotice": "Responsable de tus datos: {{business}}. Se usan únicamente para gestionar tu cita y avisarte de ella; BookingForNow los trata por encargo del negocio. Puedes pedir acceder a ellos, corregirlos o borrarlos contactando con {{business}}.",
    "privacyLink": "Política de privacidad",
    "captchaExpired": "La verificación ha caducado. Complétala de nuevo para continuar.",
    "submitting": "Reservando…",
    "demo": {
      "notice": "Esto es una demostración: no se crea ninguna cita real.",
      "detail": "Nada de lo que escribas se envía ni se guarda.",
      "cta": "Crea tu página de reservas gratis",
      "linkLabel": "Ver una página de reservas de ejemplo"
    }
  },
  "dashboard": {
    "patient": {
      "selectTitle": "Seleccionar Cliente",
      "search": "Buscar cliente por nombre, teléfono o email…",
      "sessions": "citas"
    },
    "appointment": {
      "date": "Fecha",
      "time": "Hora",
      "create": "Crear cita",
      "editTitle": "Editar cita",
      "saveChanges": "Guardar cambios"
    }
  },
  "calendar": {
    "title": "Calendario de Citas",
    "legend": {
      "title": "Leyenda:",
      "paid": "Pagado",
      "unpaid": "Pendiente de cobro",
      "closed": "No laborable",
      "overdue": "Sin cobrar (ya pasada)"
    },
    "view": {
      "month": "Mes",
      "week": "Semana",
      "day": "Día"
    },
    "weekTotal": "Total semana",
    "today": "Hoy",
    "hideAmount": "Ocultar importe",
    "showAmount": "Mostrar importe",
    "deleteMessage": "¿Está seguro de que desea eliminar esta cita?",
    "sessionNotes": "Notas de la cita",
    "deleteDetails": "Esta acción no se puede deshacer.",
    "saving": "Guardando...",
    "sessionNotesHint": "Estas notas quedan asociadas a esta cita específica",
    "remind": "Recordar",
    "newPatient": "Nuevo Cliente",
    "session": "cita",
    "useBono": "Usar paquete",
    "noBonoOption": "Sin paquete (pago suelto)",
    "moveMessage": "¿Está seguro de que desea mover esta cita?",
    "editPatient": "Editar Cliente",
    "timeSlotHint": "Horas permitidas: {{start}} - {{end}} en pasos de 30 minutos",
    "deleteTitle": "Eliminar Cita",
    "noPhone": "Sin teléfono",
    "sessionNotesPlaceholder": "Observaciones, tratamiento realizado, estado del cliente...",
    "creating": "Creando...",
    "moveTitle": "Mover Cita",
    "noPatients": "No se encontraron clientes",
    "patient": "Cliente",
    "moveBtnText": "Mover",
    "navNextPeriod": "Período siguiente",
    "exportByApptLabel": "Exportar facturas por cita del mes de {{month}}",
    "navPrevPeriod": "Período anterior",
    "navGoNextPeriod": "Ir al período siguiente",
    "exportByPatientLabel": "Exportar facturas por cliente del mes de {{month}}",
    "whatsappReminder": "Enviar recordatorio por WhatsApp",
    "exportByAppt": "Exportar facturas por cita (una factura por cada cita)",
    "editPatientInfo": "Editar información del cliente",
    "navGoPrevPeriod": "Ir al período anterior",
    "exportByPatient": "Exportar facturas por cliente (una factura agrupando citas del cliente)",
    "closedSlot": "No laborable / Cerrado",
    "moreCount": "+{{count}} más",
    "form": {
      "service": "Servicio",
      "serviceNone": "Sin servicio",
      "duration": "Duración",
      "durationOther": "Otra",
      "priceLabel": "Importe",
      "paid": "Pagada",
      "collected": "Cobrado",
      "pending": "Pendiente",
      "bonoPrice": "Incluido en el paquete",
      "practitioner": "Profesional",
      "practitionerNone": "Sin asignar",
      "noPractitionersForService": "Ningún profesional activo tiene asignado este servicio (revísalo en Catálogos → Profesionales).",
      "allProfessionals": "Todos los profesionales",
      "durationFromService": "La duración la marca el servicio. Podrás ajustarla después editando la cita."
    },
    "overlapPractitioner": "Ese profesional ya tiene una cita a esa hora: {{name}} ({{time}}).",
    "overlapPatient": "El cliente ya tiene otra cita a esa hora ({{time}}).",
    "toasts": {
      "patientNotFound": "No se encontró el cliente de esta cita",
      "patientUnknown": "Cliente desconocido",
      "invalidTime": "La hora debe estar entre {{start}} y {{end}} en pasos de 30 minutos",
      "exportBadFormat": "La exportación no devolvió el formato esperado. Inténtalo de nuevo.",
      "exportError": "Error al exportar el informe",
      "cancelled": "Cita cancelada",
      "cancelledNotified": "Cita cancelada. El cliente recibirá un email de aviso.",
      "cancelError": "No se ha podido cancelar la cita",
      "updatedNotified": "Cita actualizada. El cliente recibirá un email con la nueva hora.",
      "rescheduledNotified": "Cita reprogramada. El cliente recibirá un email con la nueva hora."
    },
    "timezoneNote": "Horas en la zona horaria del negocio: {{tz}}",
    "showCancelled": "Mostrar canceladas",
    "blockedSlot": "Bloqueado",
    "minutesShort": "{{count}} min",
    "moveDetails": "{{from}} → {{to}}",
    "movePractitioner": "Profesional: {{from}} → {{to}}",
    "movePastWarning": "Atención: la nueva fecha ya ha pasado",
    "errors": {
      "practitionerNotAssigned": "Ese profesional no tiene asignado este servicio. Elige otro profesional o revisa Catálogos.",
      "bonoUnavailable": "El paquete ya no tiene citas disponibles. Elige otro o crea la cita sin paquete.",
      "invalidDuration": "La duración debe ser un número entero de minutos entre {{min}} y {{max}}."
    },
    "whatsapp": {
      "reminder": "Hola {{name}}, te recordamos tu cita en {{business}} el {{date}} a las {{time}}. Si necesitas cambiarla o no puedes venir, avísanos. ¡Gracias!",
      "reminderNoBusiness": "Hola {{name}}, te recordamos tu cita del {{date}} a las {{time}}. Si necesitas cambiarla o no puedes venir, avísanos. ¡Gracias!"
    },
    "notify": {
      "label": "Avisar al cliente por email",
      "hint": "Le enviaremos un email a {{email}} con la nueva hora."
    },
    "cancel": {
      "button": "Cancelar cita",
      "title": "Cancelar cita",
      "message": "La cita quedará cancelada y su hueco libre. Podrás seguir viéndola con «Mostrar canceladas».",
      "confirm": "Sí, cancelar",
      "keep": "No, mantenerla"
    },
    "viewTitle": "Detalle de la cita",
    "readOnlyNotice": "Tu rol solo permite consultar la agenda."
  },
  "adminAjustes": {
    "title": "Ajustes de reserva online",
    "loading": "Cargando…",
    "bookingUrl": "URL pública de reservas:",
    "copyLink": "Copiar",
    "saved": "Cambios guardados",
    "save": "Guardar cambios",
    "saving": "Guardando…",
    "online": {
      "legend": "Reservas online",
      "enable": "Habilitar página pública de reservas",
      "autoAccept": "Aceptar citas automáticamente (sin revisión manual)",
      "autoAcceptOnHint": "Cada reserva online queda confirmada al instante y ocupa el hueco en tu agenda. Las de clientes con varias ausencias previas seguirán pidiendo tu aprobación.",
      "autoAcceptOffHint": "Cada reserva online llega como «Pendiente»: el hueco queda reservado, pero no se confirma hasta que la apruebas.",
      "goToPending": "Ver reservas pendientes",
      "noCaptchaHint": "La verificación anti-bots todavía no está activada en la plataforma. Hasta entonces, por seguridad, cada reserva online entrará como pendiente y tendrás que aceptarla en Reservas, aunque tengas activada la confirmación automática."
    },
    "policy": {
      "label": "Plazo para cancelar o cambiar la cita online",
      "none": "Sin límite (hasta la hora de la cita)",
      "hoursBefore_one": "{{count}} hora antes",
      "hoursBefore_few": "{{count}} horas antes",
      "hoursBefore_many": "{{count}} horas antes",
      "hoursBefore_other": "{{count}} horas antes",
      "custom": "Otro plazo…",
      "customLabel": "Horas de antelación (de 0 a 720)",
      "hoursUnit": "horas",
      "hint": "Tus clientes pueden cancelar o cambiar su cita desde el enlace que reciben al reservar. Si falta menos tiempo del que elijas, ya no podrán hacerlo por ese enlace y se les pedirá que contacten contigo. No se cobra nada: solo se bloquean el cambio y la cancelación online. Tú puedes cancelar o mover cualquier cita desde la agenda en todo momento, y las reservas nuevas no se ven afectadas.",
      "invalid": "Indica un plazo en horas enteras, entre 0 y 720."
    },
    "locale": {
      "legend": "Localización",
      "language": "Idioma",
      "currency": "Moneda",
      "timezone": "Zona horaria",
      "country": "País (ISO)",
      "timezonePlaceholder": "Selecciona una zona horaria",
      "invalidNotice": "Revisa los valores marcados: con una zona horaria, moneda o idioma incorrectos tus clientes verán horas y precios equivocados.",
      "goToConfig": "Cambiar en Configuración",
      "usedByBookingPage": "Tu página de reservas muestra las horas y los precios con estos valores."
    },
    "eyebrow": "Reserva online",
    "toasts": {
      "loadError": "Error al cargar los ajustes",
      "saveError": "Error al guardar"
    },
    "share": {
      "title": "Comparte tu página de reservas",
      "subtitle": "Este es el enlace donde tus clientes reservan solos. Ponlo en Instagram, Google Maps, WhatsApp, tu web o en el mostrador.",
      "copied": "Copiado",
      "copyFailed": "No se ha podido copiar. Selecciona el texto y cópialo a mano.",
      "open": "Ver como cliente",
      "disabledNotice": "Tu página todavía no acepta reservas: activa «Habilitar página pública de reservas» más abajo y guarda los cambios.",
      "noServices": "No tienes ningún servicio activo: tus clientes verán la página vacía.",
      "noPractitioners": "No tienes ningún profesional activo: tus clientes no encontrarán huecos.",
      "goToCatalogs": "Ir a servicios y profesionales",
      "trialBranding": "Durante la prueba, tu página de reservas, el portal de citas, los emails a tus clientes y la cita que añaden a su calendario llevan una mención discreta a BookingForNow, y tras reservar tus clientes ven una invitación a crear su propia página gratis. Con Starter o Pro desaparece todo.",
      "whatsapp": "Compartir por WhatsApp",
      "whatsappMessage": "Reserva tu cita en {{name}} cuando quieras, en menos de un minuto: {{url}}",
      "showQr": "Código QR",
      "qrAlt": "Código QR de tu página de reservas",
      "qrHint": "Imprímelo y ponlo en el mostrador, el escaparate o tus tarjetas: al escanearlo se abre tu página de reservas.",
      "printQr": "Imprimir",
      "printCta": "Escanea y reserva tu cita",
      "downloadQr": "Descargar (SVG)",
      "qrError": "No se ha podido generar el código QR. Recarga la página e inténtalo de nuevo.",
      "popupBlocked": "El navegador ha bloqueado la ventana de impresión. Permite las ventanas emergentes para este sitio o descarga el QR.",
      "embedLabel": "Botón «Reservar» para tu web",
      "embedHint": "Pega este código en tu web: muestra un botón que abre tu página de reservas en una pestaña nueva.",
      "embedButtonLabel": "Reservar cita",
      "copyEmbed": "Copiar código",
      "iframeLabel": "O incrusta la página de reservas en tu web",
      "iframeHint": "Pégalo donde quieras que aparezca el formulario de reserva. Si tu web no admite iframes, usa el botón de arriba.",
      "copyIframe": "Copiar código",
      "iframeTitle": "Reservar cita en {{name}}"
    },
    "referral": {
      "title": "Recomienda BookingForNow",
      "lede_one": "Comparte tu enlace con otros negocios. Cuando uno se registre con él y reciba su primera reserva online, te regalamos {{count}} día con todas las funciones o, si ya pagas un plan, una mensualidad como saldo a favor.",
      "lede_few": "Comparte tu enlace con otros negocios. Cuando uno se registre con él y reciba su primera reserva online, te regalamos {{count}} días con todas las funciones o, si ya pagas un plan, una mensualidad como saldo a favor.",
      "lede_many": "Comparte tu enlace con otros negocios. Cuando uno se registre con él y reciba su primera reserva online, te regalamos {{count}} días con todas las funciones o, si ya pagas un plan, una mensualidad como saldo a favor.",
      "lede_other": "Comparte tu enlace con otros negocios. Cuando uno se registre con él y reciba su primera reserva online, te regalamos {{count}} días con todas las funciones o, si ya pagas un plan, una mensualidad como saldo a favor.",
      "linkLabel": "Tu enlace de recomendación:",
      "whatsapp": "Recomendar por WhatsApp",
      "whatsappMessage": "Te recomiendo BookingForNow para gestionar las citas de tu negocio: tus clientes reservan online solos y tiene plan gratis. Pruébalo aquí: {{url}}",
      "terms": "Condiciones del programa",
      "stats": {
        "signedUp": "Se han registrado",
        "activated": "Ya reciben reservas",
        "rewards": "Recompensas este año",
        "rewardsValue": "{{n}} de {{max}}"
      },
      "newReward": "Tu recomendación ha dado fruto: ya tienes una recompensa aplicada en tu cuenta.",
      "historyTitle": "Tus recompensas",
      "reward": {
        "trial_one": "{{count}} día con todas las funciones, hasta el {{date}}",
        "trial_few": "{{count}} días con todas las funciones, hasta el {{date}}",
        "trial_many": "{{count}} días con todas las funciones, hasta el {{date}}",
        "trial_other": "{{count}} días con todas las funciones, hasta el {{date}}",
        "credit": "Saldo a favor de {{amount}} en tu suscripción",
        "failed": "No hemos podido aplicarla automáticamente: la revisamos a mano y te escribimos.",
        "cap": "Sin recompensa: ya habías recibido las {{max}} de este año."
      },
      "privacy": "Solo verás cifras: no te decimos qué negocios se han registrado con tu enlace."
    },
    "errors": {
      "invalidBranding": "El logo o el color no son válidos. Usa una URL https y un color en formato #RRGGBB."
    },
    "branding": {
      "legend": "Imagen de tu página"
    }
  },
  "adminAuditoria": {
    "title": "Auditoría",
    "subtitle": "Registro inalterable de quién cambió qué en tu negocio.",
    "filter": {
      "action": "Acción",
      "entity": "Entidad",
      "actor": "Email de quien hizo el cambio",
      "apply": "Aplicar",
      "loading": "Cargando…",
      "allEntities": "Todas",
      "allActions": "Todas",
      "actorPlaceholder": "persona@ejemplo.com"
    },
    "cols": {
      "date": "Fecha",
      "actor": "Quién",
      "action": "Acción",
      "entity": "Entidad",
      "id": "ID",
      "ip": "IP"
    },
    "close": "Cerrar",
    "view": "Ver",
    "empty": "Sin entradas.",
    "eyebrow": "Registro",
    "noActor": "Cliente o sistema",
    "verbs": {
      "create": "Creación",
      "update": "Modificación",
      "delete": "Eliminación",
      "anonymize": "Anonimización (supresión de datos)",
      "bulk_import": "Importación masiva",
      "reschedule": "Reprogramación",
      "accept": "Aceptación",
      "reject": "Rechazo",
      "cancel": "Cancelación",
      "mark_paid": "Marcada como pagada",
      "upload": "Subida de archivo",
      "logo_upload": "Subida de logotipo",
      "practitioners_update": "Cambio de profesionales asignados",
      "services_update": "Cambio de servicios asignados",
      "locations_update": "Cambio de sedes asignadas",
      "checkout_started": "Inicio del pago de la suscripción",
      "confirmed_from_checkout": "Suscripción confirmada",
      "cancel_scheduled": "Cancelación de suscripción programada",
      "reactivated": "Suscripción reactivada",
      "downgraded_manual": "Cambio a un plan inferior",
      "billing_export": "Exportación de facturación",
      "plan_changed": "Cambio de plan",
      "ended_reconciled": "Suscripción finalizada",
      "tenant_extend_trial": "Prueba ampliada por soporte",
      "tenant_activate": "Cuenta activada por soporte",
      "tenant_suspend": "Cuenta suspendida por soporte",
      "tenant_set_plan": "Plan cambiado por soporte",
      "restore": "Restauración de copia de seguridad",
      "invite": "Invitación al equipo",
      "resend": "Invitación reenviada",
      "remove": "Retirada del equipo",
      "terms_accepted": "Aceptación de los Términos y la Política de privacidad",
      "attribution": "Origen del alta",
      "rewarded": "Recompensa del programa de recomendación",
      "marketing_unsubscribed": "Baja de los emails de consejos y ofertas",
      "restore_failed": "Restauración de copia de seguridad fallida",
      "prices_update": "Cambio de precios",
      "feed_rotate": "Nuevo enlace del calendario sincronizado"
    },
    "entities": {
      "patient": "Cliente",
      "appointment": "Cita",
      "bono": "Bono",
      "patient_file": "Archivo de cliente",
      "service": "Servicio",
      "practitioner": "Profesional",
      "location": "Sede",
      "time_block": "Bloqueo de horario",
      "note_template": "Plantilla de nota",
      "clinical_note": "Nota de sesión",
      "consent_form_template": "Plantilla de consentimiento",
      "consent_signature": "Firma de consentimiento",
      "tenant_settings": "Ajustes del negocio",
      "tenant": "Suscripción",
      "report": "Informe",
      "tenant_user": "Miembro del equipo",
      "backup": "Copia de seguridad",
      "email_preferences": "Preferencias de email",
      "configuration": "Configuración"
    },
    "pagination": {
      "range": "Registros {{from}}–{{to}}"
    },
    "errors": {
      "invalidFilter": "Filtro no válido: el email no puede contener espacios, comas, paréntesis, * ni %."
    }
  },
  "adminBloqueos": {
    "title": "Bloqueos de horario",
    "subtitle": "Períodos en los que un profesional o sede no está disponible (vacaciones, formación, mantenimiento…).",
    "filter": {
      "practitioner": "Profesional",
      "location": "Sede",
      "all": "— Todos —",
      "allF": "— Todas —",
      "hidePast": "Ocultar bloqueos pasados"
    },
    "form": {
      "newTitle": "Nuevo bloqueo",
      "editTitle": "Editar bloqueo",
      "practitioner": "Profesional",
      "location": "Sede",
      "start": "Inicio",
      "end": "Fin",
      "reason": "Motivo",
      "reasonPlaceholder": "Vacaciones, formación…",
      "globalHint": "Sin profesional ni sede, el bloqueo cierra todo el negocio: nadie podrá reservar en ese periodo.",
      "timezoneHint": "Las horas son las de la zona horaria del negocio: {{zone}}."
    },
    "empty": "Sin bloqueos.",
    "confirm": {
      "title": "Eliminar bloqueo",
      "message": "¿Seguro que deseas eliminar este bloqueo?"
    },
    "eyebrow": "Disponibilidad",
    "newLabel": "Nuevo bloqueo",
    "blockedLabel": "Bloqueado",
    "allPractitioners": "Todos los profesionales",
    "allLocations": "Todas las sedes",
    "toasts": {
      "requiredTimes": "Inicio y fin obligatorios",
      "endAfterStart": "El fin debe ser posterior al inicio",
      "saved": "Bloqueo guardado"
    },
    "globalLabel": "Cierre general",
    "emptyUpcoming": "No hay bloqueos próximos",
    "emptyHint": "Bloquea vacaciones, festivos o ausencias para que nadie pueda reservar en esas horas.",
    "errors": {
      "notOwn": "Solo puedes gestionar tus propios bloqueos.",
      "tooLong": "Un bloqueo no puede durar más de {{days}} días.",
      "invalid": "Revisa las fechas y el motivo del bloqueo."
    }
  },
  "adminCatalogos": {
    "title": "Catálogos",
    "subtitle": "Administra tus servicios, profesionales y sedes.",
    "info": "Un servicio es lo que ofreces (p. ej. una sesión). Un profesional es quien la realiza. Una sede es el lugar físico. Para vincularlos, simplemente edita un servicio o profesional y marca las casillas correspondientes.",
    "loading": "Cargando…",
    "catalog": {
      "practitioners": "Profesionales asignados"
    },
    "tabs": {
      "services": "Servicios ({{count}})",
      "practitioners": "Profesionales ({{count}})",
      "locations": "Sedes ({{count}})"
    },
    "common": {
      "save": "Guardar",
      "cancel": "Cancelar",
      "edit": "Editar",
      "delete": "Eliminar",
      "saving": "Guardando…",
      "active": "Activo",
      "inactive": "Inactivo"
    },
    "services": {
      "form": {
        "newTitle": "Nuevo servicio",
        "editTitle": "Editar servicio",
        "name": "Nombre",
        "namePlaceholder": "Ej. Corte de pelo, Consulta inicial, Revisión…",
        "duration": "Duración (min)",
        "price": "Precio",
        "tax": "Impuesto (%)",
        "color": "Color",
        "active": "Activo",
        "description": "Descripción"
      },
      "durationUnit": "{{min}} min",
      "newLabel": "Nuevo servicio",
      "emptyTitle": "Añade tu primer servicio",
      "emptyHint": "Un servicio es lo que tus clientes ven y reservan: nombre, duración y precio."
    },
    "practitioners": {
      "form": {
        "newTitle": "Nuevo profesional",
        "editTitle": "Editar profesional",
        "firstName": "Nombre",
        "lastName": "Apellidos",
        "email": "Email",
        "phone": "Teléfono",
        "color": "Color",
        "active": "Activo",
        "bio": "Biografía"
      },
      "assignments": {
        "services": "Servicios",
        "locations": "Sedes",
        "noServices": "No hay servicios definidos aún.",
        "noLocations": "No hay sedes definidas aún."
      },
      "empty": "Sin profesionales.",
      "newLabel": "Nuevo profesional",
      "emptyTitle": "Añade a tu equipo",
      "emptyHint": "Los profesionales son quienes atienden las citas. Cada uno tiene su propia agenda."
    },
    "locations": {
      "form": {
        "newTitle": "Nueva sede",
        "editTitle": "Editar sede",
        "name": "Nombre",
        "address": "Dirección",
        "cp": "Código postal",
        "city": "Ciudad",
        "province": "Provincia / región",
        "country": "País",
        "phone": "Teléfono",
        "email": "Email",
        "timezone": "Zona horaria",
        "timezonePlaceholder": "Selecciona una zona horaria",
        "active": "Activa"
      },
      "newLabel": "Nueva sede",
      "emptyTitle": "Crea tu primera sede",
      "emptyHint": "La sede es tu local o lugar de trabajo. Hace falta al menos una para asignar profesionales."
    },
    "confirm": {
      "title": "Confirmar eliminación",
      "serviceMessage": "¿Seguro que deseas eliminar este servicio?",
      "practitionerMessage": "¿Seguro que deseas eliminar este profesional?",
      "locationMessage": "¿Seguro que deseas eliminar esta sede?",
      "serviceLabel": "Servicio",
      "practitionerLabel": "Profesional",
      "locationLabel": "Sede"
    },
    "eyebrow": "Configuración",
    "toasts": {
      "nameRequired": "Nombre obligatorio",
      "locationRequired": "Debes asignar al menos una sede",
      "serviceSaved": "Servicio guardado",
      "practitionerSaved": "Profesional guardado",
      "locationSaved": "Sede guardada",
      "loadError": "Error al cargar los catálogos",
      "saveError": "Error al guardar",
      "serviceRequired": "El nombre y la duración son obligatorios"
    },
    "inUse": {
      "title": "No se puede eliminar",
      "message": "Tiene citas u otros datos asociados: si se eliminara, ese historial quedaría incompleto.",
      "details": "Puedes desactivarlo: dejará de ofrecerse para nuevas reservas y el historial se conserva.",
      "confirm": "Desactivar",
      "deactivated": "Desactivado: ya no se ofrece para nuevas reservas"
    }
  },
  "adminPendientes": {
    "title": "Reservas pendientes",
    "refresh": "Refrescar",
    "loading": "Cargando…",
    "empty": "No hay reservas pendientes de confirmar.",
    "accept": "Aceptar",
    "reject": "Rechazar",
    "modal": {
      "title": "Rechazar reserva",
      "reason": "Motivo (opcional, se envía al cliente)",
      "cancel": "Cancelar",
      "confirm": "Confirmar rechazo"
    },
    "eyebrow": "Bandeja de entrada",
    "toasts": {
      "acceptError": "Error al aceptar la reserva",
      "rejectError": "Error al rechazar la reserva",
      "alreadyHandled": "Esta reserva ya estaba gestionada (aceptada, rechazada o cancelada) y se ha quitado de la bandeja.",
      "overlap": "No se puede aceptar: ese profesional ya tiene otra cita a esa hora. La reserva sigue pendiente."
    },
    "unnamedClient": "Cliente sin nombre",
    "noService": "Sin servicio",
    "noPractitioner": "Sin profesional asignado",
    "source": {
      "online": "Reserva online",
      "staff": "Creada por el equipo",
      "other": "Otro origen"
    },
    "payment": {
      "none": "Sin pago online",
      "pending": "Pago pendiente",
      "paid": "Pagado",
      "refunded": "Reembolsado",
      "failed": "Pago fallido"
    }
  },
  "billing": {
    "title": "Facturación",
    "planBilling": "Facturación y plan",
    "subtitle": "Elige el plan que mejor se adapta a tu negocio.",
    "info": "Cada plan define los límites de tu cuenta. Free: 1 profesional, 1 sede, 2 usuarios con acceso y hasta 50 clientes. Starter: hasta 3 profesionales, 1 sede y 5 usuarios, con recordatorios automáticos por email. Pro: profesionales, sedes y usuarios ilimitados, con recordatorios automáticos por email y soporte prioritario.",
    "currentStatus": {
      "plan": "Plan actual:",
      "renewal": "Próxima renovación:",
      "manage": "Gestionar suscripción",
      "cancel": "Cancelar suscripción",
      "reactivate": "Reactivar",
      "cancelingTag": "Cancelación programada",
      "willCancelOn": "Se cancelará el {{date}} y tu cuenta pasará al plan Free."
    },
    "cancelModal": {
      "title": "Cancelar suscripción",
      "message": "¿Seguro que quieres cancelar tu suscripción?",
      "keepAccess": "Conservas todas las funciones hasta el {{date}}. Después, tu cuenta pasará al plan Free (1 profesional, 1 sede, hasta 50 clientes y sin recordatorios automáticos).",
      "confirm": "Sí, cancelar",
      "downgradeNow": "Tu plan pasará a Free ahora mismo (1 profesional, 1 sede, hasta 50 clientes y sin recordatorios automáticos)."
    },
    "usageSection": {
      "title": "Uso actual",
      "patients": "Clientes",
      "practitioners": "Profesionales",
      "locations": "Sedes",
      "unlimited": "(ilimitado)"
    },
    "cycle": {
      "monthly": "Mensual",
      "yearly": "Anual",
      "yearlySave": "2 meses gratis"
    },
    "plan": {
      "recommended": "Recomendado",
      "current": "Plan actual",
      "soon": "Próximamente",
      "subscribe": "Suscribirme",
      "change": "Cambiar a este plan"
    },
    "loading": "Cargando...",
    "plans": {
      "free": {
        "tagline": "Gratis para siempre, para empezar a recibir reservas",
        "features": [
          "1 profesional y 1 sede",
          "Hasta 50 clientes",
          "2 usuarios con acceso al panel",
          "Agenda, bonos y página de reserva online 24/7"
        ],
        "note": "Plan gratuito permanente. Cambia de plan cuando quieras."
      },
      "starter": {
        "tagline": "Para negocios pequeños y profesionales individuales",
        "features": [
          "Hasta 3 profesionales y 1 sede",
          "Clientes ilimitados",
          "Hasta 5 usuarios con acceso al panel",
          "Recordatorios automáticos por email",
          "Sin marca BookingForNow en tu página de reservas"
        ]
      },
      "pro": {
        "tagline": "Para negocios en crecimiento con múltiples sedes",
        "features": [
          "Profesionales, sedes y usuarios ilimitados",
          "Recordatorios automáticos por email",
          "Sin marca BookingForNow en tu página de reservas",
          "Soporte prioritario"
        ]
      }
    },
    "freePrice": "Gratis",
    "monthlySuffix": "/mes",
    "yearlySuffix": "/año",
    "yearlyEquivalent": "sale a {{monthly}}/mes",
    "toasts": {
      "planUnavailable": "Este plan aún no está disponible.",
      "checkoutError": "No se pudo iniciar el pago.",
      "portalError": "No se pudo abrir el portal de facturación.",
      "portalNoCustomer": "Aún no tienes una suscripción activa. Elige un plan para empezar.",
      "cancelScheduled": "Tu suscripción se cancelará al final del periodo.",
      "cancelError": "No se pudo cancelar la suscripción.",
      "reactivated": "Suscripción reactivada.",
      "reactivateError": "No se pudo reactivar la suscripción.",
      "planDowngraded": "Tu plan se ha cambiado a Free.",
      "alreadySubscribed": "Ya tienes una suscripción activa. Te llevamos al portal de facturación para cambiar de plan.",
      "checkoutCanceled": "Has salido del pago sin completarlo. No se te ha cobrado nada.",
      "checkoutStub": "Los pagos aún no están activados en este servidor. Escríbenos a soporte@bookingfornow.com y lo activamos contigo.",
      "checkoutConfirmed": "¡Suscripción activada! Gracias por confiar en BookingForNow.",
      "checkoutConfirmPending": "Pago recibido. La activación puede tardar unos segundos: recarga la página si aún no ves tu plan.",
      "samePlan": "Ese ya es tu plan actual.",
      "providerUnavailable": "No hemos podido comprobar tu suscripción con el proveedor de pagos. Inténtalo de nuevo en unos minutos.",
      "paymentIssue": "Tu último pago está pendiente. Actualiza tu método de pago en el portal de facturación antes de cambiar de plan.",
      "planChanged": "Plan cambiado. La diferencia se reflejará en tu próxima factura.",
      "changePlanError": "No se ha podido cambiar el plan. No se te ha cobrado nada."
    },
    "planErrors": {
      "planRequired": "Esta función no está incluida en tu plan actual. Actualiza para activarla.",
      "planLimitReached": "Has alcanzado el límite de tu plan.",
      "subscriptionInactive": "Tu suscripción no está activa. Actualiza tu método de pago para continuar.",
      "goToBilling": "Ve a Configuración → Facturación para actualizar tu plan.",
      "limitPatients": "Has alcanzado el máximo de {{limit}} clientes de tu plan.",
      "limitPractitioners": "Has alcanzado el máximo de {{limit}} profesionales de tu plan.",
      "limitLocations": "Has alcanzado el máximo de {{limit}} sedes de tu plan.",
      "limitTeamMembers": "Has alcanzado el máximo de {{limit}} usuarios de tu plan."
    },
    "downgrade": {
      "warnTitle": "Vas a superar los límites de tu nuevo plan",
      "warnBody": "Al bajar de plan se desactivará lo que supere el límite del nuevo plan: {{resources}}. No se elimina nada: todo se reactivará automáticamente cuando vuelvas a subir de plan.",
      "practitioners_one": "{{count}} profesional",
      "practitioners_few": "{{count}} profesionales",
      "practitioners_many": "{{count}} profesionales",
      "practitioners_other": "{{count}} profesionales",
      "locations_one": "{{count}} sede",
      "locations_few": "{{count}} sedes",
      "locations_many": "{{count}} sedes",
      "locations_other": "{{count}} sedes",
      "confirm": "Entiendo, continuar"
    },
    "deactivatedByPlan": "Desactivado por tu plan",
    "upgradeCta": "Mejora tu plan",
    "planNames": {
      "free": "Free",
      "starter": "Starter",
      "pro": "Pro",
      "trial": "Prueba gratuita"
    },
    "status": {
      "active": "Activa",
      "trialing": "En periodo de prueba",
      "past_due": "Pago pendiente",
      "unpaid": "Impagada",
      "canceled": "Cancelada",
      "incomplete": "Pago sin completar",
      "incomplete_expired": "Pago caducado",
      "paused": "En pausa",
      "unknown": "Estado sin determinar"
    },
    "trialEndsOn": "termina el {{date}}",
    "ownerOnly": "Solo el propietario de la cuenta puede contratar, cambiar o cancelar el plan. Pídele que lo haga desde su usuario.",
    "billedInCurrency": "Los planes se cobran en {{currency}}, aunque tu negocio trabaje en {{own}}. No aplicamos conversión: tu banco hará el cambio de divisa.",
    "changeModal": {
      "title": "Cambiar de plan",
      "message": "Vas a cambiar tu suscripción al plan {{plan}} ({{price}}).",
      "proration": "El cambio se aplica al momento. La parte proporcional del periodo en curso se sumará o se descontará en tu próxima factura.",
      "deactivateWarn": "Al pasar a {{plan}} se desactivarán {{resources}} porque superan su límite. No se eliminan: se reactivarán cuando vuelvas a subir de plan.",
      "confirm": "Confirmar cambio"
    }
  },
  "suspended": {
    "title": "Cuenta suspendida",
    "lead": "El acceso a <strong>{{brand}}</strong> está suspendido temporalmente.",
    "reason": "Tus datos siguen guardados y no se ha borrado nada. Escríbenos y te ayudamos a reactivar la cuenta.",
    "contact": "Contactar con soporte",
    "logout": "Cerrar sesión",
    "support": "Si crees que esto es un error, escribe a",
    "eyebrow": "Cuenta",
    "visitorTitle": "Este negocio no está disponible en este momento",
    "visitorLead": "No podemos mostrarte esta página ahora mismo. Si eres cliente, contacta directamente con el negocio; si la cuenta es tuya, inicia sesión para reactivarla.",
    "mailSubject": "Reactivar la cuenta de {{brand}}"
  },
  "errors": {
    "generic": "Ha ocurrido un error inesperado",
    "network": "Sin conexión con el servidor",
    "notFound": "No se ha encontrado el recurso",
    "forbidden": "No tienes permisos para esta acción",
    "validation": "Revisa los campos marcados",
    "loadAppointments": "Error al cargar las citas",
    "loadPatients": "Error al cargar los clientes",
    "readonlyRole": "Tu usuario es de solo lectura: no puede hacer cambios."
  },
  "locale": {
    "es": "Español",
    "en": "English",
    "fr": "Français",
    "pt": "Português",
    "it": "Italiano",
    "de": "Deutsch",
    "ru": "Русский",
    "zh": "中文",
    "ko": "한국어",
    "ja": "日本語"
  },
  "config": {
    "tabs": {
      "clinic": "Información de la empresa",
      "backup": "Backup"
    },
    "clinic": {
      "title": "Información de la empresa",
      "name": "Nombre de la empresa",
      "phone": "Teléfono",
      "email": "Email",
      "emailInvalid": "Email inválido",
      "address": "Dirección",
      "saving": "Guardando...",
      "eyebrow": "Empresa",
      "emailPlaceholder": "contacto@empresa.com",
      "addressPlaceholder": "Calle Principal 123, Ciudad",
      "contactHint": "Estos datos se muestran en tu página de reservas y se usan como dirección de respuesta en los emails a tus clientes.",
      "nameHint": "Es el nombre que ven tus clientes en la página de reservas y en los emails.",
      "phoneInvalid": "Usa solo números, espacios y los símbolos + - ( )"
    },
    "backup": {
      "title": "Gestión de Backup",
      "subtitle": "Administra las copias de seguridad de la base de datos",
      "create": "Crear Backup",
      "creating": "Creando...",
      "stats": {
        "total": "Total de backups",
        "last": "Último backup",
        "size": "Espacio Usado",
        "next": "Próximo Automático"
      },
      "autoConfig": "Configuración Automática",
      "daily": "Backup Diario",
      "dailyTime": "Todos los días a las 2:00 AM",
      "weekly": "Backup Semanal",
      "weeklyTime": "Domingos a las 3:00 AM",
      "active": "Activo",
      "byDate": "Backups por Fecha",
      "viewList": "Vista Lista",
      "viewDate": "Vista Fecha",
      "refresh": "Actualizar",
      "loading": "Cargando backups...",
      "empty": "No hay backups disponibles",
      "emptyHint": "Crea tu primer backup usando el botón superior",
      "current": "Actual",
      "download": "Descargar",
      "restore": "Restaurar",
      "delete": "Eliminar",
      "cols": {
        "date": "Fecha",
        "name": "Nombre",
        "size": "Tamaño",
        "type": "Tipo",
        "actions": "Acciones"
      },
      "confirmDelete": {
        "title": "Eliminar Backup",
        "message": "¿Está seguro de que desea eliminar este backup?",
        "details": "Esta acción no se puede deshacer.",
        "itemLabel": "Fecha"
      },
      "confirmRestore": {
        "title": "Restaurar Backup",
        "message": "¿Está seguro de que desea restaurar este backup?",
        "details": "Esta acción reemplazará todos los datos actuales con los del backup seleccionado. Los datos actuales se perderán.",
        "itemLabel": "Fecha del backup"
      },
      "eyebrow": "Datos",
      "types": {
        "daily": "Diario",
        "weekly": "Semanal",
        "manual": "Manual",
        "unknown": "Desconocido"
      }
    },
    "loading": "Cargando configuración...",
    "toasts": {
      "loadError": "Error al cargar la configuración",
      "clinicUpdateError": "No se pudieron guardar los datos de contacto. Revisa el teléfono, el email y la dirección.",
      "backupsLoadError": "Error al cargar los backups",
      "backupCreated": "Backup creado exitosamente",
      "backupCreateError": "Error al crear el backup",
      "backupsRefreshed": "Lista de backups actualizada",
      "backupRestored": "Backup restaurado exitosamente",
      "backupRestoreError": "Error al restaurar el backup",
      "backupDeleted": "Backup eliminado exitosamente",
      "backupDeleteError": "Error al eliminar el backup",
      "downloadStarted": "Descarga iniciada",
      "backupDownloadError": "Error al descargar el backup",
      "invalidCountry": "El país debe ser un código ISO de 2 letras (por ejemplo ES, MX o US).",
      "backupRestoreRolledBack": "No se pudo restaurar la copia. Se han recuperado automáticamente los datos que tenías antes.",
      "backupRestorePartial": "La restauración falló a mitad y no se pudieron recuperar los datos automáticamente. Restaura la copia «pre-restore» más reciente para volver al estado anterior.",
      "backupRestoreKeyMissing": "No se puede restaurar: la copia está cifrada y el servidor no tiene configurada una clave de cifrado válida. No se ha modificado ningún dato.",
      "backupRestoreDecryptFailed": "No se puede restaurar: la copia no se ha podido descifrar (se cifró con otra clave o está dañada). No se ha modificado ningún dato.",
      "backupDownloadKeyMissing": "No se puede descargar: la copia está cifrada y el servidor no tiene configurada una clave de cifrado válida.",
      "backupDownloadDecryptFailed": "No se puede descargar: la copia no se ha podido descifrar (se cifró con otra clave o está dañada)."
    },
    "readOnly": "Solo el propietario o un administrador pueden cambiar estos ajustes.",
    "unsaved": {
      "message": "Tienes cambios sin guardar",
      "discard": "Descartar",
      "leaveConfirm": "Tienes cambios sin guardar en Configuración. ¿Salir y descartarlos?"
    }
  },
  "patients": {
    "deleteModal": {
      "itemLabel": "Cliente",
      "title": "Eliminar cliente y suprimir sus datos",
      "message": "¿Seguro que quieres eliminar a este cliente?",
      "confirm": "Eliminar",
      "details": "Sus datos personales (nombre, contacto, dirección, documento, fecha de nacimiento, notas y etiquetas) se anonimizarán de forma irreversible, sus archivos adjuntos se borrarán y sus citas futuras se cancelarán (las sesiones de bono reservadas se devuelven). El historial de citas pasadas y los bonos se conservan sin datos personales. Esta acción no se puede deshacer."
    },
    "editInfo": "Editar información del cliente",
    "addSessions": "Añadir paquete",
    "subtitle": "Administra la información de tus clientes",
    "cols": {
      "patient": "Cliente",
      "actions": "Acciones",
      "delete": "Borrar",
      "edit": "Editar"
    },
    "smart": {
      "estado": "Estado",
      "proxima": "Próxima",
      "visitas": "visitas",
      "bono": "bono",
      "valor": "valor",
      "sinBono": "sin bono",
      "sinVisitas": "sin visitas",
      "sinProxima": "sin próxima cita",
      "ultimaVisita": "últ. visita"
    },
    "perPage": "por página",
    "age": "{{years}} años",
    "show": "Mostrar",
    "clearSearch": "Limpiar búsqueda",
    "total": "clientes",
    "bonoForm": {
      "title": "Nuevo bono",
      "minutes": "Minutos por cita",
      "quantity": "Número de citas",
      "totalPrice": "Precio total",
      "perSession": "Precio por cita",
      "paid": "Pagado",
      "add": "Crear bono",
      "cancel": "Cancelar",
      "created": "Bono creado correctamente"
    },
    "title": "Gestión de Clientes",
    "form": {
      "edit": "Editar Cliente",
      "new": "Nuevo Cliente",
      "save": "Guardar",
      "lastName": "Apellidos",
      "email": "Email",
      "phone": "Teléfono",
      "cp": "CP",
      "whatsappHint": "Preferencia del cliente. No se envía nada automáticamente: desde la agenda puedes mandarle el recordatorio por WhatsApp con un clic.",
      "whatsappLabel": "Acepta recordatorios por WhatsApp",
      "firstName": "Nombre",
      "province": "Provincia / Región",
      "familyContact": "Contacto alternativo",
      "update": "Actualizar",
      "dni": "DNI / Documento",
      "city": "Localidad",
      "address": "Dirección",
      "optional": "(opcional)",
      "birthDate": "Fecha de Nacimiento",
      "phone2": "Teléfono 2",
      "notes": "Notas",
      "firstNamePlaceholder": "Escribe el nombre",
      "lastNamePlaceholder": "Ingrese los apellidos",
      "dniPlaceholder": "DNI, NIE, pasaporte u otro documento",
      "phonePlaceholder": "Con prefijo internacional si es de otro país",
      "phone2Placeholder": "Teléfono alternativo",
      "emailPlaceholder": "correo@ejemplo.com",
      "familyContactPlaceholder": "Nombre y teléfono de otra persona de contacto",
      "addressPlaceholder": "Dirección completa",
      "cpPlaceholder": "Código postal",
      "cityPlaceholder": "Ciudad o localidad",
      "provincePlaceholder": "Provincia, estado o región",
      "notesPlaceholder": "Notas adicionales sobre el cliente...",
      "contactHint": "(teléfono o email: al menos uno)",
      "errors": {
        "firstNameRequired": "El nombre es obligatorio",
        "contactRequired": "Indica al menos un teléfono o un email",
        "phoneInvalid": "Teléfono no válido: usa entre 4 y 15 cifras; puedes incluir +, espacios, paréntesis y guiones",
        "emailInvalid": "El email no es válido"
      }
    },
    "deletePatient": "Eliminar cliente",
    "newBtn": "Nuevo Cliente",
    "viewDetails": "Ver detalles del cliente",
    "showing": "Mostrando {{from}} - {{to}} de {{total}} clientes",
    "addFirst": "Agregar Primer Cliente",
    "cancelBtn": "Cancelar",
    "empty": {
      "noResults": "No se encontraron clientes",
      "noPatients": "No hay clientes registrados",
      "hint": "Comienza agregando tu primer cliente para gestionar sus citas",
      "hintSearch": "Intenta con otros términos de búsqueda"
    },
    "searchPlaceholder": "Buscar por nombre, apellido o teléfono...",
    "import": {
      "button": "Importar",
      "title": "Importar clientes desde CSV",
      "step1": "1. Archivo",
      "step2": "2. Columnas",
      "step3": "3. Importar",
      "chooseFile": "Selecciona un archivo .csv",
      "fileHint": "CSV con cabecera; separador coma o punto y coma; se admiten campos entre comillas.",
      "parseError": "No se pudo leer el archivo. Comprueba que sea un CSV válido.",
      "detected": "{{rows}} filas y {{cols}} columnas detectadas.",
      "mapTitle": "Asigna cada columna a un campo",
      "ignore": "— Ignorar —",
      "preview": "Vista previa (primeras 5 filas)",
      "needFirstName": "Debes asignar una columna al campo Nombre.",
      "fields": {
        "firstName": "Nombre",
        "lastName": "Apellidos",
        "phone": "Teléfono",
        "email": "Email",
        "dni": "DNI / Documento",
        "birthdate": "Fecha de nacimiento",
        "notes": "Notas"
      },
      "importBtn_one": "Importar {{count}} cliente",
      "importBtn_few": "Importar {{count}} clientes",
      "importBtn_many": "Importar {{count}} clientes",
      "importBtn_other": "Importar {{count}} clientes",
      "importing": "Importando…",
      "progress": "{{done}} de {{total}} filas enviadas",
      "summaryTitle": "Importación completada",
      "inserted": "Insertados: {{count}}",
      "skipped": "Omitidos: {{count}}",
      "rowCol": "Fila",
      "reasonCol": "Motivo",
      "error": "La importación falló. Inténtalo de nuevo.",
      "reasons": {
        "invalid_row": "Fila no válida",
        "missing_firstName": "Falta el nombre",
        "invalid_email": "Email no válido",
        "invalid_birthdate": "Fecha de nacimiento no válida",
        "duplicate": "Duplicado (ya existe un cliente con ese email o teléfono)"
      },
      "datesDropped": "{{count}} fechas de nacimiento no se reconocieron: esos clientes se han importado sin fecha."
    },
    "eyebrow": "Directorio",
    "toasts": {
      "createFirst": "Crea el cliente y luego podrás asignarle la cita",
      "created": "Cliente creado exitosamente",
      "createError": "Error al crear el cliente",
      "updated": "Cliente actualizado exitosamente",
      "updateError": "Error al actualizar el cliente",
      "deleted": "Cliente eliminado: datos anonimizados y citas futuras canceladas",
      "deleteError": "Error al eliminar el cliente",
      "loadEditError": "Error al cargar el cliente para editar",
      "loadOneError": "Error al cargar los datos del cliente",
      "bonoCreateError": "Error al crear el bono"
    },
    "status": {
      "nuevo": "Nuevo",
      "activo": "Activo",
      "fiel": "Fiel",
      "riesgo": "En riesgo"
    },
    "export": {
      "button": "Exportar",
      "createdAt": "Fecha de alta",
      "filename": "clientes",
      "done": "{{count}} clientes exportados",
      "error": "No se pudo exportar la lista de clientes. Inténtalo de nuevo."
    }
  },
  "patientDetail": {
    "loading": "Cargando...",
    "loadingDetails": "Cargando detalles del cliente...",
    "age": "{{years}} años",
    "back": "Volver",
    "edit": "Editar",
    "tags": {
      "placeholder": "Nueva etiqueta",
      "empty": "Sin etiquetas",
      "removeLabel": "Quitar etiqueta"
    },
    "stats": {
      "nextVisit": "Próxima visita",
      "noShows": "No presentado",
      "totalAppointments": "Total citas",
      "completed": "Completadas",
      "lastVisit": "Última visita",
      "totalSpent": "Gasto total",
      "cancelledSub_one": "{{count}} cancelada",
      "cancelledSub_few": "{{count}} canceladas",
      "cancelledSub_many": "{{count}} canceladas",
      "cancelledSub_other": "{{count}} canceladas"
    },
    "info": {
      "phone2": "TELÉFONO 2",
      "familyContact": "CONTACTO ALTERNATIVO",
      "phone": "TELÉFONO",
      "city": "LOCALIDAD",
      "address": "DIRECCIÓN",
      "province": "PROVINCIA / REGIÓN",
      "age": "EDAD",
      "email": "EMAIL",
      "birthDate": "FECHA DE NACIMIENTO",
      "fullName": "NOMBRE COMPLETO",
      "title": "Información personal",
      "dni": "DOCUMENTO DE IDENTIDAD",
      "cp": "CÓDIGO POSTAL",
      "notes": "NOTAS"
    },
    "sessions": {
      "used": "Citas usadas",
      "addTitle": "Añadir bono",
      "active": "Citas disponibles",
      "title": "Citas disponibles",
      "empty": "Sin bonos activos",
      "total": "Citas totales"
    },
    "system": {
      "updated": "Última actualización:",
      "created": "Registrado:"
    },
    "tabs": {
      "history": "Historial de Citas",
      "files": "Archivos",
      "credits": "Citas"
    },
    "history": {
      "loading": "Cargando...",
      "colNotes": "Notas",
      "loadingText": "Cargando historial de citas...",
      "colDate": "Fecha",
      "empty": "No hay citas registradas para este cliente.",
      "colTime": "Hora",
      "colDuration": "Duración",
      "colService": "Servicio",
      "colPrice": "Importe"
    },
    "files": {
      "loadingFiles": "Cargando archivos...",
      "allowedTypes": "Archivos permitidos: JPG, PNG, GIF, WEBP, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV (máx. 4 MB)",
      "empty": "No hay archivos adjuntos",
      "previewClickTitle": "Clic para ver en grande",
      "descriptionPlaceholder": "Describe el contenido del archivo...",
      "uploading": "Subiendo...",
      "emptyHint": "Sube el primer archivo usando el formulario de arriba",
      "selectLabel": "Seleccionar archivo",
      "uploadTitle": "Subir nuevo archivo",
      "downloadTitle": "Descargar archivo",
      "descriptionLabel": "Descripción (opcional)",
      "upload": "Subir archivo",
      "deleteTitle": "Eliminar archivo",
      "categoryLabel": "Categoría",
      "listTitle": "Archivos del cliente",
      "categories": {
        "document": "Documento",
        "photo": "Foto / imagen",
        "consent": "Consentimiento",
        "invoice": "Factura / presupuesto",
        "report": "Informe",
        "other": "Otro"
      }
    },
    "packs": {
      "empty": "Este cliente no tiene bonos",
      "title": "Bonos",
      "addFirst": "Añadir el primer bono",
      "addBtn": "Añadir bono"
    },
    "notFound": {
      "title": "Cliente no encontrado",
      "message": "El cliente que buscas no existe o ha sido eliminado",
      "back": "Volver a Clientes"
    },
    "deleteFileModal": {
      "confirm": "Eliminar",
      "title": "Eliminar archivo",
      "itemLabel": "Archivo",
      "details": "Esta acción no se puede deshacer.",
      "message": "¿Seguro que deseas eliminar este archivo?"
    },
    "preview": {
      "closeTitle": "Cerrar",
      "download": "Descargar archivo",
      "downloadTitle": "Descargar",
      "noPreview": "Vista previa no disponible para este tipo de archivo",
      "loading": "Cargando vista previa…",
      "loadError": "No se pudo cargar la vista previa. Puedes descargar el archivo."
    },
    "markPaidModal": {
      "title": "Marcar como pagado",
      "message": "¿Confirmas que este bono ya está pagado?",
      "confirm": "Marcar pagado"
    },
    "eyebrow": "Ficha del cliente",
    "toasts": {
      "maxTags": "Máximo 20 etiquetas por cliente.",
      "tagsSaveError": "No se pudieron guardar las etiquetas.",
      "filesLoadError": "Error al cargar los archivos",
      "fileTooLarge": "El archivo es demasiado grande (máximo 4 MB)",
      "fileTypeNotAllowed": "Tipo de archivo no permitido",
      "fileUploaded": "Archivo subido exitosamente",
      "fileUploadError": "Error al subir el archivo",
      "fileDownloadError": "Error al descargar el archivo",
      "fileDeleted": "Archivo eliminado exitosamente",
      "fileDeleteError": "Error al eliminar el archivo"
    },
    "loadError": {
      "title": "No se pudo cargar la ficha",
      "message": "Ha fallado la conexión o el servidor. El cliente no se ha borrado: vuelve a intentarlo.",
      "retry": "Reintentar"
    },
    "quick": {
      "label": "Acciones rápidas",
      "call": "Llamar",
      "whatsapp": "WhatsApp",
      "email": "Email",
      "newAppointmentLabel": "Nueva cita para {{name}}",
      "callLabel": "Llamar a {{name}}",
      "whatsappLabel": "Escribir a {{name}} por WhatsApp",
      "emailLabel": "Enviar un email a {{name}}"
    }
  },
  "bonos": {
    "eyebrow": "Sesiones prepagadas",
    "title": "Bonos",
    "subtitle": "Gestiona los bonos (paquetes de citas prepagadas) de tus clientes.",
    "info": "Un bono son varias sesiones de la misma duración para un cliente, por un precio total. Se usa al crear su cita en la agenda: eliges el bono en «Usar paquete» y se descuenta una sesión. Si la cita se cancela o se borra, la sesión vuelve al bono. Las reservas online no descuentan del bono.",
    "new": "Nuevo bono",
    "formTitle": "Nuevo bono",
    "patient": "Cliente",
    "minutes": "Minutos por cita",
    "quantity": "Número de citas",
    "totalPrice": "Precio total",
    "pricePerSession": "Precio por cita",
    "perSessionShort": "/cita",
    "paid": "Pagado",
    "save": "Crear bono",
    "saving": "Guardando…",
    "cancel": "Cancelar",
    "loading": "Cargando…",
    "empty": "Aún no hay bonos. Crea el primero.",
    "minSessions_one": "{{min}} min · {{count}} cita",
    "minSessions_few": "{{min}} min · {{count}} citas",
    "minSessions_many": "{{min}} min · {{count}} citas",
    "minSessions_other": "{{min}} min · {{count}} citas",
    "paidChip": "Pagado",
    "pendingChip": "Pendiente",
    "togglePaidTitle": "Cambiar estado de pago",
    "delete": "Borrar",
    "created": "Bono creado correctamente",
    "deleted": "Bono borrado",
    "markedPaid": "Bono marcado como pagado",
    "markedPending": "Bono marcado como pendiente de pago",
    "inUse": "No se puede borrar: este bono ya tiene citas usadas.",
    "loadError": "Error al cargar los bonos",
    "createError": "Error al crear el bono",
    "updateError": "Error al actualizar el bono",
    "deleteError": "Error al borrar el bono",
    "deleteModal": {
      "title": "Borrar bono",
      "message": "¿Seguro que deseas borrar este bono?",
      "details": "Esta acción no se puede deshacer."
    },
    "itemLabel": "Bono",
    "changePatient": "Cambiar",
    "filters": {
      "label": "Filtrar bonos",
      "all": "Todos",
      "unpaid": "Pendientes de pago",
      "active": "Con sesiones",
      "spent": "Agotados",
      "noMatches": "Ningún bono coincide con el filtro o la búsqueda."
    },
    "unpaidTotal": "Pendiente de cobro:",
    "createdOn": "Creado el {{date}}"
  },
  "patientPortal": {
    "loading": "Cargando…",
    "title": "Tu cita",
    "when": "Fecha y hora",
    "statusLabel": "Estado",
    "confirmReschedule": "Confirmar cambio",
    "cancel": "Cancelar cita",
    "notFound": "Cita no encontrada o enlace no válido",
    "cancelConfirm": "¿Seguro que quieres cancelar tu cita?",
    "cancelled": "Tu cita ha sido cancelada.",
    "rescheduled": "Tu cita ha sido reprogramada.",
    "actionError": "No se pudo completar la acción. Inténtalo de nuevo.",
    "cancelTitle": "Cancelar cita",
    "policyWindow": "Puedes cancelar o reprogramar hasta {{hours}}h antes de la cita.",
    "policyAnytime": "Puedes cancelar o reprogramar online hasta la hora de la cita.",
    "policyPast": "Ya no es posible cancelar ni reprogramar online: la cita es en menos de {{hours}}h. Contacta con la empresa.",
    "policyNone": "Esta empresa no permite cancelar ni reprogramar online. Contacta directamente con ellos.",
    "openMap": "Ver en el mapa",
    "pendingNote": "{{business}} todavía tiene que confirmar esta cita. Te avisaremos en cuanto la acepte.",
    "reschedule": "Cambiar fecha u hora",
    "rescheduleTitle": "Elige el nuevo día y la hora",
    "pickDate": "Día",
    "newTime": "Nueva cita: {{when}}",
    "keepCurrent": "Mantener la cita actual",
    "bookAgain": "Reservar otra cita",
    "loadError": "No se pudo cargar la cita. Inténtalo de nuevo en unos minutos.",
    "errors": {
      "terminalStatus": "Esta cita ya no se puede modificar.",
      "cancelDisabled": "Este negocio no permite cancelar online. Contacta directamente con ellos.",
      "rescheduleDisabled": "Este negocio no permite cambiar la cita online. Contacta directamente con ellos.",
      "cancelTooLate": "Solo se puede cancelar con al menos {{hours}} h de antelación.",
      "rescheduleTooLate": "Solo se puede cambiar la cita con al menos {{hours}} h de antelación."
    }
  },
  "signup": {
    "title": "Crea tu empresa",
    "subtitle": "Prueba gratis 14 días, sin tarjeta.",
    "clinicName": "Nombre de la empresa",
    "email": "Email",
    "password": "Contraseña",
    "submit": "Crear cuenta",
    "creating": "Creando…",
    "successTitle": "¡Cuenta creada!",
    "successMsg": "Tu empresa está lista. Ya puedes iniciar sesión.",
    "goToLogin": "Ir a iniciar sesión",
    "haveAccount": "¿Ya tienes cuenta?",
    "login": "Inicia sesión",
    "disabled": "El registro no está disponible por ahora.",
    "genericError": "No se pudo crear la cuenta. Inténtalo de nuevo.",
    "captchaHint": "Completa la verificación anti-bots para continuar.",
    "sector": "¿A qué se dedica tu negocio?",
    "sectorPlaceholder": "Elige un sector",
    "sectors": {
      "peluquerias": "Peluquería o barbería",
      "estetica": "Centro de estética",
      "fisioterapeutas": "Fisioterapia",
      "gimnasios": "Gimnasio o entrenador personal",
      "talleres": "Taller mecánico",
      "consultores": "Consultoría o coaching",
      "dentales": "Clínica dental",
      "psicologos": "Psicología",
      "veterinarios": "Clínica veterinaria",
      "autoescuelas": "Autoescuela",
      "nutricionistas": "Nutrición y dietética",
      "tatuadores": "Estudio de tatuaje o piercing",
      "peluqueria-canina": "Peluquería canina",
      "yoga-pilates": "Yoga o pilates",
      "masajes-spa": "Masajes o spa",
      "podologos": "Podología",
      "otro": "Otro tipo de negocio"
    },
    "repeatPassword": "Repite la contraseña",
    "passwordsMismatch": "Las contraseñas no coinciden",
    "captchaRequired": "Completa la verificación para continuar",
    "showPassword": "Mostrar contraseña",
    "hidePassword": "Ocultar contraseña",
    "acceptTerms": "He leído y acepto los {{terms}} (incluido el encargo del tratamiento de los datos de mis clientes) y la {{privacy}}.",
    "termsLink": "Términos y condiciones",
    "privacyLink": "Política de privacidad",
    "gdprNotice": "Responsable: {{controller}}. Finalidad: crear y gestionar tu cuenta, prestarte el servicio, saber por qué canal nos conociste y, si no te opones, enviarte consejos y ofertas sobre BookingForNow. Base jurídica: ejecución del contrato e interés legítimo. Destinatarios: los proveedores que alojan el servicio, como encargados del tratamiento; no cedemos tus datos a terceros. Derechos: acceso, rectificación, supresión y los demás previstos en el RGPD, escribiendo a {{email}}. Más información en la {{privacy}}.",
    "regionNote": "Tu cuenta se creará con: {{region}}. Podrás cambiarlo en Configuración.",
    "errors": {
      "rateLimited": "Demasiados intentos seguidos. Espera unos minutos y vuelve a probar.",
      "captchaFailed": "No hemos podido verificar que eres una persona. Repite la verificación e inténtalo de nuevo.",
      "termsRequired": "Debes aceptar los Términos y la Política de privacidad para crear la cuenta.",
      "missingFields": "Rellena el nombre del negocio, el email y la contraseña.",
      "emailRegistered": "Ya existe una cuenta con este email."
    },
    "ownerName": "Tu nombre",
    "ownerNameHint": "Lo usaremos para saludarte y como primer profesional de tu agenda.",
    "marketingNotice": "Durante la prueba y al terminarla te enviaremos algunos emails con consejos y ofertas de BookingForNow. Si no los quieres, marca esta casilla; también puedes darte de baja gratis, con un clic, desde cualquiera de ellos.",
    "marketingOptOut": "No quiero recibir consejos ni ofertas de BookingForNow por email",
    "bookingPageReady": "Tu página de reservas ya está creada y acepta reservas desde hoy. Antes de compartirla, revisa tu horario y los servicios de ejemplo:",
    "metaTitle": "Crea tu cuenta gratis — BookingForNow",
    "metaDescription": "Crea tu cuenta gratis en BookingForNow: agenda, reservas online 24/7, bonos y recordatorios automáticos. 14 días de prueba, sin tarjeta."
  },
  "login": {
    "metaDescription": "Accede a tu cuenta de BookingForNow para gestionar la agenda, las reservas online, los clientes y los bonos de tu negocio.",
    "fillAllFields": "Por favor, completa todos los campos",
    "loginError": "Error al iniciar sesión. Inténtalo de nuevo.",
    "enterEmail": "Por favor, introduce tu email",
    "resetError": "Error al solicitar la recuperación de contraseña"
  },
  "landing": {
    "nav": {
      "login": "Iniciar sesión",
      "signup": "Crear cuenta",
      "goToApp": "Ir a mi agenda"
    },
    "hero": {
      "subtitle": "Agenda, reservas online, bonos de sesiones y recordatorios en una sola plataforma. Dedica tu tiempo a tus clientes, no al papeleo.",
      "ctaPrimary": "Prueba 14 días gratis",
      "note": "Sin tarjeta de crédito · Cancela cuando quieras",
      "demo": "Ver demo",
      "titlePre": "Tú haces tu trabajo.",
      "titleAccentLead": "Nosotros, la",
      "titleAccent": "gestión",
      "stats": {
        "supportValue": "24/7",
        "supportLabel": "reserva online",
        "languagesValue": "10",
        "languagesLabel": "idiomas",
        "priceValue": "0€",
        "priceLabel": "para empezar",
        "commissionValue": "0 %",
        "commissionLabel": "comisiones por reserva"
      },
      "badge": "Sin comisiones · 14 días gratis · Sin tarjeta",
      "heading": "Software de reservas y citas online para negocios con cita previa"
    },
    "features": {
      "title": "Programa de agenda y reservas online: qué incluye",
      "agenda": {
        "title": "Agenda multi-profesional",
        "text": "Organiza las citas de todo tu equipo con una agenda clara y sin solapamientos."
      },
      "booking": {
        "title": "Reserva online 24/7",
        "text": "Tus clientes reservan solos desde tu página pública, a cualquier hora y desde cualquier dispositivo."
      },
      "packs": {
        "title": "Bonos de sesiones por cliente",
        "text": "Vende a cada cliente su bono de sesiones: al darle cita en la agenda eliges el bono y se descuenta una sesión; si la cita se cancela, vuelve. En su ficha ves cuántas le quedan."
      },
      "reminders": {
        "title": "Recordatorios automáticos",
        "text": "Reduce las ausencias con recordatorios automáticos por email. Incluidos en los planes Starter y Pro."
      },
      "eyebrow": "Funcionalidades",
      "subtitle": "De la gestión manual al piloto automático. Todo en una plataforma."
    },
    "howItWorks": {
      "title": "Tu página de reservas online, en marcha en menos de 5 minutos",
      "eyebrow": "Cómo funciona",
      "step1": {
        "title": "Crea tu cuenta",
        "text": "Regístrate gratis, sin tarjeta de crédito. En un par de minutos tienes tu espacio de trabajo listo."
      },
      "step2": {
        "title": "Configura tus servicios",
        "text": "Añade servicios, precios, horarios y profesionales. El asistente te guía paso a paso."
      },
      "step3": {
        "title": "Comparte y empieza",
        "text": "Comparte tu enlace en Instagram, WhatsApp o tu web. Tus clientes reservan solos, 24/7."
      }
    },
    "pricing": {
      "title": "Precios del software de reservas",
      "subtitle": "Empieza gratis y cambia de plan cuando tu negocio crezca.",
      "free": "Gratis",
      "yearlyNote": "Con el plan anual pagas solo 10 meses: 2 meses gratis.",
      "cta": "Empezar ahora",
      "eyebrow": "Precios",
      "annualNote": "Facturado anualmente: {{total}} al año · 2 meses gratis",
      "currencyNote": "Precios en euros (EUR).",
      "detailsLink": "Ver precios y límites en detalle"
    },
    "finalCta": {
      "title": "¿Listo para empezar?",
      "text": "Crea tu cuenta en menos de 2 minutos y configura tu negocio hoy mismo.",
      "eyebrow": "¿A qué esperas?"
    },
    "footer": {
      "tagline": "BookingForNow — gestión integral de citas para tu negocio.",
      "sectorsLabel": "Soluciones por sector",
      "sectors": {
        "hairdressers": "Software de citas para peluquerías",
        "beauty": "Software de reservas para centros de estética",
        "physio": "Software de citas para fisioterapeutas",
        "gyms": "Software de reservas para gimnasios",
        "workshops": "Software de cita previa para talleres",
        "consultants": "Software de citas para consultores",
        "allSectors": "Todos los sectores"
      },
      "blog": "Blog: gestión de citas y reservas",
      "tools": "Herramientas gratis",
      "pagesInEnglish": "(páginas en inglés)",
      "freeScheduling": "Programa para agendar citas gratis",
      "navLabel": "Navegación del pie",
      "support": "Soporte",
      "legalLabel": "Información legal",
      "legal": {
        "notice": "Aviso legal",
        "privacy": "Privacidad",
        "terms": "Términos",
        "cookies": "Cookies",
        "contact": "Contacto"
      },
      "comparisons": {
        "booksy": "Alternativa a Booksy",
        "treatwell": "Alternativa a Treatwell",
        "fresha": "Alternativa a Fresha"
      },
      "calculator": "Calculadora de comisiones de reservas",
      "referral": "Programa de recomendación",
      "inSpanish": "(en español)"
    },
    "preview": {
      "title": "Tablón diario",
      "kpiAppointments": "Citas",
      "kpiOccupancy": "Ocupación",
      "kpiRevenue": "Ingresos",
      "chipPack": "bono",
      "notifTitle": "Nueva reserva online",
      "row1Name": "Lucía M.",
      "row1Service": "Corte de pelo",
      "row2Name": "Carlos R.",
      "row2Service": "Masaje deportivo",
      "row3Name": "Ana G.",
      "row3Service": "Manicura",
      "live": "En vivo",
      "chipConfirmed": "Confirmada",
      "chipPending": "Pendiente",
      "chipNew": "Nueva",
      "row4Name": "Miguel S.",
      "row4Service": "Entrenamiento personal",
      "notifSub": "Marta L. · Hoy 16:00",
      "badge": "Precio plano · Sin comisiones",
      "sampleData": "Datos de ejemplo"
    },
    "social": {
      "sectors": {
        "hair": "Peluquerías",
        "yoga": "Estudios de yoga y pilates",
        "gyms": "Gimnasios",
        "dental": "Clínicas dentales",
        "spa": "Spas y masajes",
        "physio": "Fisioterapeutas",
        "garages": "Talleres",
        "vets": "Veterinarios"
      },
      "label": "Pensado para negocios que trabajan con cita previa"
    },
    "why": {
      "eyebrow": "Por qué BookingForNow",
      "title": "Un sistema de reservas claro y sin letra pequeña",
      "flat": {
        "title": "Precio plano, 0 % de comisiones",
        "text": "Pagas tu plan y ya está. Nunca nos llevamos un porcentaje de tus reservas ni de tus clientes nuevos, a diferencia de algunos marketplaces."
      },
      "link": {
        "title": "Tu propio enlace de reservas",
        "text": "Un enlace tuyo, no de un marketplace: ponlo en Instagram, Google Maps o WhatsApp y tus clientes reservan solos, sin instalar nada."
      },
      "languages": {
        "title": "10 idiomas y cualquier zona horaria",
        "text": "Tu agenda y tu página de reservas hablan el idioma de tus clientes: español, inglés, francés, portugués, italiano, alemán, ruso, chino, coreano y japonés."
      },
      "privacy": {
        "title": "Tus datos son tuyos",
        "text": "Cumplimos el RGPD, no vendemos ni cedemos tus datos y no mostramos publicidad a tus clientes."
      }
    },
    "faq": {
      "eyebrow": "Antes de empezar",
      "title": "Preguntas frecuentes sobre el programa para gestionar citas",
      "items": {
        "price": {
          "q": "¿Cuánto cuesta BookingForNow?",
          "a": "Hay tres planes con cuota fija y {{commission}} % de comisión por reserva: Free a {{free}} ({{practitioners}} profesional, hasta {{clients}} clientes y sin recordatorios automáticos), Starter a {{starter}}/mes y Pro a {{pro}}/mes. La cuota anual cuesta lo mismo que {{paidMonths}} meses, así que te ahorras {{freeMonths}}. Los importes están en euros y se les suman los impuestos que correspondan. Toda cuenta nueva empieza con {{trialDays}} días de prueba, sin tarjeta."
        },
        "free": {
          "q": "¿Qué incluye el plan gratis y qué límites tiene?",
          "a": "El plan Free cuesta {{free}}, no tiene límite de tiempo y no pide tarjeta. Incluye la agenda, los bonos de sesiones y tu página de reservas online para {{practitioners}} profesional, hasta {{clients}} clientes y {{locations}} sede. No incluye recordatorios automáticos, que llegan con Starter. Lo que ven tus clientes (página de reservas, portal de citas y emails) lleva una mención discreta a BookingForNow; con Starter o Pro desaparece."
        },
        "commission": {
          "q": "¿Cobráis comisión por reserva?",
          "a": "No, en ningún plan: {{commission}} % también en Free. Pagas la cuota fija de tu plan ({{free}} en Free) y ya está, sin límite de reservas. BookingForNow no cobra las reservas en tu nombre: tus clientes te pagan en tu local, como hasta ahora, así que no hay porcentaje ni pasarela de por medio."
        },
        "reminders": {
          "q": "¿Desde qué plan hay recordatorios automáticos?",
          "a": "Desde Starter. Los recordatorios automáticos de cita salen por email, al cliente que deja su email, en los planes Starter y Pro y durante la prueba; el plan Free no los incluye. No hay recordatorios por SMS ni WhatsApp automático."
        },
        "app": {
          "q": "¿Hay que instalar alguna app?",
          "a": "No. BookingForNow funciona como app web en cualquier móvil u ordenador, sin instalaciones ni actualizaciones pendientes: tú llevas la agenda desde el navegador y tus clientes reservan desde el enlace de tu negocio, sin descargar nada."
        },
        "trialEnd": {
          "q": "¿Qué pasa cuando terminan los {{trialDays}} días de prueba?",
          "a": "Si no has elegido plan, tu cuenta pasa sola al plan Free y no se te cobra nada: la prueba no pide tarjeta. No se borra nada. Si usabas más profesionales o sedes de los que incluye Free, siguen activos los más antiguos y el resto queda en pausa hasta que contrates un plan que los incluya. Los recordatorios automáticos por email, que son de Starter y Pro, dejan de enviarse."
        }
      }
    }
  },
  "onboarding": {
    "title": "Primeros pasos",
    "progress": "{{done}} de {{total}} completados",
    "toggle": "Mostrar u ocultar la lista",
    "dismiss": "Descartar",
    "copyLink": "Copiar enlace",
    "copied": "Enlace copiado al portapapeles",
    "steps": {
      "services": "Configura tus servicios y precios",
      "booking": "Activa la reserva online",
      "bookingOn": "Tu página ya acepta reservas",
      "share": "Comparte tu página de reservas",
      "firstAppointment": "Crea tu primera cita"
    },
    "stepDone": "Completado:",
    "copyFailed": "No se pudo copiar el enlace. Cópialo a mano: {{url}}"
  },
  "settings": {
    "booking": {
      "logoUrl": "Logo de la página de reservas (URL)",
      "useCustomColor": "Usar color personalizado",
      "primaryColor": "Color principal",
      "brandingHint": "El logo y el color se aplican a tu página pública de reservas."
    },
    "logo": {
      "title": "Logo de la empresa",
      "upload": "Subir imagen",
      "change": "Cambiar imagen",
      "uploading": "Subiendo…",
      "format": "Formatos: PNG, JPG o WEBP. Máximo 2MB.",
      "uploaded": "Logo actualizado",
      "error": "No se pudo subir el logo",
      "errorFormat": "Formato no permitido. Usa PNG, JPG o WEBP.",
      "errorSize": "La imagen supera el tamaño máximo (2MB)."
    }
  },
  "adminPlatform": {
    "eyebrow": "Operador",
    "title": "Plataforma",
    "forbidden": "Acceso reservado a administradores de plataforma.",
    "kpi": {
      "clinics": "Empresas",
      "trials": "Pruebas activas",
      "mrr": "MRR estimado",
      "mrrHint": "solo suscripciones de pago",
      "mrrTitle": "Solo suman las suscripciones de pago activas. Un plan asignado a mano desde este panel no es una suscripción y no cuenta.",
      "signupsPeriod": "Altas del periodo",
      "webVisitors": "Visitantes · web pública",
      "webVisitorDaysHint": "visitantes-día · últimos {{days}} días",
      "webVisitorsHint": "suma por tipo de página y día · últimos {{days}} días",
      "onlineBookings": "Reservas online",
      "appointments": "Citas creadas",
      "errors5xx": "Errores 5xx",
      "periodHint": "últimos {{days}} días"
    },
    "cols": {
      "clinic": "Empresa",
      "plan": "Plan",
      "status": "Estado",
      "signup": "Alta",
      "origin": "Origen"
    },
    "state": {
      "active": "Activa",
      "suspended": "Suspendida"
    },
    "action": {
      "extend": "+14 días",
      "extendTitle": "Ampliar la prueba 14 días",
      "suspend": "Suspender",
      "activate": "Activar",
      "changePlan": "Cambiar plan"
    },
    "toasts": {
      "trialExtended": "Prueba ampliada 14 días",
      "suspended": "Empresa suspendida",
      "activated": "Empresa activada",
      "planChanged": "Plan cambiado a {{plan}}"
    },
    "subtitle": "Monitorización de la aplicación y del tráfico web",
    "refresh": "Actualizar",
    "range": {
      "label": "Periodo",
      "d7": "7 días",
      "d30": "30 días",
      "d90": "90 días"
    },
    "tabs": {
      "overview": "Resumen",
      "traffic": "Tráfico web",
      "activity": "Actividad",
      "health": "Salud",
      "tenants": "Empresas"
    },
    "funnel": {
      "title": "Embudo de captación",
      "subtitle": "Del visitante a la primera reserva, en los últimos {{days}} días",
      "ofPrevious": "{{pct}} del paso anterior",
      "activatedHint": "Negocios creados en el periodo con al menos una cita",
      "visitorsHint": "Cada visitante cuenta una vez al día, vea las páginas que vea de la web pública. Es la misma cifra del KPI y de la zona «Web pública».",
      "landingVisitorsHint": "Suma de los visitantes-día de la home y de las landings: quien ve las dos el mismo día cuenta dos veces.",
      "cohortBookingsHint": "Reservas online de los negocios activados en el periodo. El total de todos los negocios está en el KPI «Reservas online».",
      "stages": {
        "visitors": "Visitantes-día de la web pública",
        "landingVisitors": "Visitantes-día en home y landings",
        "signupVisitors": "Visitantes de /signup",
        "signups": "Altas",
        "activated": "Negocios activados (≥1 cita)",
        "onlineBookings": "Reservas online",
        "cohortBookings": "Sus reservas online"
      },
      "perActivated": "{{n}} por negocio activado"
    },
    "audience": {
      "title": "Visitantes por zona",
      "subtitle": "Últimos {{days}} días, por tipo de página",
      "views_one": "{{n}} página vista",
      "views_few": "{{n}} páginas vistas",
      "views_many": "{{n}} páginas vistas",
      "views_other": "{{n}} páginas vistas",
      "visitors_one": "{{n}} visitante",
      "visitors_few": "{{n}} visitantes",
      "visitors_many": "{{n}} visitantes",
      "visitors_other": "{{n}} visitantes",
      "zones": {
        "web": {
          "label": "Web pública",
          "hint": "La home, las páginas de sector, comparativas y herramientas, el blog, el alta y las legales. Es la que mide el posicionamiento."
        },
        "booking": {
          "label": "Páginas de reserva de los negocios",
          "hint": "Clientes de los negocios en su página de reserva y en el enlace de su cita. No es tráfico de la web."
        },
        "app": {
          "label": "Aplicación",
          "hint": "Equipos de los negocios en el acceso y en las pantallas privadas."
        }
      },
      "note": "Son visitantes-día sumados por tipo de página, no personas distintas: quien ve dos tipos de página (la home y una página de sector) cuenta dos veces, quien pasa de la web a una página de reserva cuenta en las dos zonas y quien vuelve otro día cuenta otra vez, porque la huella anónima cambia cada día a las 00:00 UTC. Las páginas vistas sí son exactas.",
      "noteWeb": "Son visitantes-día, no personas distintas: la huella anónima cambia cada día a las 00:00 UTC, así que quien vuelve otro día cuenta otra vez. En la web pública cada visitante cuenta una vez al día, vea las páginas que vea; las otras dos zonas suman sus tipos de página (quien pasa por el acceso y luego usa la aplicación cuenta dos veces), y quien pasa de la web a una página de reserva cuenta en las dos zonas. Las páginas vistas sí son exactas.",
      "webBreakdown": "Visitantes-día de la web pública: {{total}}. De ellos, {{engaged}} con origen externo (otro sitio o una campaña) o con más de una página vista, y {{single}} con una sola página y entrada directa, lo habitual en un rastreador con aspecto de navegador. Entre los primeros, con uso de la aplicación ese mismo día (equipo o alta nueva): {{withApp}}.",
      "webBreakdownSignal": "Visitantes-día de la web pública: {{total}}. De ellos, {{engaged}} con origen externo (otro sitio o una campaña) o con más de una página vista, y {{single}} con una sola página y entrada directa (sin origen conocido: dirección escrita, marcador o un enlace que no envía origen). Entre los primeros, con uso de la aplicación ese mismo día (equipo o alta nueva): {{withApp}}.",
      "other": "Sin clasificar: {{visitors}} y {{views}} en rutas que el servidor no asigna a ninguna zona: direcciones que no existen (404) y /cuenta-suspendida."
    },
    "charts": {
      "visitorsPerDay": "Visitantes por día",
      "allZones": "Todas las zonas juntas: web pública, páginas de reserva y aplicación.",
      "signupsPerDay": "Altas por día",
      "trafficPerDay": "Visitantes y páginas vistas por día",
      "appointmentsPerDay": "Citas y reservas online por día",
      "newPatientsPerDay": "Clientes nuevos por día",
      "emailsPerDay": "Emails por día",
      "apiRequestsPerDay": "Peticiones API por día",
      "api5xxPerDay": "Errores 5xx por día",
      "apiP95PerDay": "Latencia p95 por día (ms, con crons y panel)"
    },
    "series": {
      "visitors": "Visitantes",
      "views": "Páginas vistas",
      "signups": "Altas",
      "appointments": "Citas",
      "onlineBookings": "Reservas online",
      "newPatients": "Clientes nuevos",
      "emailsSent": "Enviados",
      "emailsFailed": "Fallidos",
      "requests": "Peticiones",
      "errors5xx": "Errores 5xx",
      "p95": "Latencia p95"
    },
    "chart": {
      "showTable": "Ver tabla",
      "hideTable": "Ocultar tabla",
      "noData": "Sin datos en el periodo",
      "allZero": "Todo a cero en el periodo",
      "day": "Día",
      "total": "Total"
    },
    "traffic": {
      "note": "Analítica propia sin cookies. Solo cuentan las visitas con señal de persona (un toque, una tecla, el ratón o 15 segundos con la página a la vista) y se excluyen los bots ({{bots}} vistas de bots en el periodo).",
      "visitorDays": "Los visitantes son visitantes-día: la huella anónima cambia cada día a las 00:00 UTC (las 02:00 en España en verano, la 01:00 en invierno), así que quien vuelve otro día, cambia de red o usa otro navegador cuenta otra vez.",
      "scope": "El gráfico diario y las listas de referidos, países, idiomas, dispositivos y UTM suman todas las zonas (web pública, páginas de reserva de los negocios y aplicación); el reparto está en Resumen.",
      "beforeHumanSignal": "Este periodo incluye días anteriores al {{date}}, cuando aún contaban como visitantes los rastreadores con aspecto de navegador: las cifras de esos días salen infladas y no se pueden comparar con las posteriores.",
      "dataSince": "Hay datos desde el {{date}}. El periodo elegido empieza antes: sus primeros días salen vacíos porque aún no se medía, no porque no entrara nadie.",
      "topPages": "Páginas más visitadas",
      "topPagesByZone": {
        "web": "Páginas de la web pública",
        "booking": "Rutas de las páginas de reserva",
        "app": "Pantallas de la aplicación",
        "other": "Rutas sin clasificar"
      },
      "referrers": "Referidos",
      "countries": "Países",
      "langs": "Idiomas",
      "devices": "Dispositivos",
      "utmSources": "UTM · fuente",
      "utmCampaigns": "UTM · campaña",
      "pageTypes": "Tipos de página",
      "bookingPages": "Páginas de reserva más visitadas",
      "direct": "(directo)",
      "visitors": "visitantes",
      "views": "vistas",
      "showAll": "Ver las {{n}}",
      "showLess": "Ver menos",
      "empty": "Nada que mostrar en el periodo",
      "openBooking": "Abrir la página de reserva"
    },
    "tracking": {
      "excluded": "Este navegador no cuenta en las estadísticas.",
      "counted": "Este navegador cuenta en las estadísticas. Para excluirlo, entra en él como operador (queda marcado con la clave local {{key}}) o activa Do-Not-Track o Global Privacy Control.",
      "reasons": {
        "operator": "Has entrado como operador de la plataforma.",
        "optout": "Tiene la clave local {{key}}, que se guarda sola al entrar como operador, así que tampoco cuenta sin sesión.",
        "dnt": "Tiene Do-Not-Track activado.",
        "gpc": "Envía la señal Global Privacy Control."
      },
      "sessionOnly": "La clave local {{key}} no se ha podido guardar: sin sesión, este navegador volverá a contar.",
      "otherDevices": "Tus otros dispositivos cuentan hasta que entres en ellos una vez como operador."
    },
    "pageTypes": {
      "landing": "Landing",
      "seo": "Landings SEO",
      "blog": "Blog",
      "legal": "Legal y contacto",
      "signup": "Registro",
      "login": "Acceso",
      "book": "Reserva pública",
      "portal": "Portal de clientes",
      "app": "Aplicación",
      "other": "Otros"
    },
    "devices": {
      "desktop": "Escritorio",
      "mobile": "Móvil",
      "tablet": "Tableta"
    },
    "activity": {
      "businessTitle": "Actividad de negocio",
      "businessNote": "No cuentan los negocios internos (test y demo).",
      "apiTitle": "API",
      "topErrors": "Errores de API más frecuentes",
      "noErrors": "Sin errores de API en el periodo",
      "emailsNote": "Los fallidos se resaltan; los enviados dan contexto.",
      "cols": {
        "method": "Método",
        "route": "Ruta",
        "status": "Código",
        "hits": "Veces",
        "lastAt": "Última vez"
      }
    },
    "health": {
      "checkedAt": "Comprobado {{time}}",
      "version": "Commit",
      "env": "Entorno",
      "region": "Región",
      "configTitle": "Configuración",
      "configNote": "Solo se comprueba que cada variable tenga valor en Vercel; no se valida contra Stripe, Resend, Cloudflare ni Sentry.",
      "configSummary": "{{ok}} de {{total}} obligatorios",
      "dbTitle": "Base de datos",
      "dbLatency": "Latencia",
      "dbOk": "Conectada",
      "dbSlow": "Conectada, lenta",
      "dbDown": "Sin respuesta",
      "cronsTitle": "Tareas programadas",
      "cronState": {
        "ok": "OK",
        "stale": "Atrasado",
        "failed": "Fallido",
        "never": "Nunca ejecutado"
      },
      "cronLast": "Última ejecución",
      "cronSummary": "Ver resumen (JSON)",
      "cronNoRuns": "Sin ejecuciones registradas",
      "cronRecent": "Últimas ejecuciones",
      "cronHint": "Comprueba CRON_SECRET en Vercel y el log de Vercel Cron; si es «reminders», revisa también el workflow reminders-hourly en GitHub Actions",
      "cronFailedHint": "Revisa el error de la última ejecución y el log de la función en Vercel",
      "cronsError": "No se pudo leer el registro de crons: {{error}}",
      "errorsTitle": "Últimos errores",
      "noErrors": "Sin errores registrados",
      "api24Title": "API · últimas 24 h",
      "api24Note": "La latencia p95 es el tiempo de respuesta del servidor, sin contar los crons ni las consultas de este panel; el resto de cifras sí los incluye.",
      "emails24Title": "Emails · últimas 24 h",
      "requests": "Peticiones",
      "errors5xx": "Errores 5xx",
      "errors4xx": "Errores 4xx",
      "p95": "Latencia p95",
      "sent": "Enviados",
      "failed": "Fallidos",
      "noData": "Sin datos",
      "migrationTitle": "Falta aplicar la migración 31",
      "migrationBody": "La analítica de plataforma necesita las tablas y funciones de {{file}}. Aplícala en Supabase y recarga.",
      "ok": "Correcto",
      "configured": "Configurado",
      "missing": "Falta",
      "recommended": "Recomendado",
      "optional": "Opcional",
      "on": "Activado",
      "off": "Desactivado",
      "cols": {
        "time": "Cuándo",
        "logger": "Origen",
        "tenant": "Empresa",
        "message": "Mensaje"
      },
      "items": {
        "supabase": {
          "label": "Supabase (URL + service key)",
          "hint": "Define SUPABASE_URL y SUPABASE_SERVICE_KEY en Vercel"
        },
        "rlsJwtSecret": {
          "label": "Secreto JWT de Supabase (RLS)",
          "hint": "Copia el JWT secret del proyecto Supabase a SUPABASE_JWT_SECRET en Vercel"
        },
        "cronSecret": {
          "label": "Secreto de los crons",
          "hint": "Añade CRON_SECRET en Vercel; sin él los crons responden 401"
        },
        "stripeSecretKey": {
          "label": "Clave secreta de Stripe",
          "hint": "Añade STRIPE_SECRET_KEY en Vercel"
        },
        "stripeWebhookSecret": {
          "label": "Webhook de Stripe",
          "hint": "Crea el webhook en Stripe y añade STRIPE_WEBHOOK_SECRET en Vercel"
        },
        "stripePrices": {
          "label": "Precios de Stripe ({{n}}/{{total}})",
          "hint": "Faltan IDs de precio: STRIPE_PRICE_STARTER_MONTHLY/YEARLY y STRIPE_PRICE_PRO_MONTHLY/YEARLY"
        },
        "resend": {
          "label": "Resend (envío de email)",
          "hint": "Añade RESEND_API_KEY en Vercel"
        },
        "emailFrom": {
          "label": "Remitente de email",
          "hint": "Define EMAIL_FROM con un dominio verificado en Resend"
        },
        "turnstile": {
          "label": "Turnstile (anti-bots)",
          "hint": "Añade TURNSTILE_SECRET_KEY; sin él el registro público queda sin protección"
        },
        "superadmins": {
          "label": "Administradores de plataforma ({{n}})",
          "hint": "Define SUPERADMIN_EMAILS (emails separados por comas)"
        },
        "publicAppBaseUrl": {
          "label": "URL pública de la app",
          "hint": "Define PUBLIC_APP_BASE_URL (p. ej. https://www.bookingfornow.com)"
        },
        "sentry": {
          "label": "Sentry (errores del backend)",
          "hint": "Los errores ya se guardan abajo, en «Últimos errores». Con SENTRY_DSN, además se envían a Sentry."
        },
        "twilio": {
          "label": "Twilio (SMS)",
          "hint": "Depende de TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN y TWILIO_FROM_NUMBER. Con las tres, los negocios del plan Pro envían recordatorios y confirmaciones por SMS; si falta alguna, no se envía ninguno. Hoy ningún plan lo anuncia."
        },
        "tenantSubdomains": {
          "label": "Subdominio propio por negocio",
          "hint": "Con CLOUDFLARE_API_TOKEN, CLOUDFLARE_ZONE_ID, VERCEL_TOKEN y VERCEL_PROJECT_ID, cada alta crea sola su <negocio>.bookingfornow.com, mientras el proyecto de Vercel tenga menos de VERCEL_MAX_DOMAINS dominios (45 por defecto; súbelo al pasar a Vercel Pro)"
        },
        "signupEnabled": {
          "label": "Registro público",
          "hint": "SIGNUP_ENABLED=true permite nuevas altas"
        },
        "demoEnabled": {
          "label": "Modo demo",
          "hint": "Solo abre la cuenta de demostración de la aplicación (y la reinicia cada día). La demo pública de la web (/es/demo) funciona siempre y no depende de esto."
        },
        "cronSecretExternal": {
          "label": "Credencial del disparo horario (GitHub Actions)",
          "hint": "Añade CRON_SECRET_EXTERNAL en Vercel y el mismo valor como secreto del repositorio en GitHub; sin él, los recordatorios solo salen una vez al día con el cron de Vercel"
        }
      },
      "schema": {
        "title": "Esquema de la base de datos",
        "unknown": "Sin comprobar",
        "migrationsLabel": "Migraciones SQL",
        "migrationsCount": "{{applied}} de {{total}} registradas en schema_migrations",
        "pendingState": "Pendientes: {{n}}",
        "pendingHint": "Aplica estas migraciones antes de desplegar código que dependa de ellas:",
        "baselineHint": "No hay ninguna migración registrada. Si la base de datos ya estaba al día, no las apliques: revisa el estado con --list y regístralas con --baseline --until=N.",
        "reasons": {
          "SQL_DIR_UNAVAILABLE": "El despliegue no incluye backend/sql, así que no se puede comparar con la base de datos.",
          "MIGRATIONS_TABLE_MISSING": "No existe la tabla schema_migrations: la base de datos se migró a mano. Registra lo ya aplicado con --baseline --until=N.",
          "MIGRATIONS_TABLE_UNREADABLE": "No se pudo leer la tabla schema_migrations."
        },
        "overlapLabel": "Protección anti-solapes de citas (migración 32)",
        "overlapOff": "Inactiva",
        "overlapOffHint": "No existe la restricción appointments_no_practitioner_overlap: si dos personas reservan a la vez el mismo hueco del mismo profesional, pueden entrar las dos reservas. Busca los avisos «32/1 SALTADO» de la migración 32, corrige la causa y vuelve a ejecutar su bloque 1.",
        "overlapPendingHint": "La migración 32 aún no está aplicada: la protección se crea al aplicarla (mira la lista de migraciones pendientes).",
        "overlapReasons": {
          "RPC_MISSING": "No se puede comprobar: falta la función platform_schema_flags de la migración 31.",
          "RPC_ERROR": "No se pudo comprobar la restricción anti-solapes.",
          "RPC_UNEXPECTED": "La comprobación de la restricción anti-solapes devolvió una respuesta inesperada."
        },
        "notApplied": "Sin aplicar",
        "flagPendingHint": "Llega con la migración {{n}}, que aún está pendiente (mira la lista de migraciones pendientes).",
        "flagsLabel": "Resto de comprobaciones del esquema",
        "flagsReasons": {
          "RPC_OUTDATED": "La función platform_schema_flags todavía es la de la migración 31. Aplica la migración 33 para comprobar el resto del esquema (si ya consta como aplicada, busca el aviso «33/6 SALTADO»).",
          "RPC_MISSING": "No se puede comprobar: falta la función platform_schema_flags (migraciones 31 y 33).",
          "RPC_ERROR": "No se pudo consultar el estado del esquema.",
          "RPC_UNEXPECTED": "La comprobación del esquema devolvió una respuesta inesperada."
        },
        "flags": {
          "unassignedOverlap": {
            "label": "Anti-solapes de citas sin profesional (migración 33)",
            "hint": "No existe la restricción appointments_no_unassigned_overlap: dos citas sin profesional asignado pueden ocupar a la vez el mismo hueco. Busca el aviso «33/2 SALTADO» de la migración 33, resuelve los solapes que indique y vuelve a ejecutarla."
          },
          "durationCheck": {
            "label": "Duración coherente de las citas (migración 33)",
            "hint": "La restricción appointments_duration_consistent no existe o no está validada: puede haber citas cuyo fin no cuadra con su duración. Busca los avisos «33/3» de la migración 33, corrige esas citas y vuelve a ejecutarla."
          },
          "localeColumn": {
            "label": "Idioma del cliente en las citas (migración 33)",
            "hint": "Falta la columna appointments.locale, donde se guarda el idioma del cliente para escribirle en su idioma. Busca el aviso «33/1 SALTADO» de la migración 33, corrige la causa y vuelve a ejecutarla."
          },
          "rateLimit": {
            "label": "Límite de peticiones compartido (migración 33)",
            "hint": "Faltan la tabla rate_limit_hits o la función rate_limit_hit: el alta y las copias de seguridad solo se limitan en la memoria de cada instancia, que es fácil de esquivar. Busca el aviso «33/4 SALTADO» de la migración 33 y vuelve a ejecutarla."
          },
          "logsPrune": {
            "label": "Retención automática de registros (migración 33)",
            "hint": "Falta la función logs_prune: el cron diario no aplica la retención (los emails de más de un año conservan destinatario y asunto, y no se borran los registros de más de 3 años). Busca el aviso «33/5 SALTADO» de la migración 33 y vuelve a ejecutarla."
          },
          "patientsSoftDelete": {
            "label": "Borrado de clientes con anonimización (migración 21)",
            "hint": "Faltan las columnas deletedAt o anonymizedAt de patients: fallan el borrado de clientes con anonimización y las consultas que excluyen a los clientes borrados. Aplica (o vuelve a ejecutar) la migración 21."
          },
          "planDeactivation": {
            "label": "Desactivación de recursos por plan (migración 30)",
            "hint": "Falta la columna deactivatedByPlan en practitioners o locations: al bajar de plan no se pueden desactivar los profesionales y sedes que sobran, ni reactivarlos al volver a subir. Aplica (o vuelve a ejecutar) la migración 30."
          },
          "legacyWhatsapp": {
            "label": "Limpieza de columnas antiguas de WhatsApp (migración 34)",
            "hint": "La tabla appointments aún tiene las columnas whatsappReminderSent y whatsappReminderSentAt, que ya no se usan. Las borra la migración 34, que es destructiva: aplícala con --allow-destructive después de hacer una copia de seguridad."
          }
        }
      },
      "top4xx": {
        "title": "4xx más frecuentes",
        "hint": "Cualquier /api/* que no exista responde 401 si llega sin sesión, así que un 401 en una ruta desconocida es un robot, un escáner o una prueba manual. Revisa solo las rutas propias que se repitan."
      }
    },
    "tenants": {
      "search": "Buscar por nombre o slug…",
      "count_one": "{{count}} empresa",
      "count_few": "{{count}} empresas",
      "count_many": "{{count}} empresas",
      "count_other": "{{count}} empresas",
      "basicMode": "Datos de actividad no disponibles; se muestra la lista básica.",
      "never": "Nunca",
      "trialUntil": "Prueba hasta {{date}}",
      "originDirect": "Directo",
      "noResults": "Ninguna empresa coincide con el filtro",
      "openBooking": "Abrir su página de reserva",
      "referral": {
        "referredBy": "Recomendado por {{slug}}",
        "statusPending": "sin activar",
        "statusActivated": "activado",
        "summary": "Recomendó {{referred}} · {{activated}} activos · {{rewards}} recompensas",
        "failed": "Recompensas fallidas: {{n}} (revisar)"
      },
      "sort": {
        "label": "Ordenar por",
        "lastActivity": "Última actividad",
        "created": "Fecha de alta",
        "name": "Nombre",
        "appointments": "Citas del periodo"
      },
      "cols": {
        "patients": "Clientes",
        "appointments": "Citas ({{days}} d)",
        "online": "Online ({{days}} d)",
        "lastActivity": "Última actividad",
        "bookingViews": "Vistas reserva",
        "actions": "Acciones"
      }
    },
    "confirmPlan": {
      "title": "Cambiar plan",
      "message": "¿Cambiar el plan de {{name}} de «{{from}}» a «{{to}}»? El backend ajustará los recursos a los límites del nuevo plan.",
      "confirm": "Cambiar plan"
    },
    "confirmSuspend": {
      "title": "Suspender empresa",
      "message": "¿Suspender a {{name}}? Su equipo perderá el acceso de inmediato y su página de reservas dejará de aceptar citas. Puedes reactivarla cuando quieras."
    },
    "unavailable": {
      "title": "Analítica no disponible",
      "migration": "Falta aplicar la migración 31 de la base de datos, que crea las tablas y funciones de analítica.",
      "error": "El backend devolvió un error al calcular la analítica.",
      "loadError": "No se pudo cargar la analítica (HTTP {{status}}).",
      "howTo": "Cómo arreglarlo",
      "migrationSteps": "Ejecuta «{{cmd}}» desde backend/ (aplica {{file}}) y recarga esta página.",
      "retry": "Reintentar"
    },
    "errors": {
      "TENANT_HAS_SUBSCRIPTION": "Esta empresa tiene una suscripción de Stripe: su plan lo gobierna Stripe. Cámbiala o cancélala allí primero.",
      "TENANT_HAS_ACTIVE_PLAN": "Esta empresa tiene un plan de cortesía activo. Pásala primero a Free y después amplía la prueba.",
      "TENANT_NOT_FOUND": "Esa empresa ya no existe.",
      "INVALID_TENANT_ID": "Identificador de empresa no válido.",
      "INVALID_PLAN": "Ese plan no es válido."
    }
  },
  "businessHours": {
    "eyebrow": "Empresa",
    "title": "Horario de trabajo",
    "open": "Abierto",
    "closed": "Cerrado",
    "addWindow": "+ Añadir tramo",
    "quitarTramo": "Quitar tramo",
    "desde": "Desde",
    "hasta": "Hasta",
    "errorFormato": "Formato de horario inválido. Revisa las horas (HH:MM) de cada tramo.",
    "days": {
      "mon": "Lunes",
      "tue": "Martes",
      "wed": "Miércoles",
      "thu": "Jueves",
      "fri": "Viernes",
      "sat": "Sábado",
      "sun": "Domingo"
    }
  },
  "subscriptionBanner": {
    "manage": "Gestionar",
    "trialEndsToday": "Tu periodo de prueba termina hoy. Elige un plan para conservar todas las funciones.",
    "pastDue": "Tu último pago no se ha completado. Actualiza tu método de pago para evitar la suspensión del servicio.",
    "unpaid": "Hay facturas pendientes en tu cuenta. Regulariza el pago para mantener el servicio activo.",
    "canceled": "Tu suscripción ha sido cancelada. Reactiva un plan para seguir usando la plataforma.",
    "incompleteExpired": "No se pudo completar tu suscripción. Vuelve a intentar el pago para activar tu plan.",
    "generic": "Hay un problema con tu suscripción. Revisa la configuración de facturación.",
    "freeHint": "Estás en el plan Free. Cuando tu negocio crezca, pasa a un plan superior para ampliar límites y funciones.",
    "viewPlans": "Ver planes",
    "trialEndsInDays_one": "Tu periodo de prueba termina en {{count}} día. Elige un plan para conservar todas las funciones.",
    "trialEndsInDays_few": "Tu periodo de prueba termina en {{count}} días. Elige un plan para conservar todas las funciones.",
    "trialEndsInDays_many": "Tu periodo de prueba termina en {{count}} días. Elige un plan para conservar todas las funciones.",
    "trialEndsInDays_other": "Tu periodo de prueba termina en {{count}} días. Elige un plan para conservar todas las funciones."
  },
  "titles": {
    "home": "Software de reservas y citas online para tu negocio",
    "suspended": "Cuenta suspendida",
    "login": "Iniciar sesión en tu software de reservas",
    "resetPassword": "Recuperar contraseña",
    "agenda": "Agenda",
    "clients": "Clientes",
    "clientDetail": "Ficha del cliente",
    "settings": "Configuración",
    "billing": "Facturación",
    "catalogs": "Catálogos",
    "audit": "Auditoría",
    "timeBlocks": "Bloqueos de agenda",
    "bookingSettings": "Ajustes de reserva online",
    "pendingBookings": "Reservas pendientes",
    "platform": "Plataforma",
    "publicBooking": "Reserva online",
    "myAppointment": "Mi cita",
    "signup": "Crea tu cuenta gratis: 14 días de prueba sin tarjeta",
    "notFound": "Página no encontrada",
    "team": "Equipo",
    "bonos": "Bonos"
  },
  "notFound": {
    "eyebrow": "Error 404",
    "title": "Página no encontrada",
    "lead": "La página que buscas no existe o ha cambiado de dirección.",
    "home": "Ir a la página principal"
  },
  "a11y": {
    "skipToContent": "Saltar al contenido"
  },
  "confirmModal": {
    "title": "Confirmar acción",
    "message": "¿Seguro que quieres continuar?",
    "itemLabel": "Elemento"
  },
  "whatsappCta": {
    "homeLabel": "¿Dudas? Escríbenos por WhatsApp",
    "homeMessage": "Hola, he visto BookingForNow y tengo una duda",
    "signupLead": "¿Dudas con el registro?",
    "signupLabel": "Escríbenos por WhatsApp",
    "signupMessage": "Hola, estoy registrándome en BookingForNow y tengo una duda",
    "ariaLabel": "{{label}} (se abre en una pestaña nueva)"
  },
  "tour": {
    "stepOf": "Paso {{current}} de {{total}}",
    "close": "Cerrar el tutorial",
    "skip": "Saltar tutorial",
    "configure": "Ir a configurar",
    "finish": "Finalizar",
    "relaunch": "Ver tutorial",
    "relaunchAria": "Ver el tutorial de configuración",
    "steps": {
      "business": {
        "title": "Tu negocio",
        "body": "Empieza por los datos de tu negocio: el teléfono, el email y la dirección que verán tus clientes al reservar, además del idioma, la moneda y la zona horaria."
      },
      "team": {
        "title": "Tu equipo",
        "body": "Un profesional eres tú o cada persona de tu equipo que atiende citas. Da de alta al menos uno para poder recibir reservas. Lo encuentras en la pestaña «Profesionales»."
      },
      "services": {
        "title": "Tus servicios",
        "body": "Los servicios son lo que ofreces (una sesión, un corte, una revisión, una clase…), cada uno con su duración y su precio. Créalos en la pestaña «Servicios»."
      },
      "hours": {
        "title": "Tu horario",
        "body": "Define tu horario de atención para que tus clientes solo puedan reservar cuando estás disponible."
      },
      "link": {
        "title": "Comparte tu enlace de reservas",
        "body": "Tu página ya acepta reservas: comparte tu enlace público para que tus clientes reserven por su cuenta. Lo encuentras en «Ajustes de reserva online», donde también puedes desactivarla.",
        "cta": "Ir a mi enlace"
      }
    }
  },
  "team": {
    "eyebrow": "Ajustes",
    "title": "Equipo",
    "subtitle": "Da acceso a tu agenda a tus profesionales y a recepción, cada uno con los permisos justos.",
    "loadError": "No se pudo cargar el equipo.",
    "retry": "Reintentar",
    "invite": {
      "title": "Invitar a una persona",
      "email": "Email",
      "emailPlaceholder": "nombre@ejemplo.com",
      "role": "Rol",
      "practitioner": "Su ficha de profesional",
      "practitionerNone": "Sin vincular",
      "practitionerHelp": "Vincúlalo a su ficha de profesional para que pueda gestionar sus propios bloqueos de horario.",
      "send": "Enviar invitación",
      "sending": "Enviando…"
    },
    "members": {
      "linkOf": "Ficha de profesional de {{email}}",
      "title": "Personas con acceso",
      "you": "Tú",
      "pending": "Invitación pendiente",
      "lastSeen": "Último acceso: {{date}}",
      "roleOf": "Rol de {{email}}",
      "resend": "Reenviar",
      "remove": "Quitar acceso"
    },
    "toasts": {
      "linkChanged": "Ficha de profesional actualizada",
      "invited": "Invitación enviada a {{email}}",
      "resent": "Invitación reenviada a {{email}}",
      "roleChanged": "Rol actualizado",
      "removed": "{{email}} ya no tiene acceso"
    },
    "errors": {
      "PRACTITIONER_ALREADY_LINKED": "Esa ficha de profesional ya está vinculada a otra cuenta.",
      "PRACTITIONER_NOT_FOUND": "Esa ficha de profesional ya no existe.",
      "INVALID_EMAIL": "Ese email no es válido.",
      "INVALID_ROLE": "Ese rol no es válido.",
      "ROLE_NOT_ALLOWED": "No tienes permiso para conceder o gestionar ese rol.",
      "ALREADY_MEMBER": "Esa persona ya forma parte del equipo.",
      "PLAN_LIMIT_REACHED": "Has llegado al número de usuarios de tu plan.",
      "CANNOT_MODIFY_SELF": "No puedes cambiar tu propio acceso.",
      "OWNER_PROTECTED": "El propietario no se puede modificar desde aquí.",
      "NOT_FOUND": "Esa persona ya no forma parte del equipo.",
      "INVITE_LINK_FAILED": "No se pudo generar la invitación. Inténtalo de nuevo en unos minutos.",
      "AUTH_UNAVAILABLE": "El servicio de acceso no está disponible ahora mismo.",
      "ACCOUNT_MISMATCH": "La cuenta de esa persona ha cambiado. Quítale el acceso y vuelve a invitarla.",
      "copyFailed": "No se pudo copiar. Selecciona el enlace y cópialo a mano."
    },
    "seats": {
      "count": "{{used}} de {{limit}} usuarios",
      "unlimited": "{{used}} usuarios · sin límite",
      "full": "Has llegado al número de usuarios de tu plan.",
      "upgrade": "Ver planes"
    },
    "manual": {
      "title": "Comparte tú el enlace de acceso",
      "body": "No hemos podido enviar el correo a {{email}}. Copia este enlace y envíaselo por WhatsApp o por el medio que prefieras.",
      "linkLabel": "Enlace de acceso",
      "copy": "Copiar enlace",
      "copied": "Copiado",
      "expires": "El enlace es personal y caduca en 24 horas. No lo publiques."
    },
    "confirmRemove": {
      "title": "Quitar acceso",
      "message": "¿Quitar el acceso de {{email}}? Dejará de poder entrar en tu agenda de inmediato. Sus citas y sus datos no se borran."
    },
    "rolesGuide": {
      "title": "Qué puede hacer cada rol"
    },
    "roles": {
      "owner": {
        "name": "Propietario",
        "help": "Todo, incluida la suscripción y la gestión del equipo."
      },
      "admin": {
        "name": "Administrador",
        "help": "Gestiona agenda, clientes, cobros, servicios y ajustes. Puede invitar a profesionales y recepción. No ve la suscripción."
      },
      "practitioner": {
        "name": "Profesional",
        "help": "Trabaja con la agenda, los clientes y sus notas. No gestiona cobros, informes ni ajustes."
      },
      "receptionist": {
        "name": "Recepción",
        "help": "Gestiona agenda, clientes, cobros y bonos. No ve las notas privadas de los profesionales."
      },
      "readonly": {
        "name": "Solo lectura",
        "help": "Puede consultar la agenda y los clientes, pero no cambiar nada."
      }
    },
    "managersOnly": "Solo el propietario o un administrador pueden gestionar el equipo."
  },
  "theme": {
    "label": "Tema",
    "light": "Claro",
    "dark": "Oscuro",
    "system": "Sistema"
  }
}
