Files
HealthLog/messages/es.json
T
Marc-André Bombeck 640793a3e8 refactor(nav): surface Recovery as an Insights tab instead of a left-nav item
Recovery is a composite wearable surface (WHOOP / Polar / Oura recovery,
strain, ANS charge, cardio load), not a top-level tracking destination.
It moves off the left nav and onto the Insights tab strip as a pill at
/insights/recovery. The pill is always present (like Overview) since the
page self-gates every block and falls back to a calm empty note rather
than carrying its own availability signal. Adds the insights.navRecovery
label across all six locales.
2026-06-15 21:03:48 +02:00

6516 lines
327 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"common": {
"save": "Guardar",
"cancel": "Cancelar",
"delete": "Eliminar",
"undo": "Deshacer",
"edit": "Editar",
"moreOptions": "Más opciones",
"create": "Crear",
"close": "Cerrar",
"loading": "Cargando…...",
"loadFailed": "No se pudo cargar",
"error": "Error",
"saved": "Guardado",
"pullToRefresh": "Actualizando…",
"no": "No",
"noData": "Sin datos disponibles",
"optional": "Opcional",
"active": "Activo",
"inactive": "Inactivo",
"enabled": "Activado",
"disabled": "Desactivado",
"networkError": "Error de red",
"unknownError": "Error desconocido",
"copied": "¡Copiado!",
"or": "o",
"unknown": "Desconocido",
"add": "Añadir",
"import": "Importar",
"test": "Probar",
"reset": "Restablecer",
"copy": "Copiar",
"copyDetails": "Copiar detalles",
"retry": "Reintentar",
"reportIssue": "Reportar problema",
"showPassword": "Mostrar contraseña",
"hidePassword": "Ocultar contraseña"
},
"doctorReport": {
"title": "Informe de salud",
"subtitle": "HealthLog — Informe personal de salud",
"patient": "Paciente",
"dateOfBirth": "Fecha de nacimiento",
"gender": "Sexo",
"genderMale": "Hombre",
"genderFemale": "Mujer",
"genderOther": "No binario",
"height": "Altura",
"period": "Período del informe",
"createdOn": "Creado el",
"vitalsTitle": "Signos vitales — Resumen",
"colParameter": "Parámetro",
"colCurrent": "Actual",
"colAvgPeriod": "Med. periodo",
"colMin": "Mín",
"colMax": "Máx",
"colN": "n",
"bpClassificationTitle": "Tensión arterial — Clasificación ESH (2023)",
"avgBp": "Tensión arterial media",
"classification": "Clasificación",
"bmiTitle": "Índice de masa corporal (IMC)",
"bmiRow": "IMC:{bmi} kg/m² — Classification: {class} (WHO)",
"complianceTitle": "Cumplimiento de medicación",
"glp1Title": "Terapia GLP-1",
"glp1WeightSummary": "Peso en el periodo del informe: {start} kg → {end} kg ({delta} kg)",
"glp1CurrentDose": "Dosis actual:{value} {unit} (since {since})",
"glp1Compliance": "Cumplimiento:{taken} / {total} ({rate}%)",
"glp1SideEffectsTitle": "Efectos secundarios registrados",
"colGlp1Date": "Fecha",
"colGlp1Dose": "Dosis",
"colGlp1Note": "Nota",
"colGlp1SideEffect": "Efecto secundario",
"colMedication": "Medicamento",
"colTaken": "Tomada",
"colSkipped": "Omitida",
"colMissed": "Perdida",
"colTotal": "Total",
"colExpected": "Esperadas",
"colComplianceRate": "Tasa de cumplimiento",
"moodTitle": "Evolución del estado de ánimo",
"moodSummary": "Promedio:{avg} / 5.0 · Entries: {count} · Range: {min}–{max}",
"colMood": "Estado de ánimo",
"colCount": "Cantidad",
"colShare": "Porcentaje",
"footerDisclaimer1": "Este informe se generó automáticamente a partir de datos autorregistrados y está destinado a apoyar",
"footerDisclaimer2": "la conversación entre médico y paciente. No sustituye un diagnóstico médico. Las correlaciones no implican causalidad.",
"footerSource": "Fuente: HealthLog | Zona horaria: Europe/Berlin | Creado: {timestamp}",
"typeWeight": "Peso corporal",
"typeBpSys": "Tensión arterial sistólica",
"typeBpDia": "Tensión arterial diastólica",
"typePulse": "Pulso en reposo",
"typeBodyFat": "Grasa corporal",
"typeSleep": "Duración del sueño",
"typeSteps": "Actividad (pasos)",
"typeTotalBodyWater": "Agua corporal total",
"typeBoneMass": "Masa ósea",
"typeOxygenSaturation": "Saturación de oxígeno",
"unitSteps": "Pasos",
"bmiUnderweight": "Peso insuficiente",
"bmiNormal": "Peso normal",
"bmiOverweight": "Sobrepeso (preobesidad)",
"bmiObeseGrade1": "Obesidad grado I",
"bmiObeseGrade2": "Obesidad grado II",
"bmiObeseGrade3": "Obesidad grado III",
"bpOptimal": "Óptima",
"bpNormal": "Normal",
"bpHighNormal": "Normal-alta",
"bpHypertensionGrade1": "Hipertensión grado 1",
"bpHypertensionGrade2": "Hipertensión grado 2",
"bpHypertensionGrade3": "Hipertensión grado 3",
"moodAwful": "Muy mal",
"moodBad": "Mal",
"moodNeutral": "Neutral",
"moodGood": "Bien",
"moodGreat": "Muy bien",
"typeGlucoseFasting": "Glucosa (en ayunas)",
"typeGlucosePostprandial": "Glucosa (posprandial)",
"typeGlucoseRandom": "Glucosa (aleatoria)",
"typeGlucoseBedtime": "Glucosa (antes de dormir)",
"glucoseClassificationTitle": "Glucemia — Rangos de referencia (ADA 2024 / DDG)",
"glucoseRow": "{label}: med. {avg} {unit} (objetivo {rangeMin}–{rangeMax}) — {class}",
"glucoseInTarget": "en objetivo",
"glucoseBelowTarget": "por debajo del objetivo",
"glucoseAboveTarget": "por encima del objetivo",
"practiceLabel": "Consulta",
"dialog": {
"title": "Informe médico (PDF)",
"description": "Define el periodo de análisis y (opcional) el nombre de la consulta — ambos aparecen en la portada.",
"startLabel": "Desde",
"endLabel": "Hasta",
"practiceLabel": "Consulta / clínica (opcional)",
"practicePlaceholder": "p. ej. Dr. Müller — Medicina familiar",
"preset90d": "Últimos 90 días",
"preset180d": "Últimos 6 meses",
"preset365d": "Últimos 12 meses",
"submit": "Generar PDF",
"cancel": "Cancelar",
"errorEndBeforeStart": "La fecha final no puede ser anterior a la inicial.",
"errorRangeTooLong": "El periodo de análisis no puede superar los 2 años.",
"errorInvalidDate": "Selecciona una fecha de inicio y fin válida."
},
"sections": {
"title": "Seleccionar contenido",
"bp": "Presión arterial",
"weight": "Peso",
"pulse": "Pulso en reposo",
"bmi": "Índice de masa corporal (IMC)",
"mood": "Estado de ánimo",
"moodSensitive": "Sensible — desactivado por defecto.",
"compliance": "Cumplimiento de medicación",
"sleep": "Duración del sueño",
"cycle": "Ciclo menstrual",
"empty": "No hay datos para el periodo seleccionado. El informe se generará con la portada.",
"unavailableHint": "Sin datos en este periodo",
"labs": "Resultados de análisis"
},
"insurer": "Seguro médico",
"insuranceNumber": "N.º de asegurado",
"summaryTitle": "Resumen clínico",
"summaryReadings": "Registrado durante {days} días: {count} mediciones en {params} parámetros.",
"summaryTrend": "{label}: último {latest} {arrow}",
"summaryAdherence": "Adherencia a la medicación: {rate}% (media ponderada).",
"chartsTitle": "Gráficos de tendencia",
"aiSummaryTitle": "Resumen de IA — no validado clínicamente",
"aiSummaryDisclaimer": "Esta sección fue generada automáticamente por un modelo de IA y no está validada clínicamente. No sustituye una evaluación médica.",
"packageReadme": "Historial de salud de HealthLog\n\nEste paquete contiene:\n- report.pdf: el informe de salud para su médico.\n- bundle.json: los mismos datos como Bundle de documento HL7 FHIR R4, compatible con ePA.\n\nGenerado con HealthLog.",
"wellnessTitle": "Resumen de bienestar",
"wellnessDisclaimer": "Son puntuaciones de bienestar descriptivas calculadas a partir de tus señales registradas (0–100). No son evaluaciones clínicas ni diagnósticos.",
"wellnessRecovery": "Recuperación",
"wellnessStress": "Estrés",
"wellnessStrain": "Esfuerzo",
"cycleTitle": "Ciclo menstrual",
"cycleLmp": "Última menstruación",
"cycleAvgLength": "Duración media del ciclo",
"cycleAvgPeriod": "Duración media del periodo",
"cyclePhase": "Fase actual",
"cycleDays": "días",
"cycleColStart": "Inicio del periodo",
"cycleColLength": "Duración del ciclo (días)",
"cycleColPeriod": "Duración del periodo (días)",
"cyclePhases": {
"MENSTRUAL": "Menstrual",
"FOLLICULAR": "Folicular",
"OVULATORY": "Ovulatoria",
"LUTEAL": "Lútea"
},
"labsTitle": "Resultados de análisis",
"labsColAnalyte": "Biomarcador",
"labsColValue": "Valor",
"labsColReference": "Referencia",
"labsColStatus": "Estado",
"labsColDate": "Fecha"
},
"errorBoundary": {
"title": "Algo ha salido mal",
"description": "Se ha producido un error inesperado. Puedes reintentar, copiar los detalles técnicos o abrir un reporte de bug."
},
"notFound": {
"title": "Esta página no existe.",
"backToDashboard": "Volver al panel"
},
"offlineBanner": {
"message": "Sin conexión — tus cambios se guardarán cuando vuelvas a estar en línea."
},
"demoBanner": {
"message": "Modo demo — los cambios no se guardan."
},
"nav": {
"dashboard": "Panel",
"measurements": "Mediciones",
"medications": "Medicamentos",
"insights": "Insights",
"targets": "Objetivos",
"achievements": "Logros",
"settings": "Ajustes",
"bugreport": "Reporte de bug",
"admin": "Consola de administración",
"logout": "Cerrar sesión",
"login": "Iniciar sesión",
"about": "Acerca de HealthLog",
"notifications": "Notificaciones",
"theme": "Apariencia",
"themeSystem": "Sistema",
"themeDark": "Oscuro",
"themeLight": "Claro",
"collapseSidebar": "Contraer",
"userMenu": "Menú de usuario",
"accountSettings": "Ajustes de cuenta",
"mood": "Estado de ánimo",
"workouts": "Entrenamientos",
"coach": "Coach",
"skipToContent": "Saltar al contenido",
"sidebar": "Barra lateral",
"mainNavigation": "Navegación principal",
"mobileNavigation": "Navegación móvil",
"breadcrumb": "Ruta de navegación",
"loadingScreen": "Cargando…",
"more": "Más",
"moreSheetTitle": "Más",
"moreSheetDescription": "Ve al resto de HealthLog.",
"capture": {
"title": "Registrar",
"description": "¿Qué quieres registrar?",
"measurement": "Medición",
"measurementDescription": "Peso, presión arterial, pulso y más",
"medication": "Medicamento",
"medicationDescription": "Marcar una dosis como tomada",
"mood": "Estado de ánimo",
"moodDescription": "Registrar estado de ánimo y etiquetas"
},
"cycle": "Ciclo",
"labs": "Análisis",
"recovery": "Recuperación",
"vorsorge": "Prevención"
},
"auth": {
"login": "Iniciar sesión",
"register": "Registrarse",
"username": "Nombre de usuario",
"password": "Contraseña",
"email": "Correo electrónico",
"emailPlaceholder": "nombre@ejemplo.com",
"emailOrUsername": "Correo electrónico o nombre de usuario",
"emailOrUsernamePlaceholder": "nombre@ejemplo.com o nombredeusuario",
"loginWithPasskey": "Iniciar sesión con passkey",
"loginWithPassword": "Iniciar sesión con contraseña",
"noAccount": "¿Aún no tienes cuenta?",
"hasAccount": "¿Ya tienes cuenta?",
"loginFailed": "No se ha podido iniciar sesión",
"registerFailed": "No se ha podido completar el registro",
"invitedBanner": "Te han invitado: crea tu cuenta aunque el registro esté cerrado.",
"createAccount": "Crear cuenta",
"newAccount": "Crear cuenta nueva",
"backToPasskey": "Volver a passkey",
"passkeySetupLater": "Puedes configurar passkeys más tarde en los ajustes.",
"passwordMinLength": "Mín. 12 caracteres",
"passwordTooShort": "La contraseña debe tener al menos {minLength} caracteres.",
"privacyPolicy": "Política de privacidad"
},
"dashboard": {
"title": "Panel",
"greeting": {
"morning": "Buenos días",
"day": "Hola",
"evening": "Buenas tardes"
},
"welcomeBack": "{greeting}, te damos la bienvenida de nuevo.",
"welcomeBackWithName": "{greeting} {name}, te damos la bienvenida de nuevo.",
"hero": {
"scoreLabel": "Health Score",
"scoreProvisional": "Aún no hay datos suficientes",
"scoreComputing": "Calculando la puntuación …",
"doses": {
"summary": "{taken} de {scheduled} dosis tomadas",
"nextAt": "Próxima a las {time}",
"allDone": "Todas las dosis de hoy completadas",
"none": "Hoy no hay dosis programadas"
},
"verdict": {
"doseOverdue": "Una dosis de {name} está atrasada.",
"doseOverdueNoName": "Una dosis está atrasada.",
"bpHigh": "Tu última tensión arterial fue muy alta ({sys}/{dia}). Vuelve a medirla con calma.",
"doseUpcoming": "A las {time} toca {name}.",
"doseUpcomingNoName": "A las {time} toca una dosis.",
"weightDrift": "Tu peso se está alejando del rango objetivo esta semana.",
"shortNights": "Tus noches han sido cortas últimamente — {hours} h de media.",
"silence": "Sin mediciones desde hace {days} días. Un registro rápido mantiene tu panorama al día.",
"scoreDrop": "Tu puntuación está {points} puntos por debajo de la semana pasada.",
"allQuiet": "Todo tranquilo — hoy no hay nada que requiera tu atención."
},
"action": {
"takeDose": "Registrar ahora",
"viewBp": "Ver tensión arterial",
"viewWeight": "Ver peso",
"viewSleep": "Ver sueño",
"logMeasurement": "Registrar medición",
"viewInsights": "Abrir Insights"
}
},
"greetingSalutation": "Hola, {name}",
"streakLabel": "días seguidos",
"weight": "Peso",
"bloodPressure": "Presión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"sleep": "Sueño",
"steps": "Pasos",
"vo2Max": "VO₂ máx",
"vo2MaxUnit": "mL/(kg·min)",
"bpInTarget": "TA en rango objetivo",
"weightShort": "Peso",
"bloodPressureSysShort": "PA (Sys)",
"bloodPressureDiaShort": "PA (Dia)",
"pulseShort": "Pulso",
"bodyFatShort": "GC",
"moodShort": "Humor",
"sleepShort": "Sueño",
"stepsShort": "Pasos",
"vo2MaxShort": "VO₂ máx",
"bpInTargetShort": "PA-objetivo",
"bpInTargetWindow90": "PA-objetivo · 90 d",
"bpInTargetWindowDynamic": "PA-objetivo · {days} d",
"bpInTargetCollecting": "recopilando datos",
"medications": "Medicamentos",
"quickAddMeasurement": "Registrar medición",
"quickAddMood": "Registrar estado de ánimo",
"quickAddMedicationIntake": "Registrar toma",
"customizeDashboard": "Personalizar panel",
"medicationIntakeQuickAdd": {
"sheetTitle": "Registrar toma de medicación",
"sheetDescription": "Registra dosis, hora y medicamento en unos pocos toques.",
"medicationLabel": "Medicamento",
"medicationPlaceholder": "Selecciona un medicamento",
"doseLabel": "Dosis",
"dosePlaceholder": "p. ej. 5 mg",
"doseHint": "Precargado con la dosis estándar. Edítala para registrar una dosis diferente solo para esta toma.",
"timeLabel": "Hora de la toma",
"saveError": "No se ha podido guardar la toma.",
"emptyTitle": "Aún no hay medicamentos",
"emptyDescription": "Crea primero un medicamento con horario, después vuelve aquí para registrar la toma.",
"emptyCta": "Añadir medicamento"
},
"quickEntryDiscard": {
"title": "¿Descartar esta entrada?",
"description": "Tienes datos sin guardar. ¿Cerrar el formulario y perder lo que escribiste?",
"confirm": "Descartar",
"cancel": "Seguir editando"
},
"compliance7d": "Cumplimiento (7 días)",
"mood": "Estado de ánimo",
"customizeTitle": "Diseño del panel",
"heroToggleLabel": "Resumen del día",
"heroToggleDescription": "Muestra el saludo, la puntuación, el foco del día y el estado de las dosis en la parte superior del panel.",
"layoutReset": "Restablecer valores por defecto",
"layoutSaveSuccess": "Diseño del panel guardado",
"layoutSaveError": "No se ha podido guardar el diseño",
"layoutResetSuccess": "Restablecido al diseño por defecto",
"layoutUsingDefaults": "Diseño por defecto activo",
"layoutCustomized": "Diseño personalizado activo",
"moveUp": "Subir",
"moveDown": "Bajar",
"layoutTileColumn": "Tarjeta",
"layoutChartColumn": "Gráfico",
"dragHandle": "Arrastra para reordenar",
"dragHandleHint": "Arrastra el manejador para reordenar este widget. También puedes usar los botones de flecha Arriba y Abajo, o enfocar el manejador y pulsar Espacio más las flechas.",
"emptyTitle": "Tu panel está vacío",
"emptyDescription": "Registra tu primera medición o estado de ánimo. Las tarjetas y gráficas aparecerán automáticamente en cuanto haya datos.",
"emptyAddMeasurement": "Registrar la primera medición",
"staleHint": "Último valor hace {count} d",
"staleHintWeeksOne": "Último valor hace 1 semana",
"staleHintWeeksOther": "Último valor hace {count} semanas",
"staleHintMonthsOne": "Último valor hace 1 mes",
"staleHintMonthsOther": "Último valor hace {count} meses",
"coachCta": "Pregunta al coach",
"recentWorkouts": {
"title": "Entrenamientos recientes",
"viewAll": "Ver todos",
"loading": "Cargando entrenamientos…",
"empty": {
"title": "Aún no hay entrenamientos",
"cta": "Abre la app Apple Salud en el iPhone para sincronizar los entrenamientos."
}
},
"metric": {
"title": {
"weight": "Peso",
"bloodPressure": "Presión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"glucose": "Glucemia",
"sleep": "Sueño",
"steps": "Pasos",
"totalBodyWater": "Agua corporal total",
"boneMass": "Masa ósea",
"oxygenSaturation": "Saturación de oxígeno"
},
"unit": {
"weight": "kg",
"bloodPressure": "mmHg",
"pulse": "bpm",
"bodyFat": "%",
"glucose": "mg/dL",
"sleep": "h",
"steps": "pasos",
"totalBodyWater": "kg",
"boneMass": "kg",
"oxygenSaturation": "%"
}
}
},
"measurements": {
"title": "Mediciones",
"subtitle": "Peso, tensión arterial, pulso y más",
"addMeasurement": "Añadir",
"editMeasurement": "Editar medición",
"type": "Tipo",
"value": "Valor",
"date": "Fecha",
"source": "Fuente",
"notes": "Notas",
"typeWeight": "Peso",
"typeBloodPressure": "Presión arterial",
"typeBpSys": "Sis",
"typeBpDia": "Dia",
"typePulse": "Pulso",
"typeBodyFat": "Grasa corporal",
"typeSleep": "Sueño",
"typeSteps": "Pasos",
"typeBloodGlucose": "Glucemia",
"typeTotalBodyWater": "Agua corporal total",
"typeBoneMass": "Masa ósea",
"typeOxygenSaturation": "Saturación de oxígeno",
"typeHeartRateVariability": "Variabilidad de la frecuencia cardiaca",
"typeRestingHeartRate": "Frecuencia cardíaca en reposo",
"typeActiveEnergyBurned": "Energía activa",
"typeFlightsClimbed": "Escaleras",
"typeWalkingRunningDistance": "Distancia a pie y corriendo",
"typeVo2Max": "VO₂ máx",
"typeBodyTemperature": "Temperatura corporal",
"typeFatFreeMass": "Masa libre de grasa",
"typeFatMass": "Masa grasa",
"typeMuscleMass": "Masa muscular",
"typeSkinTemperature": "Temperatura de la piel",
"typePulseWaveVelocity": "Velocidad de la onda de pulso",
"typeVascularAge": "Edad vascular",
"typeVisceralFat": "Grasa visceral",
"typeAudioExposureEnv": "Exposición al ruido (ambiente)",
"typeAudioExposureHeadphone": "Exposición al ruido (auriculares)",
"typeTimeInDaylight": "Tiempo a la luz del día",
"typeWalkingSteadiness": "Estabilidad al caminar",
"typeAudioExposureEvent": "Evento de escucha alta",
"typeRespiratoryRate": "Frecuencia respiratoria",
"typeBodyMassIndex": "Índice de masa corporal",
"typeLeanBodyMass": "Masa magra",
"typeWalkingHeartRateAverage": "Frecuencia cardíaca al caminar (media)",
"typeWalkingAsymmetry": "Asimetría al caminar",
"typeWalkingDoubleSupport": "Doble apoyo al caminar",
"typeWalkingStepLength": "Longitud de zancada",
"typeWalkingSpeed": "Velocidad al caminar",
"glucoseContext": "Contexto",
"glucoseContextFasting": "En ayunas (≥8 h sin comer)",
"glucoseContextPostprandial": "Posprandial (2 h tras comer)",
"glucoseContextRandom": "Cualquiera / sin contexto",
"glucoseContextBedtime": "Antes de acostarse",
"unitHours": "Horas",
"unitSteps": "Pasos",
"sourceManual": "Manual",
"sourceWithings": "Withings",
"sourceImport": "Importar",
"sourceAppleHealth": "Apple Health",
"systolicLabel": "Sistólica (mmHg)",
"diastolicLabel": "Diastólica (mmHg)",
"pulseLabel": "Pulso (lpm)",
"valueWithUnit": "Valor ({unit})",
"timestamp": "Hora",
"timestampBackdateHint": "Ajusta la fecha y la hora para registrar una lectura pasada.",
"notesPlaceholder": "p. ej. después de comer",
"formReset": "Restablecer formulario",
"saveError": "Error al guardar",
"duplicateTimestamp": "Ya existe una medición de este tipo en la marca de tiempo seleccionada.",
"deleteError": "Error al eliminar",
"deletedToast": "Medición eliminada",
"restoredToast": "Medición restaurada",
"restoreError": "Error al restaurar",
"invalidValue": "Introduce un valor válido.",
"invalidTimestamp": "Selecciona una fecha y hora válidas.",
"loginRequired": "Inicia sesión para ver las mediciones.",
"allTypes": "Todos los tipos",
"filterByType": "Filtrar por tipo",
"measurementCount": "{count} mediciones",
"emptyTitle": "Aún no hay mediciones",
"emptyDescription": "Registra peso, tensión arterial, pulso u otros valores para detectar tendencias.",
"emptyFilteredTitle": "Ninguna medición coincide con el filtro",
"emptyFilteredDescription": "Elige otro tipo o quita el filtro para ver todas las mediciones.",
"emptyAddFirst": "Registrar la primera medición",
"emptyResetFilter": "Mostrar todos los tipos",
"comment": "Comentario",
"actions": "Acciones",
"deleteConfirmTitle": "¿Eliminar medición?",
"deleteConfirmDescription": "Esta medición se eliminará. Justo después podrás deshacerlo durante un breve momento.",
"pageInfo": "Página {page} de {total}",
"previousPage": "Página anterior",
"nextPage": "Página siguiente",
"dailyTotalCaption": "({count} muestras)",
"sleepNapCaption": "+{count} siesta(s)",
"sleepAwakeningsCaption": "{count} despertar(es)",
"expandDay": "Mostrar las muestras de este día",
"collapseDay": "Ocultar las muestras de este día",
"loadError": "No se pudieron cargar las mediciones.",
"typeCardioRecovery": "Recuperación cardiaca",
"typeWristTemperature": "Temperatura de muñeca",
"typeFallCount": "Caídas",
"typeSixMinuteWalkDistance": "Distancia en marcha de 6 minutos",
"typeStairAscentSpeed": "Velocidad subiendo escaleras",
"typeStairDescentSpeed": "Velocidad bajando escaleras",
"typeBreathingDisturbances": "Alteraciones respiratorias del sueño",
"typeIrregularRhythmNotification": "Aviso de ritmo irregular",
"typeHighHeartRateEvent": "Aviso de frecuencia cardíaca alta",
"typeLowHeartRateEvent": "Aviso de frecuencia cardíaca baja",
"typeWalkingSteadinessEvent": "Aviso de estabilidad al caminar",
"typeBreathingDisturbanceEvent": "Alteración respiratoria",
"typeRecoveryScore": "Puntuación de recuperación",
"typeStressScore": "Puntuación de estrés",
"typeStrainScore": "Puntuación de esfuerzo",
"typeHrvRmssd": "VFC (RMSSD)",
"typeDayStrain": "Esfuerzo del día",
"typeWorkoutStrain": "Esfuerzo del entrenamiento",
"typeSleepPerformance": "Rendimiento del sueño",
"typeSleepEfficiency": "Eficiencia del sueño",
"typeSleepConsistency": "Consistencia del sueño",
"typeSleepNeed": "Necesidad de sueño",
"typeEnergyExpenditureKj": "Gasto energético",
"typeAverageHeartRate": "Frecuencia cardíaca media",
"typeMaxHeartRate": "Frecuencia cardíaca máxima",
"typeSleepDisturbanceCount": "Interrupciones del sueño",
"typeAnsCharge": "Carga del SNA",
"typeCardioLoad": "Carga cardio",
"typeSleepScore": "Puntuación de sueño",
"typeBodyTemperatureDeviation": "Desviación de temperatura corporal",
"filterBySource": "Filtrar por fuente",
"sourceComputed": "Calculado",
"sourceWhoop": "WHOOP",
"sourceFitbit": "Fitbit",
"bulkDeleteSuccess": "{count} mediciones eliminadas",
"bulkDeleteError": "Error al eliminar las mediciones seleccionadas",
"bulkDeleteConfirmTitle": "¿Eliminar {count} mediciones?",
"bulkDeleteConfirmBody": "Las {count} mediciones seleccionadas se eliminarán de forma permanente."
},
"mood": {
"title": "Estado de ánimo",
"subtitle": "Tendencia y registros de estado de ánimo",
"addEntry": "Añadir",
"editEntry": "Editar entrada",
"moodLevel": "Estado de ánimo",
"heroQuestion": "¿Cómo estás?",
"factorYes": "Sí",
"factorNo": "No",
"factorRatingOption": "{label}: {value} de {max}",
"tags": "Etiquetas",
"tagsPlaceholder": "p. ej. deporte, trabajo, familia",
"tagsHelp": "Separa con comas",
"timestamp": "Hora",
"date": "Fecha",
"source": "Fuente",
"levelSuperGut": "Genial",
"levelGut": "Bien",
"levelOkay": "Bien",
"levelSchlecht": "Mal",
"levelLausig": "Pésimo",
"sourceMoodlog": "moodLog",
"allMoods": "Todos los estados",
"entryCount": "{count} entradas",
"emptyTitle": "Aún no hay entradas de estado de ánimo",
"emptyDescription": "Registra cómo te sientes hoy para descubrir patrones con el tiempo.",
"emptyFilteredTitle": "Ninguna entrada coincide con el filtro",
"emptyFilteredDescription": "Elige otro nivel o quita el filtro para ver todas las entradas.",
"emptyAddFirst": "Registrar primer estado",
"emptyResetFilter": "Mostrar todos los estados",
"actions": "Acciones",
"formReset": "Restablecer formulario",
"noteCharCount": "{count}/{max}",
"formResetConfirmTitle": "¿Restablecer este formulario?",
"formResetConfirmBody": "Esto borra el estado de ánimo, las etiquetas y la nota que has introducido. No se puede deshacer.",
"formResetConfirmAction": "Restablecer",
"saveError": "Error al guardar",
"deleteError": "Error al eliminar",
"deletedToast": "Entrada eliminada",
"restoredToast": "Entrada restaurada",
"restoreError": "Error al restaurar",
"invalidTimestamp": "Selecciona una fecha y hora válidas.",
"deleteConfirmTitle": "¿Eliminar entrada?",
"deleteConfirmDescription": "Esta entrada de estado de ánimo se eliminará. Justo después podrás deshacerlo durante un breve momento.",
"pageInfo": "Página {page} de {total}",
"previousPage": "Página anterior",
"nextPage": "Página siguiente",
"loginRequired": "Inicia sesión para ver tus estados de ánimo.",
"note": "Nota",
"noteCollapse": "Contraer nota",
"noteExpand": "Mostrar nota completa",
"notePlaceholder": "Añade una nota sobre cómo te sientes…",
"tagPicker": "Etiquetas",
"tagCategory": {
"feelings": "Sentimientos",
"sleep": "Sueño",
"health": "Salud",
"social": "Social",
"work": "Trabajo",
"hobbies": "Aficiones",
"factors": "Factores",
"custom": "Personalizadas"
},
"tag": {
"happy": "feliz",
"excited": "emocionado",
"grateful": "agradecido",
"relaxed": "relajado",
"content": "satisfecho",
"tired": "cansado",
"unsure": "inseguro",
"bored": "aburrido",
"tense": "tenso",
"angry": "enfadado",
"stressed": "estresado",
"sad": "triste",
"sleptWell": "dormí bien",
"sleptOk": "dormí regular",
"sleptPoorly": "dormí mal",
"earlyNight": "me acosté pronto",
"workedOut": "entrené",
"ateWell": "comí bien",
"hydrated": "bebí agua",
"walked": "caminé",
"alcohol": "alcohol",
"family": "familia",
"friends": "amigos",
"party": "fiesta",
"alone": "solo",
"productive": "productivo",
"overtime": "horas extra",
"dayOff": "día libre",
"travel": "viaje",
"sickDay": "día de baja",
"movies": "películas",
"reading": "lectura",
"gaming": "videojuegos",
"music": "música",
"outdoors": "aire libre",
"fastFood": "comida rápida",
"noSweets": "sin dulces",
"bigMeal": "comilona",
"factorWork": "trabajo",
"factorSocial": "vida social",
"factorSleepQuality": "calidad del sueño",
"factorStress": "estrés",
"factorConflict": "conflicto",
"factorFamily": "familia",
"factorSadness": "tristeza",
"praise": "elogio"
},
"filterBySource": "Filtrar por fuente",
"sourceManual": "Manual",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"bulkDeleteSuccess": "{count} entradas eliminadas",
"bulkDeleteError": "Error al eliminar las entradas seleccionadas",
"bulkDeleteConfirmTitle": "¿Eliminar {count} entradas?",
"bulkDeleteConfirmBody": "Las {count} entradas de estado de ánimo seleccionadas se eliminarán de forma permanente.",
"customize": "Personalizar etiquetas de ánimo",
"addTagInline": "Añadir etiqueta",
"manage": {
"groupsTitle": "Grupos",
"groupsDescription": "Crea tus propios grupos y define su orden en el selector.",
"newGroup": "Nuevo grupo",
"groupLabel": "Nombre del grupo",
"groupIcon": "Icono",
"groupCreated": "Grupo creado",
"groupRenamed": "Grupo guardado",
"groupDeleteTitle": "¿Eliminar grupo?",
"groupDeleteBody": "Las etiquetas de este grupo vuelven a su grupo original. No se elimina ninguna entrada.",
"groupDeleted": "Grupo eliminado",
"groupEmpty": "Aún no hay grupos propios.",
"groupLimitReached": "Límite de grupos alcanzado",
"tagsTitle": "Etiquetas",
"tagsDescription": "Oculta, reordena, mueve o edita las etiquetas del selector.",
"newTag": "Nueva etiqueta",
"tagLabel": "Nombre de la etiqueta",
"tagIcon": "Icono",
"tagGroup": "Grupo",
"usageCount": "{count} entradas",
"hideTag": "Ocultar etiqueta",
"showTag": "Mostrar etiqueta",
"moveToGroup": "Mover a grupo",
"archive": "Archivar",
"restore": "Restaurar",
"archivedTitle": "Etiquetas archivadas",
"archivedDescription": "Las etiquetas archivadas permanecen en tus entradas anteriores; solo desaparecen del selector.",
"archivedEmpty": "Nada archivado.",
"purgeTitle": "¿Eliminar etiqueta definitivamente?",
"purgeBody": "Esto elimina la etiqueta de {count} entradas anteriores. No se puede deshacer.",
"purgeAction": "Eliminar definitivamente",
"purged": "Etiqueta eliminada",
"tagLimitReached": "Límite de etiquetas alcanzado",
"iconPickerTitle": "Elegir icono",
"iconSearchPlaceholder": "Buscar iconos…",
"iconSearchEmpty": "Ningún icono coincide.",
"iconSearchClear": "Borrar búsqueda",
"orderSave": "Guardar orden",
"orderSaved": "Orden guardado",
"moveUp": "Subir",
"moveDown": "Bajar",
"iconGroupEmotions": "Emociones",
"iconGroupActivities": "Actividades",
"iconGroupHealth": "Salud",
"iconGroupFood": "Comida y bebida",
"iconGroupWeather": "Tiempo",
"iconGroupPlaces": "Lugares",
"iconGroupMisc": "Otros"
},
"sectionMoreTags": "Más etiquetas",
"sectionFactors": "Factores",
"sectionNoteDetails": "Nota y detalles",
"quickTagsHelp": "Tus etiquetas frecuentes: un toque",
"quickTagsExpand": "Más"
},
"medications": {
"title": "Medicamentos",
"subtitle": "Medicación, horarios y tomas",
"loginRequired": "Inicia sesión para gestionar medicamentos.",
"addMedication": "Añadir",
"editMedication": "Editar medicamento",
"newMedication": "Nuevo medicamento",
"firstMedication": "Añadir el primer medicamento",
"addChoice": {
"logIntake": "Registrar una toma",
"newMedication": "Nuevo medicamento"
},
"takeAllDue": {
"button": "Tomar todas las pendientes",
"dialogTitle": "Tomar medicamentos pendientes",
"dialogDescription": "Estos medicamentos están pendientes ahora. Confirma para registrarlos todos como tomados.",
"confirm": "Tomar todos ({count})",
"successToast": "{count} tomas registradas",
"partialToast": "{taken} registradas, {failed} fallidas – inténtalo de nuevo",
"failedToast": "No se registró ninguna toma – inténtalo de nuevo"
},
"logIntake": {
"dialogTitle": "Registrar una toma",
"dialogDescription": "Registra una dosis de un medicamento existente. Puedes posfecharla a una fecha y hora pasadas.",
"medicationLabel": "Medicamento",
"slotLabel": "Franja del horario",
"slotNone": "Sin franja concreta",
"doseLabel": "Dosis",
"doseHint": "Precargado con la dosis del medicamento o de la franja. Edítala para registrar una dosis diferente solo para esta toma.",
"takenAtLabel": "Fecha y hora",
"takenAtHint": "Por defecto es ahora; elige una fecha y hora anteriores para registrar una dosis pasada.",
"skippedLabel": "Registrar como omitida",
"noMedications": "Añade primero un medicamento y luego podrás registrar tomas para él.",
"cancel": "Cancelar",
"submit": "Registrar toma",
"slotError": "No se pudo asignar una hora al intervalo seleccionado. Elige otro intervalo o «Sin intervalo específico»."
},
"emptyTitle": "Aún no hay medicamentos",
"emptyDescription": "Crea medicamentos, dosis y franjas horarias para registrar el cumplimiento.",
"loadFailed": "No se han podido cargar los medicamentos",
"retryLoad": "Reintentar",
"name": "Nombre",
"dose": "Dosis",
"scheduleFrom": "Desde",
"scheduleTo": "Hasta",
"scheduleLabel": "Etiqueta",
"scheduleDays": "Días",
"scheduleDaily": "A diario",
"inactive": "En pausa",
"intakeHistory": "Historial de tomas",
"openDetailPage": "Abrir la página de detalle del medicamento",
"deleteConfirm": "¿Eliminar medicamento?",
"compliance": "Cumplimiento",
"importIntakes": "Importar tomas",
"importDescription": "Pega un array JSON con los datos de tomas. Formato esperado:",
"importUploadFile": "Subir archivo JSON",
"importPaste": "Pega el JSON aquí...",
"importSelected": "Seleccionado: {name}",
"importFileLoaded": "Archivo \"{name}\" cargado",
"importInvalidJson": "El archivo no contiene un JSON válido",
"importNoArray": "No se encontró ningún array",
"importResult": "{imported} tomas importadas",
"importDuplicatesSkipped": "{count} duplicados omitidos",
"importInvalidSkipped": "{count} entradas no válidas omitidas",
"importFailed": "Falló la importación",
"importInvalidFormat": "Formato JSON no válido",
"apiEndpointTitle": "Endpoint de API: {name}",
"apiEndpointDescription": "Usa este endpoint para registrar tomas a través de la API (p. ej., con un Atajo de iPhone o un cron job).",
"apiEndpointActive": "Endpoint de API activo",
"apiEndpointActivated": "Endpoint de API activado",
"apiEndpointDeactivated": "Endpoint de API desactivado",
"apiTokenCount": "Activo ({count} tokens)",
"apiToken": "Token de API",
"apiTokenActiveHint": "El endpoint está activo. Los tokens existentes siguen siendo válidos, pero no se pueden mostrar de nuevo en texto plano.",
"apiTokenActivateHint": "Activa el endpoint para crear un nuevo token.",
"apiTokenOnceHint": "El token solo se muestra en texto plano una vez, al crearlo.",
"requestExample": "Ejemplo de solicitud",
"statusLoadFailed": "No se pudo cargar el estado",
"changeFailed": "Falló el cambio",
"categoryBloodPressure": "Presión arterial",
"categoryVitamin": "Vitaminas",
"categoryThyroid": "Tiroides",
"categoryHormone": "Hormonas",
"categorySupplement": "Suplemento",
"categoryPainRelief": "Analgésico",
"categoryAllergy": "Alergia",
"categoryDigestive": "Digestivo",
"categorySkin": "Cuidado de la piel",
"categorySleepAid": "Para dormir",
"categoryDiabetes": "Diabetes",
"categoryAntibiotic": "Antibiótico",
"categoryOther": "Otros",
"daysSun": "Do",
"daysMon": "Lu",
"daysTue": "Ma",
"daysWed": "Mi",
"daysThu": "Ju",
"daysFri": "Vi",
"daysSat": "Sa",
"back": "Atrás",
"today": "Hoy",
"yesterday": "Ayer",
"tomorrow": "Mañana",
"asNeededMarker": "Según necesidad",
"withoutNotification": "Sin notificación",
"pausedSince": "En pausa desde",
"takeNow": "Tomar ahora",
"lastDoseYesterday": "Última dosis ayer",
"lastDoseDaysAgo": "Última dosis hace {count} días",
"overdue": "Vencida",
"veryOverdue": "Muy vencida",
"compliance7d": "Cumplimiento 7 días",
"compliance30d": "Cumplimiento 30 días",
"complianceWindow": "Cumplimiento {days} días",
"complianceUnavailable": "No se pudo cargar el cumplimiento",
"complianceInfo": "Proporción de dosis registradas respecto a las esperadas. Las pautas semanales se cuentan semana a semana.",
"complianceInfoLabel": "¿Qué significa el cumplimiento?",
"complianceDoses": "{count} dosis",
"lastIntake": "Última toma:",
"nextIntake": "Próxima toma:",
"nextIntakeOverdue": "Atrasada · {time} — aún se puede tomar",
"dayStreak": "días de racha",
"dayStreakOne": "día de racha",
"cycleNextDoseToday": "Próxima dosis hoy",
"cycleNextDoseTomorrow": "Próxima dosis mañana",
"cycleNextDoseInDays": "Próxima dosis en {days} días",
"cycleDueToday": "Pendiente hoy",
"cycleOverdue": "Atrasada",
"cycleNoClosedCycles": "Aún no hay ciclos de dosis completados",
"taken": "Tomada",
"skipped": "Omitida",
"intakeToastTaken": "{name} registrada como tomada",
"intakeToastSkipped": "{name} omitida",
"intakeToastFailed": "No se pudo registrar {name}; inténtalo de nuevo",
"intakeUndo": "Deshacer",
"intakeUndone": "Entrada revertida",
"intakeUndoFailed": "No se pudo deshacer; corrígelo en el historial",
"weekdaySunday": "Domingo",
"weekdayMonday": "Lunes",
"weekdayTuesday": "Martes",
"weekdayWednesday": "Miércoles",
"weekdayThursday": "Jueves",
"weekdayFriday": "Viernes",
"weekdaySaturday": "Sábado",
"weekdaySundayPlural": "Domingos",
"weekdayMondayPlural": "Lunes",
"weekdayTuesdayPlural": "Martes",
"weekdayWednesdayPlural": "Miércoles",
"weekdayThursdayPlural": "Jueves",
"weekdayFridayPlural": "Viernes",
"weekdaySaturdayPlural": "Sábados",
"formType": "Tipo",
"formDose": "Dosis",
"formUnit": "Unidad",
"formSchedule": "Franja horaria",
"formTreatmentClass": "Clase de tratamiento",
"formTreatmentClassHelp": "Selecciona \"Inyección GLP-1\" para inyecciones semanales como Mounjaro, Ozempic, Wegovy, Zepbound. Activa la tarjeta corporal y el registro GLP-1.",
"treatmentClassGeneric": "Medicamento estándar",
"treatmentClassGlp1": "Inyección GLP-1",
"glp1WeeklyPresetTitle": "Una vez por semana, en…",
"glp1WeeklyPresetHelp": "La mayoría de los agonistas del receptor GLP-1 se inyectan una vez por semana. Toca un día para fijar el ritmo.",
"glp1WeeklyPresetSuggest": "Reutilizar el último día elegido",
"glp1DosesPerUnit": "Dosis por pluma / vial",
"glp1DosesPerUnitPlaceholder": "p. ej. 4 para una pluma Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Opcional — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy pluma de un solo uso = 1. Déjalo vacío si no quieres llevar el conteo de dosis por pluma.",
"glp1LastInjection": "{label}",
"glp1LastInjectionWithSite": "{label} · {site}",
"glp1NextInjectionDays": "{label} (en {days} días)",
"glp1NextInjectionToday": "hoy",
"glp1NextInjectionTomorrow": "mañana",
"glp1RotationLast": "Último sitio: {site}",
"glp1RotationSuggested": "Sugerido: {site}",
"glp1LogSideEffect": "Registrar efecto secundario",
"sideEffects": {
"section": "Efectos secundarios",
"addCta": "Registrar",
"sheetTitle": "Registrar un efecto secundario",
"categoryLabel": "Categoría",
"entryLabel": "Síntoma",
"severityLabel": "Gravedad",
"severity": {
"mild": "Leve",
"moderate": "Moderado",
"significant": "Notable",
"severe": "Grave",
"verySevere": "Muy grave"
},
"notesLabel": "Notas (opcional)",
"notesPlaceholder": "Lo que merezca la pena anotar, máx. 280 caracteres",
"submitCta": "Guardar",
"cancelCta": "Cancelar",
"emptyState": "Aún no hay efectos secundarios registrados. Hacer seguimiento puede ayudar a tu médico y revelar patrones a lo largo del tiempo.",
"recentTitle": "Últimos 30 días",
"loading": "Cargando…",
"deleteCta": "Eliminar",
"deleteConfirm": "¿Eliminar esta entrada?",
"deleteError": "No se pudo eliminar la entrada",
"errorSeverity": "La gravedad debe estar entre 1 y 5",
"errorEntry": "Elige un síntoma",
"categories": {
"gi": "Gastrointestinal",
"metabolic": "Metabólico",
"injectionSite": "Zona de inyección",
"cognitive": "Cognitivo",
"glp1Specific": "Específico de GLP-1"
},
"entries": {
"nausea": "Náuseas",
"vomiting": "Vómito",
"diarrhea": "Diarrea",
"constipation": "Estreñimiento",
"abdominalPain": "Dolor abdominal",
"hypoglycemiaSymptoms": "Síntomas de hipoglucemia",
"dehydration": "Deshidratación",
"anorexia": "Pérdida de apetito",
"electrolyteFatigue": "Fatiga por desequilibrio electrolítico",
"injectionRedness": "Enrojecimiento en la zona de inyección",
"injectionSwelling": "Hinchazón en la zona de inyección",
"injectionBruising": "Hematoma en la zona de inyección",
"injectionInduration": "Induración en la zona de inyección",
"brainFog": "Niebla mental",
"dizziness": "Mareo",
"lowMood": "Estado de ánimo bajo",
"lowEnergy": "Falta de energía",
"earlySatiety": "Saciedad precoz",
"gastroparesisLike": "Vaciado gástrico lento",
"dysgeusia": "Alteración del gusto",
"gallbladderDiscomfort": "Molestia en la vesícula biliar"
}
},
"scheduling": {
"naturalLanguage": {
"title": "Describe tu medicación",
"description": "Describe la medicación con tus propias palabras y completaremos el formulario por ti.",
"placeholder": "p. ej. Mounjaro 5 mg semanal los miércoles por la mañana a partir del próximo lunes",
"submit": "Extraer",
"submitBusy": "Extrayendo…",
"cancel": "Cancelar",
"examples": {
"label": "Prueba uno de estos ejemplos",
"weekly": "Mounjaro 5 mg semanal los miércoles por la mañana",
"daily": "Ibuprofeno 200 mg todos los días, 3 veces al día",
"rolling": "Metotrexato 7,5 mg cada 7 días desde la última inyección"
},
"error": {
"empty": "Escribe una descripción primero.",
"tooLong": "Mantén la descripción por debajo de 2000 caracteres.",
"rateLimit": "Demasiadas solicitudes — espera un momento e inténtalo de nuevo.",
"noProvider": "Sin proveedor de IA configurado — configúralo en Ajustes.",
"budget": "Se alcanzó el presupuesto diario de IA — inténtalo de nuevo mañana.",
"network": "No se pudo contactar con el proveedor de IA — inténtalo de nuevo."
}
},
"cadence": {
"section": "Frecuencia",
"label": "Con qué frecuencia",
"kind": {
"daily": "Cada día",
"weekdays": "Determinados días de la semana",
"everyNWeeks": "Cada N semanas en determinados días",
"monthly": "Mensualmente un día concreto",
"everyNMonths": "Cada N meses un día concreto",
"yearly": "Una vez al año",
"rolling": "Cada N días desde la última toma (flexible)",
"rollingExplainer": "Cuenta desde tu última toma registrada — se pausa si te saltas una dosis.",
"oneShot": "Dosis única"
},
"weekdays": {
"label": "Días de la semana",
"short": {
"mo": "Mo",
"tu": "Ma",
"we": "Mi",
"th": "Ju",
"fr": "Fr",
"sa": "Sa",
"su": "Do"
},
"long": {
"mo": "Lunes",
"tu": "Martes",
"we": "Miércoles",
"th": "Jueves",
"fr": "Viernes",
"sa": "Sábado",
"su": "Domingo"
}
},
"intervalWeeks": {
"suffix": "semanas"
},
"dayOfMonth": {
"label": "Día"
},
"intervalMonths": {
"suffix": "meses",
"dayOnLabel": "el día"
},
"yearly": {
"date": {
"label": "Fecha"
}
},
"rollingDays": {
"suffix": "días"
}
},
"timesOfDay": {
"section": "Horas del día",
"label": "Horas del día",
"empty": {
"cta": "Añade la primera hora."
},
"add": "Añadir hora",
"remove": "Quitar",
"presets": {
"morning": "Mañana",
"noon": "Mediodía",
"evening": "Tarde",
"night": "Noche"
},
"max": {
"reached": "Máximo alcanzado — quita una hora antes de añadir otra."
}
},
"courseWindow": {
"section": "Periodo de tratamiento",
"startsOn": {
"label": "Empieza el"
},
"endsOn": {
"label": "Termina el"
},
"noEndDate": "Sin fecha de fin",
"oneShotCaption": "(dosis única)",
"invalidRange": "La fecha de fin debe ser igual o posterior a la de inicio."
}
},
"wizard": {
"header": {
"stepOf": "Paso {current} de {total}",
"createTitle": "Nuevo medicamento",
"editTitle": "Editar {name}"
},
"nav": {
"back": "Atrás",
"next": "Siguiente",
"save": "Guardar",
"saveEdit": "Guardar cambios",
"nextHint": "Siguiente: {step}",
"reviewHint": "Siguiente: Guardar",
"jumpFirst": "Ir al primer paso",
"jumpLast": "Ir a revisar y guardar"
},
"nl": {
"button": "Describir"
},
"steps": {
"step1": {
"title": "¿Cómo se llama el medicamento?",
"subline": "Exactamente como aparece en la caja.",
"label": "Name",
"placeholder": "p. ej. Ramipril",
"short": "Nombre"
},
"step2": {
"title": "¿Qué tipo de medicamento es?",
"subline": "Lo usamos para las plantillas y los análisis adecuados.",
"short": "Tipo"
},
"step3": {
"title": "¿Cuál es la dosis?",
"subline": "Una pastilla, una inhalación, una gota — según la forma.",
"amountLabel": "Cantidad",
"amountPlaceholder": "p. ej. 5",
"unitLabel": "Unidad",
"unit": {
"mg": "mg",
"ml": "ml",
"iu": "UI",
"mcg": "µg",
"g": "g",
"tablets": "comprimido(s)",
"capsules": "cápsula(s)",
"drops": "gotas",
"puffs": "inhalación",
"sprays": "pulverización",
"pieces": "unidades",
"other": "otro"
},
"deliveryFormLabel": "Vía",
"deliveryForm": {
"ORAL": "Oral",
"INJECTION": "Inyección",
"OTHER": "Otra"
},
"dosesPerUnitLabel": "Dosis por unidad",
"dosesPerUnitPlaceholder": "p. ej. 4",
"dosesPerUnitHint": "Dosis por pluma / vial — déjalo vacío para no controlar el inventario.",
"injectionSiteToggle": "Rotación del sitio de inyección",
"injectionSiteHint": "Guía de rotación opcional. El sitio de cada dosis se registra al anotar la toma.",
"short": "Dosis",
"unitsPerDoseLabel": "Unidades por dosis",
"unitsPerDoseHint": "p. ej., 2 comprimidos de 2 mg para una dosis de 4 mg, o ½ comprimido para una dosis partida"
},
"step4": {
"title": "¿Durante qué periodo lo tomas?",
"subline": "Por hoy basta con una fecha de inicio. Puedes añadir una fecha de fin más tarde.",
"short": "Cuándo"
},
"step5": {
"title": "¿Con qué frecuencia lo tomas?",
"subline": "Elige la frecuencia — los detalles vienen en el siguiente paso.",
"short": "Frecuencia"
},
"step6": {
"title": "¿Cómo es exactamente?",
"subline": "Indica los días de la semana, los intervalos o el día del mes.",
"intervalWeeks": {
"label": "Cada",
"suffix": "semanas"
},
"dayOfMonth": {
"label": "El",
"suffix": "día del mes"
},
"rollingDays": {
"label": "Cada",
"suffix": "días desde la última toma"
},
"short": "Detalle"
},
"step7": {
"title": "¿Cuándo lo tomas?",
"subline": "Una o varias horas del día — los recordatorios siguen esta lista.",
"presetsLabel": "Preajustes por hora del día",
"presets": {
"morning": "Mañana",
"noon": "Mediodía",
"evening": "Tarde",
"night": "Noche"
},
"short": "Horas"
},
"step8": {
"title": "Listo — ¿quieres que HealthLog te lo recuerde?",
"subline": "Revisa todo abajo antes de guardar.",
"remindersLabel": "Recordatorios activados",
"remindersDescription": "Push, Telegram o ntfy — según tus ajustes.",
"noChannelHint": "Los recordatorios necesitan un canal de notificaciones — ahora mismo no hay ninguno activo.",
"noChannelHintLink": "Configurar notificaciones",
"multiScheduleNote": "Este medicamento tiene varios horarios. El editor detallado volverá en una versión posterior.",
"short": "Listo"
}
},
"classRow": {
"bloodPressure": "Presión arterial",
"diabetes": "Diabetes",
"hormone": "Hormonas",
"glp1": "Inyección de GLP-1",
"painRelief": "Dolor",
"allergy": "Alergia",
"vitamin": "Vitaminas",
"supplement": "Suplemento",
"antibiotic": "Antibiótico",
"other": "Otro"
},
"cadence": {
"daily": {
"label": "Diario",
"description": "Cada día a la misma hora."
},
"weekdays": {
"label": "Días concretos de la semana",
"description": "P. ej. lunes, miércoles, viernes."
},
"everyNWeeks": {
"label": "Cada pocas semanas",
"description": "P. ej. cada 2 semanas los jueves (GLP-1, biológicos)."
},
"monthly": {
"label": "Mensual",
"description": "Un día fijo cada mes (p. ej. siempre el 1)."
},
"rolling": {
"label": "Flexible desde la última dosis",
"description": "Deja abierta la próxima dosis. Cuando pulsas «tomada», el contador empieza de nuevo desde ese momento."
},
"oneShot": {
"label": "Dosis única",
"description": "Una sola administración, p. ej. una vacuna o un ciclo de antibiótico."
},
"asNeeded": {
"label": "Según necesidad",
"description": "Sin plan fijo: registra una toma cuando la necesites (p. ej. analgésicos)."
}
},
"summary": {
"title": "Resumen",
"cadence": {
"daily": "Cada día",
"weekdays": "En los días de la semana seleccionados",
"biweekly": "Cada dos semanas",
"monthly": "Mensual",
"quarterly": "Cada tres meses",
"yearly": "Una vez al año",
"rolling": "Cada {n} días desde tu última toma",
"oneShot": "Una dosis única",
"asNeeded": "Según necesidad",
"everyNWeeks": "Cada {n} semanas",
"everyNMonths": "Cada {n} meses"
},
"weekdaysDetail": ", los {days}",
"dayOfMonthDetail": ", el día {day}.",
"times": "a las {times}",
"startsOn": "Empieza: {date}",
"endsOn": "Termina: {date}",
"noEndDate": "Sin fecha de fin"
},
"compose": {
"scheduleIndex": "Horario {n} de {total}",
"list": {
"add": "Añadir otro horario",
"edit": "Editar",
"remove": "Quitar",
"removeDisabled": "Se requiere al menos un horario.",
"empty": "Aún no hay horario."
}
},
"errors": {
"submitFailed": "No se pudo guardar el medicamento — inténtalo de nuevo."
}
},
"doseStrength": {
"title": "Dosis a lo largo del tiempo",
"axisLabel": "Dosis registrada ({unit})",
"tooltipLabel": "Dosis",
"currentDose": "Dosis actual: {dose} {unit}",
"noCurrentDose": "Aún no hay dosis registrada.",
"empty": "Aún no hay historial de titulación. Registra un cambio de dosis para ver la curva de dosis."
},
"injectionSiteBodyOutlineAriaLabel": "Silueta del cuerpo",
"injectionSitePickerAriaLabel": "Selector de sitio de inyección",
"injectionSiteRecommendedAriaLabel": "{site}: sitio siguiente recomendado",
"injectionSiteLegendAriaLabel": "Leyenda de marcadores",
"injectionSiteLegendRecommended": "Próximo sitio recomendado",
"injectionSiteLegendLastUsed": "Último sitio usado",
"siteAbdomenLeft": "Abdomen, inferior izquierdo",
"siteAbdomenRight": "Abdomen, inferior derecho",
"siteAbdomenUpperLeft": "Abdomen, superior izquierdo",
"siteAbdomenUpperRight": "Abdomen, superior derecho",
"siteThighLeft": "Muslo izquierdo",
"siteThighRight": "Muslo derecho",
"siteUpperArmLeft": "Brazo superior izquierdo",
"siteUpperArmRight": "Brazo superior derecho",
"sideEffectTagsHelp": "Toca un chip para añadirlo a las etiquetas de estado de ánimo.",
"sideEffectTagNausea": "Náuseas",
"sideEffectTagConstipation": "Estreñimiento",
"sideEffectTagDiarrhea": "Diarrea",
"sideEffectTagFatigue": "Fatiga",
"sideEffectTagAppetiteLoss": "Pérdida de apetito",
"sideEffectTagHeartburn": "Ardor de estómago",
"sideEffectTagHeadache": "Dolor de cabeza",
"newSchedule": "Nueva franja horaria",
"removeSchedule": "Quitar franja horaria",
"advancedEditing": "Edición avanzada",
"advancedEditingHide": "Ocultar edición avanzada",
"scheduleInterval": "Intervalo",
"scheduleEveryWeek": "cada semana",
"scheduleEveryNWeeks": "cada {n} semanas",
"scheduleIntervalPrefix": "Intervalo:",
"nextSchedulePrefix": "Próxima franja:",
"nextScheduleDaily": "a diario",
"importIntakesAction": "Importar tomas",
"apiEndpointAction": "Endpoint de API",
"pause": "Pausar",
"activate": "Activar",
"disableNotifications": "Desactivar notificaciones",
"enableNotifications": "Activar notificaciones",
"purgeRecords": "Eliminar registros",
"formReset": "Restablecer formulario",
"createMedication": "Crear medicamento",
"deleteConfirmDescription": "Este medicamento y todas sus tomas se eliminarán de forma permanente.",
"purgeConfirmTitle": "¿Eliminar todas las tomas?",
"purgeConfirmDescription": "Se eliminarán de forma permanente todas las tomas registradas para este medicamento.",
"saveError": "Error al guardar",
"deleteError": "Error al eliminar",
"purgeError": "Error al limpiar los registros",
"invalidTimestamp": "Selecciona una fecha y hora válidas.",
"noIntakesYet": "Aún no hay tomas registradas.",
"actions": "Acciones",
"pageInfo": "Página {page} de {total}",
"previousPage": "Página anterior",
"nextPage": "Página siguiente",
"loginRequiredIntakes": "Inicia sesión para ver el historial de tomas.",
"phaseConfig": "Fases de recordatorio",
"phaseConfigDescription": "Configura los momentos de los recordatorios.",
"phaseGreen": "Verde",
"phaseYellow": "Amarillo",
"phaseOrange": "Naranja",
"phaseRed": "Rojo",
"phaseMinutes": "Mín",
"phasePercent": "%",
"phaseBeforeEnd": "antes del final",
"phaseAfterEnd": "después del final",
"phaseResetDefaults": "Restablecer valores por defecto",
"phaseSaved": "Fases de recordatorio guardadas",
"phaseReset": "Restablecidas a valores por defecto",
"sourceWeb": "Web",
"sourceApi": "App de iOS",
"sourceReminder": "Recordatorio",
"sourceImport": "Importación",
"intakeSourceVia": "vía {origin}",
"intakeHistoryEmptyTitle": "Aún no hay tomas",
"intakeHistoryEmptyDescription": "En cuanto registres una toma, aparecerá aquí con la hora y la fuente.",
"intakeHistoryEmptyAction": "Registrar toma",
"intakeHistoryColTaken": "Tomada",
"intakeHistoryColScheduled": "Programada",
"intakeHistoryColStatus": "Estado",
"intakeHistoryColSource": "Fuente",
"intakeHistoryStatusTaken": "Tomada",
"intakeHistoryStatusSkipped": "Omitida",
"intakeHistorySortByTaken": "Ordenar por hora de toma",
"intakeHistorySortByScheduled": "Ordenar por hora programada",
"intakeHistoryPageInfo": "Página {page} de {total} · {count} entradas",
"intakeHistoryPrev": "Anterior",
"intakeHistoryNext": "Siguiente",
"unitDrops": "gotas",
"unitTablets": "comprimidos",
"unitCapsules": "cápsulas",
"unitPieces": "unidades",
"namePlaceholder": "p. ej. Ramipril",
"dosePlaceholder": "p. ej. 5 mg",
"labelPlaceholder": "p. ej. Por la mañana",
"defaultDose": "Dosis estándar",
"dayDeactivate": "Desactivar {day}",
"dayActivate": "Activar {day}",
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatida"
},
"semaglutide": {
"name": "Semaglutida"
},
"liraglutide": {
"name": "Liraglutida"
},
"dulaglutide": {
"name": "Dulaglutida"
},
"exenatide": {
"name": "Exenatida"
}
}
},
"researchMode": {
"dialog": {
"title": "Activar el modo Investigación",
"intro": "El modo Investigación añade un gráfico estimado del nivel de fármaco a tu página de GLP-1. Lee el límite a continuación antes de activarlo: el gráfico es una ayuda de aprendizaje, nunca una medición, nunca un consejo médico.",
"whatItIsHeader": "Qué es esto",
"whatItIs": "Una curva en diente de sierra que simula la superposición de tus dosis registradas a lo largo del tiempo, usando el modelo de Bateman de un compartimento con los parámetros de absorción y semivida publicados en el EPAR de la EMA de cada agonista GLP-1 aprobado. El eje vertical es adimensional y sin etiquetas. La forma, no el número, es lo que muestra el gráfico.",
"whatItIsntHeader": "Qué no es",
"whatItIsnt": "No es un nivel en sangre. No es una medición. No es una predicción de cómo responde realmente tu cuerpo. No es base para ninguna decisión de dosis, tiempo o escalado. Para cualquier cosa que afecte cómo tomas tu medicación, habla con tu médico prescriptor.",
"whyEstimateHeader": "Por qué es una estimación",
"whyEstimate": "La farmacocinética poblacional describe al paciente típico. La variación individual es grande: el modelo Schneck/Urva 2024 de tirzepatida reporta aproximadamente un 22 % de variabilidad interindividual en la absorción y aproximadamente un 49 % en el volumen de distribución. Una curva de manual no puede capturar tu peso, tu función renal, tu técnica de inyección ni la precisión de tus horarios. Lee la curva como el ritmo de tu dosificación, no como tu nivel.",
"mdrBoundaryHeader": "Límite regulatorio",
"mdrBoundary": "HealthLog muestra datos regulatorios públicos y tus propios registros. La aplicación no predice, no diagnostica, no trata y no recomienda ninguna terapia. El Reglamento UE 2017/745 (Medical Device Regulation, MDR) y el documento de orientación MDCG 2021-24 trazan la línea con el software que interpreta datos con fines médicos: este gráfico se queda decididamente del lado educativo de esa línea. Si en algún momento sientes que te empuja hacia una decisión clínica, ciérralo.",
"citationsHeader": "Fuentes",
"citations": "European Public Assessment Reports de la EMA para Mounjaro, Ozempic, Wegovy, Saxenda, Trulicity, Byetta y Bydureon (Sección 5.2). Schneck K, Urva S. Population pharmacokinetics of the GIP/GLP receptor agonist tirzepatide. CPT Pharmacometrics Syst Pharmacol 2024;13(3):494-503 (DOI 10.1002/psp4.13099).",
"versionLine": "Versión del disclaimer: {version}",
"acknowledgeCta": "Entiendo — activar",
"cancelCta": "Cancelar",
"successToast": "Modo Investigación activado. La curva de nivel de fármaco es ahora visible en tu página de GLP-1.",
"errorToast": "No se pudo activar el modo Investigación. Inténtalo de nuevo.",
"staleVersionToast": "El disclaimer se actualizó desde que cargó esta página. Recarga para leer la versión actual."
},
"chart": {
"title": "Nivel de fármaco estimado",
"axisLabel": "Nivel estimado (relativo)",
"emptyState": "Sin tomas registradas todavía.",
"emptyStateCta": "Registra una dosis para ver la curva estimada cobrar forma.",
"estimateNote": "Estimación educativa a partir de la farmacocinética poblacional publicada por la EMA. No es una medición.",
"unknownDrug": "{name} no está en el catálogo de GLP-1 aprobado por la EMA, por lo que HealthLog no puede trazar una curva de farmacocinética poblacional."
}
},
"detail": {
"status": {
"active": "Activo",
"paused": "Pausado",
"ended": "Finalizado"
},
"cadence": {
"oneShotOn": "Dosis única el {date}.",
"oneShotPending": "Dosis única pendiente.",
"asNeeded": "Según necesidad — sin plan fijo."
},
"intake": {
"title": "Historial de tomas",
"importButton": "Importar",
"rowActions": {
"openMenu": "Abrir acciones de la fila",
"edit": "Editar",
"delete": "Eliminar"
},
"selection": {
"rowToggleLabel": "Seleccionar fila"
},
"bulkDelete": {
"selectionCount": "{count} entradas seleccionadas",
"deleteButton": "Eliminar selección",
"cancelButton": "Cancelar",
"confirmTitle": "¿Eliminar las entradas seleccionadas?",
"confirmBody": "Se eliminarán {count} entradas de forma permanente. El medicamento se conserva.",
"confirmAction": "Eliminar",
"toast": "Selección eliminada",
"failed": "No se pudo eliminar la selección."
},
"edit": {
"dialogTitle": "Editar toma",
"takenAtLabel": "Tomada a las",
"scheduledForHint": "Programada: {dateTime}",
"farFromScheduledWarning": "Está muy lejos de la hora programada; comprueba la fecha.",
"skippedLabel": "Omitida",
"save": "Guardar",
"cancel": "Cancelar",
"savedToast": "Toma actualizada",
"failed": "No se pudo actualizar la toma."
},
"deleteRow": {
"confirmTitle": "¿Eliminar esta toma?",
"confirmBody": "La entrada se elimina de forma permanente.",
"confirmAction": "Eliminar",
"toast": "Toma eliminada",
"failed": "No se pudo eliminar la toma."
}
},
"verlauf": {
"loading": "Cargando historial …",
"loadError": "No se pudo cargar el historial.",
"empty": "Aún no hay tomas en este periodo.",
"summaryEmpty": "Aún no hay dosis que evaluar.",
"adherenceLabel": "Adherencia",
"adherenceBarLabel": "{onTime} a tiempo, {late} con retraso, {missed} omitidas",
"add": "Entrada",
"markTaken": "Tomada",
"markSkipped": "Saltada",
"rowActionsLabel": "Acciones para {time}",
"markAsTaken": "Marcar como tomada",
"markAsSkipped": "Marcar como omitida",
"adHocTag": "fuera de horario",
"takenDetail": "prevista {planned} · tomada {taken}",
"doseTaken": "Dosis: {dose}",
"status": {
"taken_on_time": "a tiempo",
"taken_late": "con retraso",
"skipped": "saltada",
"missed": "perdida",
"upcoming": "pendiente",
"ad_hoc": "fuera de horario"
},
"addDialog": {
"title": "Añadir toma",
"description": "Registra una dosis, también retroactiva o fuera de horario.",
"takenAtLabel": "Tomada a las",
"skippedLabel": "Saltada",
"nudgeHint": "Cerca del horario {slot}: al guardar te preguntamos si asignarla.",
"cancel": "Cancelar",
"submit": "Guardar"
},
"nudge": {
"title": "¿Asignar a este horario?",
"body": "Esta toma queda justo fuera de la ventana de {slot}. ¿Asignarla a ese horario o guardarla como entrada fuera de horario?",
"keepAdHoc": "Fuera de horario",
"pin": "Asignar"
},
"pin": {
"action": "Asignar al horario de las {time}",
"release": "Quitar asignación",
"pinnedTag": "asignada",
"pinnedToast": "Toma asignada al horario",
"unpinnedToast": "Asignación quitada",
"dueContext": "prevista: {time} ({delta})",
"confirmTitle": "¿Asignar al horario de las {time}?",
"confirmBody": "La toma contará como tomada con retraso para este horario; el porcentaje no se maquilla. Puedes quitar la asignación en cualquier momento.",
"confirmCancel": "Cancelar",
"confirmAction": "Asignar"
}
},
"notifications": {
"title": "Recordatorios",
"switchLabel": "Enviar un recordatorio cuando toque esta dosis",
"helperOn": "Los recordatorios están activados.",
"helperOff": "Los recordatorios están desactivados.",
"enabledToast": "Recordatorios activados",
"disabledToast": "Recordatorios desactivados",
"toggleFailed": "No se pudo cambiar el ajuste de recordatorios.",
"clientManagedChip": "Tu iPhone gestiona los recordatorios de este medicamento."
},
"settings": {
"title": "Ajustes",
"phases": {
"openButton": "Configurar fases",
"requiresCourseWindow": "Las fases están disponibles una vez fijado un periodo de tratamiento."
},
"grace": {
"label": "Ventana de recordatorio",
"appliesToAllNote": "Se aplica a todos los horarios de este medicamento.",
"unit": "minutos",
"saved": "Ventana de recordatorio guardada",
"failed": "No se pudo guardar la ventana de recordatorio."
},
"codes": {
"label": "Códigos clínicos (ATC / RxNorm)",
"note": "Opcional. Se usan en la exportación FHIR del historial de salud. Los códigos se toman tal cual se introducen — nunca se adivinan.",
"atcLabel": "ATC",
"rxNormLabel": "RxNorm",
"saved": "Códigos clínicos guardados",
"failed": "No se pudieron guardar los códigos clínicos."
}
},
"zone": {
"title": "Gestión y zona de peligro",
"pause": {
"title": "Pausar",
"helper": "Pausa los recordatorios hasta que los reactives. El historial se conserva.",
"pausedToast": "Recordatorios pausados",
"resumedToast": "Recordatorios reanudados",
"failed": "No se pudo cambiar el estado de pausa."
},
"end": {
"title": "Finalizar medicamento",
"helper": "Detiene los recordatorios y marca el medicamento como finalizado. El historial sigue siendo visible.",
"button": "Finalizar",
"dialogTitle": "Finalizar {name} — detiene los recordatorios, el historial sigue visible",
"dialogBody": "No habrá más recordatorios. Las entradas antiguas permanecen en la línea de tiempo.",
"toast": "Medicamento finalizado",
"failed": "No se pudo finalizar el medicamento."
},
"purge": {
"title": "Eliminar historial",
"helper": "Hay {count} tomas registradas para este medicamento.",
"button": "Eliminar historial",
"dialogTitle": "¿Eliminar realmente el historial?",
"dialogBody": "Las {count} tomas se eliminarán de forma permanente. El medicamento se conserva.",
"toast": "Historial eliminado",
"failed": "No se pudo eliminar el historial."
},
"delete": {
"title": "Eliminar medicamento",
"helper": "Elimina el medicamento y todos los registros relacionados.",
"button": "Eliminar",
"dialogTitle": "¿Eliminar {name}?",
"dialogBody": "El medicamento, sus horarios, el historial de tomas, los tokens de API, la configuración de fases y los recordatorios se eliminarán de forma permanente.",
"toast": "Medicamento eliminado",
"failed": "No se pudo eliminar el medicamento."
}
},
"phases": {
"modeLabel": "Modo de {phase}",
"saveFailed": "No se pudieron guardar las fases de recordatorio."
},
"api": {
"caption": "Endpoint para «{name}»",
"copyUrl": "Copiar URL",
"urlCopied": "URL copiada",
"mintToken": "Generar token",
"mintAnotherToken": "Generar otro token",
"mintFailed": "No se pudo generar un token.",
"copyFailed": "No se pudo copiar.",
"tokenCopied": "Token copiado",
"copyToken": "Copiar token",
"mintedHint": "Copia este token ahora — solo se muestra una vez."
},
"edit": {
"planOption": "Editar plan",
"advancedOption": "Ajustes avanzados"
},
"advanced": {
"title": "Ajustes avanzados",
"group": {
"data": "Datos",
"lifecycle": "Ciclo de vida",
"externalApi": "API externa"
},
"dataPortability": {
"import": {
"title": "Importar tomas",
"helper": "Carga tomas anteriores desde un archivo JSON o JSON pegado.",
"button": "Importar JSON"
},
"export": {
"title": "Exportar medicamento",
"helper": "Descarga este medicamento como archivo CSV.",
"includeIntake": "Incluir historial de tomas",
"button": "Exportar CSV"
}
}
},
"header": {
"historyLabel": "Ver historial de tomas"
},
"history": {
"back": "Volver al medicamento",
"subtitle": "Historial completo de tomas",
"plannedSuffix": "planificado"
},
"tabs": {
"uebersicht": "Resumen",
"zeitplan": "Horario",
"bestand": "Existencias",
"verlauf": "Historial",
"injektion": "Inyección",
"api": "API",
"erweitert": "Avanzado"
},
"shell": {
"loadFailed": "No se pudo cargar este medicamento.",
"tablistLabel": "Secciones de detalle del medicamento"
},
"uebersicht": {
"statusTitle": "Estado",
"nextDoseLabel": "Próxima dosis",
"nextDoseNone": "No hay dosis pendiente.",
"nextDoseAsNeeded": "Según necesidad — sin dosis programada.",
"pausedHint": "En pausa — sin recordatorios.",
"reminderLabel": "Recordatorio",
"reminderOn": "Activado",
"reminderOff": "Desactivado",
"supplyLabel": "Existencias",
"supplyRunway": "Alcanza para unos {days} días más",
"jumpToZeitplan": "Ver horario",
"jumpToVerlauf": "Ver historial",
"jumpToBestand": "Ver existencias",
"complianceTitle": "Adherencia",
"complianceEmpty": "Aún no hay datos de adherencia."
},
"bestand": {
"title": "Existencias",
"summary": "{remaining} de {total} dosis restantes",
"itemsTitle": "Envases y recipientes",
"doses": "{remaining} / {total} dosis",
"state": {
"ACTIVE": "Sin abrir",
"IN_USE": "En uso",
"EXPIRED": "Caducado",
"USED_UP": "Agotado"
},
"empty": "No hay existencias registradas.",
"emptyHelper": "Registra un envase o recipiente para hacer seguimiento de las existencias restantes y la autonomía.",
"emptyCta": "Registrar un envase",
"addButton": "Registrar",
"lowStockLinkOn": "Aviso de reserva baja: por debajo de {days} días",
"lowStockLinkOff": "Aviso de reserva baja: desactivado",
"addTitle": "Registrar un envase o recipiente",
"addDescription": "Registra una nueva existencia con su número de unidades; la fecha de caducidad es opcional.",
"addQuantityLabel": "Cantidad (unidades)",
"addQuantityHelper": "1–1000 unidades por envase o recipiente.",
"addExpiryLabel": "Fecha de caducidad (opcional)",
"addSubmit": "Registrar",
"addSuccess": "Existencias registradas.",
"addFailed": "No se pudieron registrar las existencias.",
"adjustButton": "Ajustar",
"adjustTitle": "Corregir existencias",
"adjustDescription": "Establece las unidades restantes — para correcciones o una retirada. 0 marca el envase como agotado.",
"adjustQuantityLabel": "Unidades restantes",
"adjustHelper": "Capacidad: {total} unidades.",
"adjustSubmit": "Guardar",
"adjustSuccess": "Existencias actualizadas.",
"adjustFailed": "No se pudieron actualizar las existencias.",
"deleteTitle": "¿Eliminar envase?",
"deleteDescription": "Elimina permanentemente este envase o recipiente de las existencias. Las tomas registradas no cambian.",
"deleteSuccess": "Entrada de existencias eliminada.",
"deleteFailed": "No se pudo eliminar la entrada de existencias.",
"containerTypeLabel": "Tipo de envase",
"containerType": {
"PEN": "Pluma",
"AMPOULE": "Ampolla",
"BLISTER": "Envase de comprimidos",
"INHALER": "Inhalador",
"BOTTLE": "Frasco",
"OTHER": "Otro"
},
"unitsDetail": "{remaining} / {total} unidades",
"quantityModeDoses": "Dosis",
"quantityModeUnits": "Unidades",
"quantityInUnits": "= {units} unidades",
"quantityInDoses": "≈ {doses} dosis",
"quantityUnderOneDose": "< 1 dosis",
"expiredSuffix": "+ {units} unidades caducadas",
"packagingTitle": "Envase y dosis",
"packagingUnitsPerDose": "1 dosis = {units} unidades",
"packagingDefaultPack": "Tamaño de envase predeterminado: {units} unidades",
"packagingNoDefaultPack": "Sin tamaño de envase predeterminado",
"packagingEdit": "Editar",
"packagingDescription": "Define cuántas unidades consume una dosis y el tamaño habitual de un envase nuevo, p. ej. tras un cambio de fabricante con otro tamaño de blíster.",
"packagingUnitsPerDoseLabel": "Unidades por dosis",
"packagingUnitsPerDoseHelper": "P. ej. dos comprimidos de 2 mg para una dosis de 4 mg (1–100). Las tomas ya registradas no cambian.",
"packagingDefaultPackLabel": "Tamaño de envase predeterminado (unidades)",
"packagingDefaultPackHelper": "Rellena la cantidad al registrar envases nuevos (1–1000). Déjalo vacío si no aplica.",
"packagingSuccess": "Datos del envase guardados",
"packagingFailed": "Error al guardar"
},
"erweitert": {
"group": {
"lifecycle": "Ciclo de vida",
"externalApi": "API externa",
"data": "Datos",
"danger": "Zona de peligro"
},
"editor": {
"title": "Editar el medicamento en el editor",
"helper": "Cambia el nombre, la clase de tratamiento, la frecuencia y los horarios en el editor paso a paso.",
"button": "Abrir editor"
}
},
"zeitplan": {
"title": "Horario",
"timesTitle": "Horas de toma",
"timesNote": "Ajusta la hora y la ventana puntual de cada dosis. La frecuencia (diaria, semanal…) se cambia en el editor, en Avanzado.",
"scheduleLabel": "Horario {index}",
"fullEditNote": "La frecuencia, la clase de tratamiento y la ventana del curso se editan en el editor, en Avanzado → Ciclo de vida.",
"graceEcho": "Ventana de recordatorio: {minutes} minutos",
"reminderTitle": "Recordatorio",
"manageChannels": "Gestionar canales de notificación",
"history": {
"title": "Historial del plan",
"currentSince": "Plan actual desde {date}",
"noTimes": "Sin horas fijas",
"manualChip": "Añadida manualmente",
"showErasOne": "Mostrar 1 etapa anterior",
"showErasOther": "Mostrar {count} etapas anteriores",
"hideEras": "Ocultar etapas anteriores",
"addEra": "Añadir etapa anterior",
"addEraTitle": "Añadir etapa anterior",
"addEraDescription": "Registra a qué horas se tomaba antes este medicamento, por ejemplo antes de ajustarlo aquí.",
"editAria": "Editar etapa",
"editEraTitle": "Editar etapa",
"editEraDescription": "Ajusta las horas de toma y el periodo de esta etapa.",
"archivedEditHint": "Esta etapa se registró automáticamente: tu cambio corrige el historial registrado; el original se conserva internamente como constancia.",
"updatedToast": "Etapa actualizada",
"updateError": "No se pudo actualizar la etapa. No debe solaparse con otras etapas y debe terminar antes del plan actual.",
"timesLabel": "Horas de toma",
"fromLabel": "Desde",
"untilLabel": "Hasta",
"untilHint": "«Hasta» es el día en que empezó a regir el plan siguiente (exclusivo).",
"validationTimes": "Indica al menos una hora.",
"validationRangeMissing": "Indica las fechas de inicio y fin.",
"validationRangeOrder": "La fecha de inicio debe ser anterior a la fecha de fin.",
"cancel": "Cancelar",
"submit": "Guardar etapa",
"createdToast": "Etapa anterior guardada",
"createError": "No se pudo guardar la etapa. No debe solaparse con etapas existentes y debe terminar antes del plan actual.",
"deletedToast": "Etapa eliminada",
"deleteError": "No se pudo eliminar la etapa",
"deleteAria": "Eliminar etapa",
"deleteConfirmTitle": "¿Eliminar la etapa?",
"deleteConfirmBody": "El historial y la adherencia de este período volverán a calcularse con el plan actual.",
"deleteConfirmAction": "Eliminar",
"loadError": "No se pudo cargar el historial del plan"
},
"save": "Guardar horario",
"saved": "Horario guardado",
"failed": "No se pudo guardar el horario",
"window": {
"intro": "Para cada dosis, define cuándo una toma sigue siendo puntual: una hora exacta (±1h) o tu propia ventana como 07:00–09:00.",
"explicitToggle": "Ventana propia",
"startLabel": "Inicio de la ventana",
"endLabel": "Fin de la ventana",
"onTimeBand": "Puntual: {start}–{end}",
"lateUntil": "con retraso hasta las {time}",
"lateDays": "con retraso hasta {days} días después",
"orderError": "El inicio debe ser anterior al fin.",
"noTimes": "Aún no hay horas de toma definidas."
}
}
},
"logInjectionSiteTitle": "Registrar sitio de inyección",
"logInjectionSiteDescription": "¿Dónde te inyectaste {name}? Opcional: puedes omitirlo.",
"logInjectionSiteSkip": "Omitir",
"logInjectionSiteConfirm": "Guardar sitio",
"logInjectionSiteNoneAvailable": "No hay ningún sitio de inyección disponible: todos los sitios están excluidos en tu configuración.",
"logInjectionSiteSaveFailed": "No se pudo guardar el sitio de inyección. Inténtalo de nuevo.",
"trackInjectionSitesToggle": "Registrar sitios de inyección",
"trackInjectionSitesHint": "Tras administrar una dosis, pregunta qué sitio se usó y sugiere la siguiente rotación.",
"allowedSitesLabel": "Sitios permitidos",
"allowedSitesHint": "Deja todos seleccionados para no aplicar restricciones. Los sitios que excluiste globalmente nunca se ofrecen.",
"viewToggleLabel": "Vista",
"viewToggleHint": "Elige si tus medicamentos se muestran como tarjetas o como tabla.",
"viewCards": "Vista de tarjetas",
"viewTable": "Vista de tabla",
"viewSaveFailed": "No se pudo guardar la vista",
"tableCaption": "Medicamentos en tabla con estado, próxima toma, adherencia y existencias",
"tableColName": "Nombre",
"tableColStatus": "Estado",
"tableColNextDose": "Próxima toma",
"tableColCompliance": "Adherencia",
"tableColStock": "Existencias",
"tableColActions": "Acciones",
"tableSortBy": "Ordenar por {column}",
"tableComplianceDays": "{days} d",
"tableStockDoseOne": "1 dosis",
"tableStockDoses": "{count} dosis",
"tableStockRunway": "≈ {days} días restantes",
"cardLowStockRunway": "Reserva: ≈ {days} días",
"takeActionFor": "Tomar – {name}",
"skipActionFor": "Omitir – {name}",
"reorderTitle": "Ajustar orden",
"reorderDescription": "Define el orden de tus medicamentos: se aplica a la vista de tarjetas y a la de tabla.",
"reorderSaved": "Orden guardado",
"reorderSaveFailed": "No se pudo guardar el orden",
"customize": "Personalizar medicamentos"
},
"charts": {
"loadingLabel": "Cargando la gráfica…",
"loadingSlowHint": "Calculando los análisis — puede tardar un momento.",
"weight": "Peso",
"bloodPressure": "Tensión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"sleep": "Sueño",
"steps": "Pasos",
"hrv": "VFC",
"restingHeartRate": "FC en reposo",
"activeEnergy": "Energía activa",
"flights": "Pisos subidos",
"distance": "Distancia a pie + corriendo",
"vo2Max": "VO₂ máx",
"bodyTemperature": "Temperatura corporal",
"noData": "Sin datos en el periodo seleccionado",
"bucketWeekly": "Media semanal",
"bucketMonthly": "Media mensual",
"points7Label": "7 ptos",
"points7Title": "Últimos 7 puntos",
"points30Label": "30 ptos",
"points30Title": "Últimos 30 puntos",
"points90Label": "90 ptos",
"points90Title": "Últimos 90 puntos",
"pointsAllLabel": "Todos",
"pointsAllTitle": "Todos los puntos disponibles",
"systolic": "Sistólica",
"diastolic": "Diastólica",
"bodyWater": "Agua corporal",
"boneMass": "Masa ósea",
"spo2": "SpO₂",
"movingAverage7d": "Tendencia 7 días",
"avg7dShort": "7D",
"avg30dShort": "30D",
"trend7dShort": "Tendencia 7 días",
"trend": "Tendencia",
"perWeek": "/semana",
"totalDelta": "Total",
"colorGreen": "Verde:",
"colorOrange": "Naranja:",
"colorRed": "Rojo:",
"mood": "Estado de ánimo",
"moodScore": "Puntuación de ánimo",
"weekdays": {
"mon": "Lun",
"wed": "Mié",
"fri": "Vie",
"sun": "Dom"
},
"months": {
"jan": "Ene",
"feb": "Feb",
"mar": "Mar",
"apr": "Abr",
"may": "May",
"jun": "Jun",
"jul": "Jul",
"aug": "Ago",
"sep": "Sep",
"oct": "Oct",
"nov": "Nov",
"dec": "Dic"
},
"heatmapOnTime": "a tiempo",
"heatmapLate": "tarde",
"heatmapVeryLate": "muy tarde",
"legendOnTime": "A tiempo",
"legendLate": "Tarde",
"legendVeryLate": "Muy tarde",
"legendMissed": "Omitida",
"emptyStateTitle": "Registra más mediciones para ver tendencias",
"emptyStateDescription": "Registra al menos 3 entradas para desbloquear la línea de tendencia.",
"needMoreDistinctDaysTitle": "Se necesitan más días distintos",
"needMoreDistinctDaysDescription": "Registra en más días para desbloquear la línea de tendencia.",
"noDataInRangeTitle": "Sin datos en este rango",
"noDataInRangeDescription": "No hay mediciones en el rango seleccionado. Cambia el rango o registra una nueva medición.",
"errorTitle": "No se pudieron cargar los datos",
"loadErrorTitle": "No se pudo cargar el gráfico",
"loadErrorReload": "Recargar",
"sparseDataCaption": "Más días completarán la tendencia.",
"personalBaseline": "Tu media",
"deltaVsBaseline": "{delta} vs. tu media",
"deltaUnchanged": "coincide con tu media",
"deltaVsTarget": "{delta} vs. objetivo",
"weekdaysFull": {
"mon": "Lunes",
"tue": "Martes",
"wed": "Miércoles",
"thu": "Jueves",
"fri": "Viernes",
"sat": "Sábado",
"sun": "Domingo"
},
"rangeBand": "Rango"
},
"chart": {
"overlay": {
"controls": {
"title": "Capas de la gráfica",
"trendIndicator": "Tendencia 7 días",
"trendArrow": "Flecha de tendencia",
"targetRange": "Rango objetivo",
"comparisonBaseline": "Comparación",
"comparisonUnavailable": "Sin periodo anterior disponible",
"tooltip": {
"openSettings": "Ajustes de capas de gráfica"
}
}
}
},
"comparison": {
"toggleLabel": "Comparar con",
"toggleHint": "Compara el periodo actual con el mismo periodo del año anterior.",
"baseline": {
"none": "Desactivado",
"lastMonth": "Mes anterior",
"lastYear": "Año anterior"
},
"captionLastMonth": "vs. mes anterior",
"captionLastYear": "vs. año anterior",
"deltaVs": {
"lastMonth": "{delta} vs. mes anterior",
"lastYear": "{delta} vs. año anterior"
},
"tooltipPrior": "Periodo anterior",
"unavailable": {
"lastMonth": "Comparación no disponible — sin datos del mes anterior",
"lastYear": "Comparación no disponible — sin datos del año anterior"
},
"notAvailableForCompliance": "Comparación no disponible para el cumplimiento"
},
"insights": {
"noAnalysisYet": "Aún no hay valoración.",
"assessmentPreparing": "Preparando tu valoración…",
"emptyTitle": "Aún no hay datos suficientes",
"emptyDescription": "Los insights aparecen en cuanto registres algunas mediciones. Empieza por peso o tensión arterial.",
"emptyAddMeasurement": "Registrar medición",
"editMode": {
"open": "Personalizar",
"done": "Listo",
"reset": "Restablecer",
"title": "Personalizar resumen",
"description": "Arrastra para reordenar, toca el ojo para mostrar u ocultar.",
"dragHandle": "Arrastra para reordenar",
"show": "Mostrar",
"hide": "Ocultar",
"manageInSettings": "Gestionar pestañas y páginas de detalle en los ajustes",
"groupSleep": "Sueño",
"groupMood": "Estado de ánimo",
"groupEvents": "Eventos",
"gatedHint": "Aparece cuando haya datos o la función esté disponible",
"allHiddenHint": "Todas las secciones están ocultas. Muestra al menos una para ver tu resumen.",
"saveSuccess": "Resumen guardado",
"saveError": "No se pudo guardar tu resumen",
"resetSuccess": "Resumen restablecido a los valores predeterminados",
"emptyTitle": "Todas las tarjetas están ocultas",
"emptyDescription": "Has ocultado todas las secciones. Abre Personalizar para volver a mostrarlas."
},
"bmiEmptyTitle": "Añade tu altura para calcular el IMC",
"bmiEmptyDescription": "El IMC necesita tu altura. Guárdala en Ajustes → Cuenta.",
"bmiEmptyAction": "Abrir ajustes de cuenta",
"noProviderConfigured": "Valoración no disponible.",
"startAnalysis": "Iniciar valoración",
"refreshAnalysis": "Actualizar valoración",
"keyTakeaway": "Lo más importante",
"findingsTitle": "Hallazgos",
"heroFindingPositive": "Hallazgo principal",
"heroFindingNeutral": "Hallazgo principal",
"heroFindingAttention": "A tener en cuenta",
"heroFindingWarning": "Alerta principal",
"correlationsTitle": "Correlaciones",
"recommendationsTitle": "Recomendaciones",
"personalRecord": {
"badge": "PR",
"tooltip": "Récord personal: {value} {unit} el {date}"
},
"recommendation": {
"source": "Fuente",
"viewSource": "Abrir guía en una pestaña nueva",
"rationale": "Por qué esta recomendación",
"rationaleWindow": "Ventana",
"rationaleComparedTo": "Comparado con",
"rationaleDeviation": "Desviación",
"rationaleExpand": "Mostrar justificación",
"rationaleCollapse": "Ocultar justificación",
"legacyPayloadCta": "Insights actualizados — vuelve a generar para activar las nuevas explicaciones",
"feedbackHelpful": "Útil",
"feedbackNotHelpful": "No útil",
"feedbackThanks": "Gracias por tu opinión",
"feedbackConfirmed": "Opinión guardada",
"feedbackAlreadyRated": "Ya valorado",
"feedbackError": "No se pudo guardar tu opinión. Inténtalo de nuevo.",
"confidence": "Confianza",
"confidenceAria": "Confianza: {value} de 100",
"confidenceHigh": "Confianza alta",
"confidenceMedium": "Confianza media",
"confidenceLow": "Confianza baja — pocos datos",
"confidenceDraft": "Borrador"
},
"dataFoundation": "Base de datos",
"dataGaps": "Vacíos de datos:",
"lastUpdated": "Última actualización",
"confidenceHoch": "Alta",
"confidenceMittel": "Media",
"confidenceGering": "Baja",
"loadError": "No se han podido cargar los análisis",
"heroGenerated": "Generado {time}",
"heroPersonalBaseline": "Basado en tus últimos 90 días",
"heroRegenerate": "Regenerar",
"heroRegenerating": "Generando",
"regenerateAnalysis": "Volver a generar la valoración",
"regenerateSuccess": "Valoración regenerada",
"warmStarted": "Las valoraciones se están preparando en segundo plano",
"narrativeTitle": "Resumen",
"narrativeWeek": "Esta semana",
"narrativeMonth": "Este mes",
"narrativePreparing": "Preparando tu resumen…",
"narrativeUpdating": "Actualizando…",
"narrativeUpdated": "Actualizado {time}",
"narrativeProvenanceLabel": "Cómo se elaboró esto",
"narrativeProvenanceMethod": "Un resumen del período en lenguaje sencillo, basado únicamente en tus valores registrados y en las asociaciones que superaron el control estadístico de comparaciones múltiples. Descriptivo, nunca una causa.",
"narrativeProvenanceMetrics": "Basado en: {metrics}",
"narrativeProvenanceWindow": "Ventana: del {from} al {to}",
"heroFallbackSubtitle": "Una mirada diaria a tus tendencias — directamente de los datos que registras.",
"heroGreetingMorning": "Buenos días",
"heroGreetingAfternoon": "Buenas tardes",
"heroGreetingEvening": "Buenas noches",
"heroComingSoonTooltip": "Próximamente",
"heroActionAskCoach": "Preguntar al coach",
"healthScore": {
"label": "Puntuación de salud",
"progressAria": "Progreso de la puntuación de salud",
"deltaVsLastWeek": "{delta} respecto a la semana anterior",
"deltaUnavailable": "Aún no hay historial — vuelve la semana que viene.",
"componentBp": "PA",
"componentWeight": "Peso",
"componentMood": "Estado de ánimo",
"componentCompliance": "Cumplimiento",
"disclaimer": "Orientación — no es valoración médica.",
"deltaExplainer": {
"trigger": "¿Qué significa este cambio?",
"title": "Cómo se calcula el cambio",
"description": "Cambio respecto a la semana pasada: {delta}",
"body": "La puntuación combina PA, peso, ánimo y adherencia. Comparamos la puntuación de hoy con la del mismo momento de la semana anterior. Registra una medición nueva o una nota de ánimo para empujarla hacia arriba."
},
"provenance": {
"toggle": "Compuesto por",
"weightLabel": "peso",
"mixedBanner": "Algunos componentes combinan varias fuentes. El desglose muestra el valor más reciente por componente.",
"footnote": "Los pesos se reescalan según los datos realmente disponibles.",
"asOfLabel": "a fecha de {date}",
"provisional": "Provisional — sólo {count} de {total} entradas disponibles",
"provisionalBadge": "Provisional",
"sourceAria": "Fuente: {source}",
"sources": {
"manual": "Manual",
"withings": "Withings",
"appleHealth": "Apple Health",
"mixed": "Mixto",
"none": "Sin datos"
}
}
},
"suggestedPrompts": {
"label": "Pregúntame",
"tellMyDoctor": "¿Qué debería contarle a mi médico?",
"medicationWorking": "¿Está funcionando mi medicamento?"
},
"dailyBriefing": {
"title": "Resumen del día",
"keyFindingsTitle": "Hallazgos clave",
"emptyTitle": "Aún no hay resumen",
"emptyDescription": "Genera el resumen de hoy para tener una vista rápida de tus tendencias.",
"emptyAction": "Generar resumen",
"loadingLabel": "Preparando el resumen",
"noProviderTitle": "Ningún proveedor de IA conectado",
"noProviderDescription": "Conecta un proveedor de IA en los ajustes para recibir resúmenes diarios.",
"noProviderAction": "Abrir ajustes de IA"
},
"trendsRow": {
"title": "Tendencias",
"subtitle": "Los últimos 30 días de un vistazo",
"caption": {
"bp": "Valores sistólicos y diastólicos de los últimos 30 días.",
"weight": "Evolución del peso corporal de los últimos 30 días.",
"pulse": "Pulso en reposo de los últimos 30 días.",
"mood": "Puntuación diaria del estado de ánimo de los últimos 30 días.",
"sleep": "Duración del sueño nocturno de los últimos 30 días.",
"steps": "Recuento diario de pasos de los últimos 30 días.",
"hrv": "Variabilidad de la frecuencia cardíaca de los últimos 30 días.",
"resting_hr": "Frecuencia cardíaca en reposo de los últimos 30 días.",
"active_energy": "Energía activa quemada en los últimos 30 días.",
"flights": "Pisos subidos en los últimos 30 días.",
"distance": "Distancia caminando y corriendo de los últimos 30 días.",
"vo2_max": "VO₂ máx de los últimos 30 días.",
"body_temp": "Temperatura corporal de los últimos 30 días."
}
},
"vo2Max": {
"statLatest": "Actual",
"statMin": "Mín",
"statMax": "Máx",
"empty": "Aún no hay datos de VO₂ máx — sincroniza Apple Health para llenar esta vista.",
"cardioLinkTitle": "Forma cardiovascular (VO₂ máx)",
"cardioLinkBody": "El VO₂ máx es la medida principal de la forma aeróbica. El gráfico completo y la evaluación están en su propia página.",
"cardioLinkCta": "Abrir forma cardiovascular"
},
"trendAnnotation": {
"emptyBp": "Necesitamos más datos para comentar esta tendencia.",
"emptyWeight": "Necesitamos más datos para comentar esta tendencia.",
"emptyMood": "Necesitamos más datos para comentar esta tendencia.",
"confidenceHigh": "Confianza alta",
"confidenceModerate": "Confianza media",
"confidenceLow": "Confianza baja",
"pendingLabel": "Generando comentario de tendencia"
},
"range": {
"label": "Período",
"noPriorData": "sin datos del período anterior",
"option": {
"7d": "7d",
"30d": "30d",
"90d": "90d",
"1y": "1a"
},
"priorLabel": {
"7d": "vs 7d anteriores",
"30d": "vs 30d anteriores",
"90d": "vs 90d anteriores",
"1y": "vs año anterior"
},
"noChange": "sin cambios"
},
"correlationRow": {
"title": "Correlaciones",
"disclaimer": "Las correlaciones son observacionales, no causales — habla con tu médico si tu tensión es alta.",
"experimentCta": "Iniciar experimento de 7 días",
"experimentTooltip": "Próximamente",
"emptyTitle": "Necesitamos más datos para mostrar esta correlación",
"sourceChip": "basado en {n} mediciones pareadas · {window}",
"sourceWindowLast30": "Últimos 30 días",
"confidenceHigh": "Confianza alta",
"confidenceModerate": "Confianza media",
"confidenceLow": "Confianza baja",
"card": {
"bpComplianceTitle": "TA × cumplimiento medicación",
"bpComplianceSubtitle": "Sistólica diaria frente al % de cumplimiento",
"moodPulseTitle": "Ánimo × pulso en reposo",
"moodPulseSubtitle": "Estado de ánimo y pulso en reposo el mismo día",
"weightWeekdayTitle": "Peso × día de la semana",
"weightWeekdaySubtitle": "Peso agrupado por día de la semana"
}
},
"coach": {
"refusalOutOfScope": "Solo puedo ayudarte con los datos de salud de tu registro — mediciones, medicamentos, estado de ánimo, tendencias. Preguntas fuera de ese ámbito no las respondo.",
"refusalInjection": "Tu mensaje contiene instrucciones que pretenden sobrescribir mis indicaciones. Soy el coach de HealthLog y solo resumo tus propios datos de salud — reformula tu pregunta dentro de ese marco.",
"errorBudget": "Has alcanzado el límite diario del coach. El cupo se reinicia a medianoche (UTC).",
"errorProvider": "El coach no ha podido contactar con un proveedor de análisis ahora mismo. Inténtalo en un momento.",
"errorNetwork": "Sin conexión a Internet — inténtalo de nuevo cuando vuelvas a estar en línea.",
"prefsSaveError": "No se pudieron guardar tus preferencias del Coach. Inténtalo de nuevo.",
"errorCredentialExpired": "Tu conexión con el proveedor de IA ha caducado. Vuelve a conectarla en Ajustes para que el Coach siga funcionando.",
"tagline": "Coach personal de salud, apoyado en tus datos.",
"newChat": "Nueva conversación",
"maximizeAriaLabel": "Abrir en pantalla completa",
"minimizeAriaLabel": "Volver al panel",
"send": "Enviar",
"stop": "Detener",
"thinking": "Pensando…",
"composerPlaceholder": "Pregúntame sobre tus datos…",
"nudgeBubbleLabel": "Nuevo mensaje del coach — abrir el chat",
"fabLabel": "Abrir el coach",
"selfContextAdopt": {
"offer": "¿Añadir esta respuesta a tu información personal?",
"confirm": "Añadir",
"dismiss": "Descartar",
"done": "Añadido a tu información personal",
"duplicate": "Ya está en tu información personal",
"failed": "No se pudo añadir. Inténtalo de nuevo."
},
"rememberMessage": {
"action": "Recordar",
"done": "Guardado en tu información personal",
"duplicate": "Ya está en tu información personal",
"failed": "No se pudo guardar. Inténtalo de nuevo."
},
"guided": {
"offerTitle": "El Coach tiene {count} preguntas para ti",
"offerTitleOne": "El Coach tiene una pregunta para ti",
"offerBody": "Respuestas breves afinan tu información personal — una pregunta a la vez, aquí en el chat.",
"offerStart": "Responder ahora",
"offerLater": "Más tarde",
"offerDismiss": "No volver a preguntar",
"dismissError": "No se pudieron descartar las preguntas. Inténtalo de nuevo.",
"progress": "Pregunta {current} de {total}",
"skip": "Omitir",
"later": "Más tarde",
"dismissRemaining": "No volver a preguntar",
"answerPlaceholder": "Tu respuesta…",
"summaryTitle": "¡Listo — gracias por tus respuestas!",
"summaryAnswered": "{answered} de {total} respondidas",
"summaryAdopted": "{adopted} añadidas a tu información personal",
"summaryAdoptedNone": "no se añadió nada nuevo a tu información personal",
"summaryLink": "Ver tu información personal"
},
"voiceComingSoon": "La entrada por voz llega con la app de iOS en la v1.5.",
"threadEmpty": "Pregúntame algo sobre tus tendencias, medicamentos o mediciones para empezar.",
"historyTitle": "Conversaciones",
"historySearchPlaceholder": "Buscar en las conversaciones…",
"historyEmpty": "Tus conversaciones aparecen aquí. Lanza una pregunta para empezar.",
"historyDeleteAria": "Eliminar conversación",
"historyDeleteConfirm": "¿Eliminar esta conversación? No se puede deshacer.",
"sourcesTitle": "A qué accedo",
"sourcesFresh": "Actuales",
"sourcesStale": "Desactualizados",
"sourcesFooter": "El coach solo lee los datos que has conectado.",
"evidenceLabel": "¿En qué se basa esto?",
"metric": {
"bp": "Presión arterial",
"weight": "Peso",
"pulse": "Pulso",
"mood": "Estado de ánimo",
"compliance": "Cumplimiento",
"general": "General",
"hrv": "VFC",
"sleep": "Sueño",
"resting_hr": "Pulso en reposo",
"steps": "Pasos",
"active_energy": "Energía activa",
"flights": "Pisos",
"distance": "Distancia",
"vo2_max": "VO₂ máx",
"body_temp": "Temperatura corporal",
"medications": "Medicamentos",
"anthropometrics": "Perfil (altura, edad, sexo)",
"walking_hr": "Frecuencia cardiaca al caminar",
"respiratory_rate": "Frecuencia respiratoria",
"spo2": "Oxígeno en sangre",
"pulse_wave_velocity": "Velocidad de onda de pulso",
"vascular_age": "Edad vascular",
"body_fat": "Grasa corporal",
"fat_mass": "Masa grasa",
"fat_free_mass": "Masa libre de grasa",
"muscle_mass": "Masa muscular",
"lean_body_mass": "Masa corporal magra",
"bone_mass": "Masa ósea",
"total_body_water": "Agua corporal",
"bmi": "IMC",
"visceral_fat": "Grasa visceral",
"glucose": "Glucosa",
"walking_steadiness": "Estabilidad al caminar",
"walking_asymmetry": "Asimetría al caminar",
"walking_double_support": "Tiempo de doble apoyo",
"walking_step_length": "Longitud de paso",
"walking_speed": "Velocidad al caminar",
"audio_env": "Sonido ambiental",
"audio_headphone": "Audio de auriculares",
"audio_event": "Eventos de sonido fuerte",
"daylight": "Tiempo a la luz del día",
"skin_temp": "Temperatura de la piel",
"workouts": "Entrenamientos"
},
"window": {
"last7days": "Últimos 7 días",
"last30days": "Últimos 30 días",
"last90days": "Últimos 90 días",
"lastYear": "lo que va de año",
"allTime": "Todo el tiempo"
},
"windowLabel": "Periodo",
"settingsAriaLabel": "Ajustes del coach",
"settingsTitle": "Ajustes del coach",
"settingsDescription": "Configura cómo te habla el coach.",
"settingsToneLabel": "Tono",
"settingsToneWarm": "Cálido",
"settingsToneNeutral": "Neutro",
"settingsToneConcise": "Conciso",
"settingsVerbosityLabel": "Longitud de la respuesta",
"settingsVerbosityBrief": "Breve",
"settingsVerbosityDefault": "Estándar",
"settingsVerbosityDetailed": "Detallado",
"settingsSourcesPointer": "Los grupos de datos que el coach puede usar y la ventana de análisis predeterminada se gestionan directamente en el chat del coach (panel «En qué me baso»).",
"settingsSourcesPointerLink": "Abrir el coach",
"settingsExcludeLabel": "Excluir métricas",
"settingsExcludeHint": "El coach no verá los datos de las métricas seleccionadas.",
"settingsEvidenceLabel": "Mostrar evidencia por defecto",
"settingsEvidenceHint": "Abre automáticamente el cuadro de evidencias bajo cada respuesta.",
"settingsDefaultWindowLabel": "Periodo de análisis por defecto",
"settingsDefaultWindowHint": "El coach lee este periodo por chat, salvo que elijas otro en la cabecera del cajón.",
"settingsSave": "Guardar",
"settingsSaved": "Guardado.",
"settingsCancel": "Cancelar",
"feedbackHelpful": "Útil",
"feedbackUnhelpful": "Poco útil",
"feedbackThanks": "Gracias por la indicación.",
"feedbackError": "No se pudo guardar el comentario",
"dailyLimitTitle": "Límite diario alcanzado",
"dailyLimitBody": "Límite diario alcanzado; reinicio a las 00:00 UTC.",
"providerRateLimitTitle": "Proveedor con límite de tasa",
"providerRateLimitBody": "El proveedor está temporalmente saturado; reinicio en ~5 min.",
"settingsContextLabel": "Enviar contexto",
"settingsContextHint": "Bloques opcionales en los que el coach puede apoyarse. Si desactivas alguno, se omitirá en cada respuesta.",
"cluster": {
"cardio": {
"label": "Cardiovascular",
"hint": "Presión · pulso · VFC · FC en reposo y al caminar"
},
"body": {
"label": "Composición corporal",
"hint": "Peso · grasa · músculo · IMC"
},
"activity": {
"label": "Actividad",
"hint": "Pasos · energía · distancia · VO₂ máx"
},
"workouts": {
"label": "Entrenamientos",
"hint": "Carreras · paseos · sesiones"
},
"sleep": {
"label": "Sueño",
"hint": "Duración · fases"
},
"mood": {
"label": "Estado de ánimo",
"hint": "Registros diarios de ánimo"
},
"glucose": {
"label": "Glucosa",
"hint": "Lecturas en ayunas y posprandiales"
},
"medication": {
"label": "Medicación",
"hint": "Adherencia · contexto GLP-1"
},
"mobility": {
"label": "Movilidad y marcha",
"hint": "Estabilidad · asimetría · marcha"
},
"environment": {
"label": "Entorno",
"hint": "Ruido · luz del día · temp. piel"
}
},
"settingsClustersLabel": "Datos que ve el Coach",
"settingsClustersHint": "Elige qué grupos de datos puede leer el Coach. Más datos significan respuestas más ricas y un prompt mayor.",
"settingsClusterNoData": "Aún no hay datos",
"sourcesMemberCount": "{count} métricas"
},
"relativeJustNow": "ahora mismo",
"relativeMinutesAgoOne": "hace {count} minuto",
"relativeMinutesAgoOther": "hace {count} minutos",
"relativeHoursAgoOne": "hace {count} hora",
"relativeHoursAgoOther": "hace {count} horas",
"relativeDaysAgoOne": "hace {count} día",
"relativeDaysAgoOther": "hace {count} días",
"navOverview": "Resumen",
"navBloodPressure": "Presión arterial",
"navWeight": "Peso",
"navPulse": "Pulso",
"navMood": "Estado de ánimo",
"navMedication": "Medicamento",
"navBmi": "IMC",
"navSleep": "Sueño",
"navHrv": "VFC",
"navRestingHr": "FC reposo",
"navOxygenSaturation": "Oxígeno",
"navBodyTemperature": "Temperatura",
"navSteps": "Pasos",
"navActiveEnergy": "Energía activa",
"navAriaLabel": "Saltar a sección",
"pillScrollLeft": "Desplazar las pestañas a la izquierda",
"pillScrollRight": "Desplazar las pestañas a la derecha",
"tabStrip": {
"vitalsParent": {
"label": "Vitales",
"header": "Constantes vitales"
},
"bodyParent": {
"label": "Cuerpo",
"header": "Composición corporal"
},
"activityParent": {
"label": "Actividad",
"header": "Actividad y movilidad"
},
"cardiovascularParent": {
"label": "Cardiovascular",
"header": "Marcadores cardiovasculares"
},
"hearingParent": {
"label": "Audición",
"header": "Audición y exposición sonora"
},
"environmentParent": {
"label": "Entorno",
"header": "Entorno"
},
"metabolicParent": {
"label": "Metabólico",
"header": "Metabólico"
}
},
"hrv": {
"title": "VFC",
"description": "Variabilidad de la frecuencia cardíaca a lo largo del tiempo — señal de recuperación del sistema nervioso, captada por la noche por Apple Watch y otros wearables compatibles.",
"chartTitle": "Variabilidad de la frecuencia cardíaca",
"emptyState": {
"title": "Aún no hay valores de VFC",
"description": "Los valores de VFC aparecerán aquí en cuanto Apple Watch (o un dispositivo Withings compatible) sincronice las mediciones nocturnas."
}
},
"restingHr": {
"title": "FC en reposo",
"description": "El nivel basal diario del corazón — distinto del pulso puntual de la página de pulso. Apple Salud aporta un valor al día.",
"chartTitle": "Frecuencia cardíaca en reposo",
"emptyState": {
"title": "Aún no hay FC en reposo",
"description": "La FC en reposo aparece cuando Apple Watch o un Withings compatible ha llevado puesto un día tranquilo."
}
},
"oxygenSaturation": {
"title": "Saturación de oxígeno",
"description": "Oxígeno en sangre (SpO₂) — rango clínico normal 95–100 %, con zonas objetivo sombreadas en el gráfico.",
"chartTitle": "Saturación de oxígeno",
"emptyState": {
"title": "Aún no hay muestras de SpO₂",
"description": "Las muestras de SpO₂ llegan aquí en cuanto un wearable compatible (Apple Watch, Withings ScanWatch) capture una lectura."
}
},
"bodyTemperature": {
"title": "Temperatura corporal",
"description": "Tendencia de temperatura corporal central en grados Celsius. La temperatura cutánea de Withings vive en una métrica distinta.",
"chartTitle": "Temperatura corporal",
"emptyState": {
"title": "Aún no hay temperatura corporal",
"description": "Registra una lectura o deja que tu wearable sincronice una — la tendencia aparecerá aquí.",
"cta": "Registrar temperatura corporal"
}
},
"steps": {
"title": "Pasos",
"description": "Recuento diario de pasos — una fila por día, desde Apple Salud o un dispositivo de actividad conectado.",
"chartTitle": "Pasos por día",
"emptyState": {
"title": "Aún no hay datos de pasos",
"description": "Los totales diarios de pasos aparecerán aquí en cuanto Apple Salud o un dispositivo de actividad sincronice un día completo."
}
},
"activeEnergy": {
"title": "Energía activa",
"description": "Total diario de energía activa en kilocalorías — una fila por día, desde Apple Salud o la actividad de Withings.",
"chartTitle": "Energía activa",
"emptyState": {
"title": "Aún no hay datos de energía activa",
"description": "Los totales de energía activa aparecerán aquí en cuanto Apple Salud o un dispositivo de actividad Withings sincronice un día completo."
}
},
"subPage": {
"loadError": "No se pudo cargar esta métrica ahora mismo.",
"blutdruckDescription": "Tu evolución sistólica/diastólica con rangos objetivo ajustados a la edad y una valoración en texto.",
"gewichtDescription": "Evolución del peso frente a la banda saludable derivada de tu altura, con valoración.",
"pulsDescription": "Resting pulse vs. the personalised Karvonen target band, plus a written assessment.",
"stimmungDescription": "Valores diarios de estado de ánimo en el tiempo, con una valoración en texto.",
"stimmungEmptyTitle": "Registrar primer estado de ánimo",
"stimmungEmptyDescription": "Los insights de ánimo aparecen en cuanto registres unas cuantas entradas. Toca abajo para empezar.",
"stimmungEmptyAction": "Abrir diario de ánimo",
"medikamenteDescription": "Calendario de tomas por medicamento, más una valoración en texto.",
"medikamenteEmptyTitle": "Añadir primer medicamento",
"medikamenteEmptyDescription": "Los insights de adherencia necesitan al menos un medicamento registrado.",
"medikamenteEmptyAction": "Abrir medicamentos",
"bmiDescription": "IMC derivado de tu peso y altura, con valoración.",
"target": {
"adjustLink": "Ajustar el rango objetivo"
},
"primary": {
"avg30Label": "Promedio de 30 días",
"inRangeLabel": "En el objetivo",
"inRangeAria": "{pct}% de los días registrados dentro del objetivo"
},
"lastMeasurement": {
"label": "Última medición"
},
"explainer": {
"trigger": "¿Qué es {title}?",
"bloodPressureTitle": "Presión arterial",
"bloodPressureBody": "La presión arterial es la fuerza que ejerce la sangre sobre las paredes de las arterias, expresada como sistólica sobre diastólica (el pico durante un latido sobre el valor en reposo entre latidos). Los valores altos de forma constante sobrecargan el corazón y los vasos con el tiempo.",
"pulseTitle": "Pulso",
"pulseBody": "El pulso es cuántas veces late el corazón por minuto. Una medición puntual refleja lo que hacías en ese momento: en reposo suele ser de 60 a 100 latidos por minuto y sube de forma natural con el movimiento, el estrés o la cafeína.",
"weightTitle": "Peso",
"weightBody": "El peso corporal es una de las señales más simples del balance energético a largo plazo y de la salud general. La tendencia a lo largo de las semanas importa mucho más que cualquier lectura individual, que varía con la hidratación, la comida y la hora del día.",
"bmiTitle": "Índice de masa corporal (IMC)",
"bmiBody": "El IMC es tu peso dividido por tu altura al cuadrado, un único número que te sitúa en una categoría amplia de peso. Es un cribado poblacional, no un diagnóstico, y no distingue el músculo de la grasa.",
"sleepTitle": "Sueño",
"sleepBody": "La duración del sueño es cuánto dormiste realmente durante la noche, dividido en fases ligera, profunda y REM. La mayoría de los adultos necesita entre siete y nueve horas; tanto la cantidad como la calidad constantes favorecen la recuperación, el ánimo y el metabolismo.",
"moodTitle": "Estado de ánimo",
"moodBody": "El registro del estado de ánimo anota cómo te sientes con el tiempo en una escala sencilla. Anotarlo con regularidad revela patrones —cómo el sueño, la actividad o la medicación se relacionan con cómo te sientes— que un solo día nunca muestra.",
"medicationsTitle": "Adherencia a la medicación",
"medicationsBody": "La adherencia es la fiabilidad con la que tomas tu medicación según lo prescrito, aquí como la proporción de dosis previstas que registraste. Una toma constante suele ser lo que hace que un tratamiento funcione como se pretende.",
"restingHrTitle": "Frecuencia cardíaca en reposo",
"restingHrBody": "La frecuencia cardíaca en reposo es tu ritmo cardíaco cuando estás completamente en reposo, normalmente medido durante la noche. Una frecuencia más baja suele indicar mejor forma cardiovascular, y una tendencia al alza puede ser una señal temprana de estrés o enfermedad.",
"hrvTitle": "Variabilidad de la frecuencia cardíaca (VFC)",
"hrvBody": "La VFC es la pequeña variación en el tiempo entre latidos consecutivos. Una mayor variabilidad suele reflejar un sistema nervioso bien recuperado y adaptable, mientras que una caída sostenida puede señalar fatiga, estrés o recuperación insuficiente.",
"oxygenSaturationTitle": "Saturación de oxígeno (SpO₂)",
"oxygenSaturationBody": "La SpO₂ es el porcentaje de glóbulos rojos que transportan oxígeno. Los valores de 95 a 100 % son normales en reposo; los valores que se mantienen por debajo del 90 % merecen atención, aunque las bajadas breves nocturnas son frecuentes.",
"bodyTemperatureTitle": "Temperatura corporal",
"bodyTemperatureBody": "La temperatura corporal refleja tu estado térmico central, normalmente en torno a 37 °C con pequeñas variaciones diarias. Un aumento sostenido puede indicar una infección, mientras que las lecturas nocturnas en la muñeca reflejan sobre todo cambios relativos, no un valor clínico.",
"activeEnergyTitle": "Energía activa",
"activeEnergyBody": "La energía activa son las calorías que quemas con el movimiento, además del consumo basal en reposo. Es una medida directa de lo físicamente activo que fue tu día.",
"workoutsTitle": "Entrenamientos",
"workoutsBody": "Los entrenamientos son las sesiones de ejercicio estructurado que registran tus dispositivos, con tipo, duración y energía. Registrarlos muestra cómo el entrenamiento regular se acumula a lo largo de las semanas y cómo se relaciona con tus otras señales de salud.",
"respiratoryRateTitle": "Frecuencia respiratoria",
"respiratoryRateBody": "La frecuencia respiratoria es el número de respiraciones que haces por minuto. En reposo, la mayoría de los adultos respiran entre doce y veinte veces por minuto; un aumento sostenido puede acompañar a una enfermedad, el esfuerzo o el estrés.",
"bodyWaterTitle": "Agua corporal total",
"bodyWaterBody": "El agua corporal total es la parte de tu peso compuesta por líquido, dentro y alrededor de las células. Varía con la hidratación, la comida y la actividad, así que la tendencia a lo largo de semanas dice más que una sola medición.",
"boneMassTitle": "Masa ósea",
"boneMassBody": "La masa ósea es el peso estimado del mineral de tu esqueleto. Las estimaciones de la báscula son aproximadas, pero una tendencia estable o al alza favorece la fortaleza ósea a largo plazo.",
"fatFreeMassTitle": "Masa libre de grasa",
"fatFreeMassBody": "La masa libre de grasa es todo lo que en tu cuerpo no es grasa: músculo, hueso, órganos y agua. Mantenerla o aumentarla mientras pierdes peso suele indicar una composición corporal más sana.",
"fatMassTitle": "Masa grasa",
"fatMassBody": "La masa grasa es el peso total de la grasa de tu cuerpo. Algo de grasa es esencial para las hormonas y la reserva de energía, pero un exceso —sobre todo en el abdomen— eleva el riesgo para la salud a largo plazo.",
"muscleMassTitle": "Masa muscular",
"muscleMassBody": "La masa muscular es el peso estimado del músculo de tu cuerpo. Más músculo favorece la fuerza, el metabolismo y la movilidad, y suele requerir esfuerzo activo para conservarse con la edad.",
"visceralFatTitle": "Grasa visceral",
"visceralFatBody": "La grasa visceral es la grasa almacenada en lo profundo del abdomen, alrededor de los órganos. A diferencia de la grasa bajo la piel, un nivel alto se asocia estrechamente con enfermedad cardíaca y diabetes tipo 2, por lo que cuanto más baja, mejor.",
"leanBodyMassTitle": "Masa magra corporal",
"leanBodyMassBody": "La masa magra corporal es tu peso total menos la grasa: músculo, hueso, órganos y agua en conjunto. Seguirla junto al peso muestra si los cambios vienen del músculo o de la grasa.",
"flightsClimbedTitle": "Pisos subidos",
"flightsClimbedBody": "Los pisos subidos cuentan las plantas que subes cada día, con un piso equivalente a unos tres metros de altura. Es un indicador sencillo de la actividad cotidiana y el esfuerzo del tren inferior.",
"walkingDistanceTitle": "Distancia a pie y corriendo",
"walkingDistanceBody": "La distancia a pie y corriendo es el terreno que recorres caminando cada día. Complementa el recuento de pasos al reflejar cuánto te moviste, no solo con qué frecuencia diste pasos.",
"walkingSteadinessTitle": "Estabilidad al caminar",
"walkingSteadinessBody": "La estabilidad al caminar estima cuán estable y equilibrada es tu marcha, clasificada de correcta a baja. Un nivel bajo indica mayor probabilidad de caída y conviene comentarlo con un profesional.",
"walkingHeartRateTitle": "Frecuencia cardíaca al caminar",
"walkingHeartRateBody": "La frecuencia cardíaca al caminar es tu pulso medio durante una caminata constante. Un valor más bajo con el tiempo suele reflejar una mejor forma cardiovascular para el mismo esfuerzo.",
"walkingAsymmetryTitle": "Asimetría al caminar",
"walkingAsymmetryBody": "La asimetría al caminar es la proporción de tiempo en que tus pasos son desiguales entre la pierna izquierda y la derecha. Un porcentaje más alto puede indicar dolor, lesión o un problema de marcha que conviene revisar.",
"doubleSupportTimeTitle": "Tiempo de doble apoyo",
"doubleSupportTimeBody": "El tiempo de doble apoyo es la proporción de cada ciclo de marcha en que ambos pies tocan el suelo a la vez. Un porcentaje más alto suele indicar una marcha más cautelosa y menos estable.",
"stepLengthTitle": "Longitud de zancada",
"stepLengthBody": "La longitud de zancada es la distancia media de una pisada a la siguiente. Una zancada más corta con el tiempo puede reflejar fatiga, cautela o un cambio en la movilidad.",
"walkingSpeedTitle": "Velocidad al caminar",
"walkingSpeedBody": "La velocidad al caminar es lo rápido que te mueves en terreno llano. Es un marcador bien estudiado de la salud general y la movilidad, y un ritmo estable o al alza es buena señal.",
"pulseWaveVelocityTitle": "Velocidad de la onda de pulso",
"pulseWaveVelocityBody": "La velocidad de la onda de pulso mide la rapidez con que la onda de presión de cada latido viaja por tus arterias. Una onda más rápida indica arterias más rígidas, lo que se asocia a mayor riesgo cardiovascular.",
"vascularAgeTitle": "Edad vascular",
"vascularAgeBody": "La edad vascular estima qué edad aparentan tus arterias en comparación con tu edad real, según la rigidez arterial. Una edad vascular por debajo de la real sugiere vasos sanguíneos más sanos.",
"environmentalAudioTitle": "Niveles de sonido ambiental",
"environmentalAudioBody": "Los niveles de sonido ambiental registran el volumen del entorno en decibelios. La exposición prolongada por encima de unos 70 dB puede dañar la audición con el tiempo, así que los promedios diarios más bajos son más seguros.",
"headphoneAudioTitle": "Niveles de audio con auriculares",
"headphoneAudioBody": "Los niveles de audio con auriculares registran en decibelios el volumen al que escuchas con auriculares. Bajar el volumen y hacer pausas protege tu audición a largo plazo.",
"audioEventsTitle": "Eventos de sonido fuerte",
"audioEventsBody": "Los eventos de sonido fuerte señalan momentos en que el ruido a tu alrededor alcanzó un nivel que puede dañar la audición con suficiente exposición. Los eventos frecuentes son una señal para buscar un entorno más silencioso o protección auditiva.",
"daylightTitle": "Tiempo a la luz del día",
"daylightBody": "El tiempo a la luz del día es cuánto pasas bajo luz exterior cada día. La luz diurna regular favorece un ritmo sueño-vigilia y un estado de ánimo saludables, y el tiempo al aire libre se asocia con la salud ocular.",
"bloodGlucoseTitle": "Glucosa en sangre",
"bloodGlucoseBody": "La glucosa en sangre es la cantidad de azúcar en tu sangre, la principal fuente de energía del cuerpo. Sube tras comer y se estabiliza entre comidas; valores que se mantienen altos con el tiempo pueden indicar diabetes o prediabetes.",
"skinTemperatureTitle": "Temperatura de la piel",
"skinTemperatureBody": "La temperatura de la piel aquí es el pequeño cambio nocturno de la temperatura de tu muñeca respecto a tu propio valor de referencia, no una medición absoluta de fiebre. Las variaciones pueden seguir el sueño, el entorno, una enfermedad o la fase del ciclo menstrual.",
"cardioFitnessTitle": "Condición cardiovascular (VO₂ máx)",
"cardioFitnessBody": "El VO₂ máx es la cantidad de oxígeno que tu cuerpo puede usar al máximo esfuerzo. Es el mejor marcador de laboratorio de la forma aeróbica, y un valor más alto o en aumento es una buena señal de salud cardiovascular.",
"cardioRecoveryTitle": "Recuperación cardiaca",
"cardioRecoveryBody": "La recuperación cardiaca es cuántas pulsaciones por minuto baja tu frecuencia cardiaca en el primer minuto tras parar un ejercicio intenso. Una caída mayor significa que tu corazón se calma más rápido, señal de buena forma física.",
"wristTemperatureTitle": "Temperatura de muñeca",
"wristTemperatureBody": "La temperatura de muñeca se mide mientras duermes. Apple la muestra como la diferencia respecto a tu valor de referencia; un valor estable es normal, mientras que una subida sostenida puede indicar enfermedad, entrenamiento intenso o un cambio del ciclo.",
"fallsTitle": "Caídas",
"fallsBody": "Esto cuenta las caídas fuertes que detecta tu Apple Watch. El objetivo es cero; un número creciente es una señal de riesgo de movilidad que conviene comentar con un profesional, sobre todo en personas mayores.",
"sixMinuteWalkTitle": "Distancia en marcha de 6 minutos",
"sixMinuteWalkBody": "Es la estimación de Apple de cuánto podrías caminar en seis minutos, una prueba clínica clásica de movilidad y resistencia cardiopulmonar. Una distancia estable o en aumento es una buena señal.",
"stairAscentSpeedTitle": "Velocidad subiendo escaleras",
"stairAscentSpeedBody": "Es lo rápido que subes un tramo de escaleras. Es un marcador sensible de fuerza de piernas y movilidad: un ritmo estable o en aumento es buena señal y uno que baja conviene vigilar.",
"stairDescentSpeedTitle": "Velocidad bajando escaleras",
"stairDescentSpeedBody": "Es lo rápido que bajas un tramo de escaleras. Junto con la velocidad de subida refleja el control de piernas y el equilibrio: un ritmo estable es buena señal y uno que baja conviene vigilar.",
"breathingDisturbancesTitle": "Alteraciones respiratorias del sueño",
"breathingDisturbancesBody": "Tu Apple Watch puede estimar con qué frecuencia se interrumpió tu respiración mientras dormías. Un índice más bajo es mejor; un nivel que Apple marca como elevado, sobre todo durante muchas noches, conviene comentarlo con un profesional.",
"readinessBody": "La preparación es una lectura diaria de lo listo que está tu cuerpo para afrontar el día, combinando la frecuencia cardíaca en reposo, la variabilidad de la frecuencia cardíaca, el sueño y la regularidad de tus últimas noches. Una puntuación más alta indica que tu organismo se ve recuperado y con recursos; una más baja es un aviso suave para bajar el ritmo.",
"sleepScoreBody": "Tu puntuación de sueño resume toda una noche en un solo número — duración, eficiencia, regularidad y el equilibrio entre sueño ligero, profundo y REM. Fíjate en el patrón a lo largo de las semanas en lugar de perseguir una puntuación perfecta una sola noche.",
"recoveryBody": "La recuperación refleja lo bien que tu cuerpo se ha repuesto, a partir de señales nocturnas como la variabilidad de la frecuencia cardíaca y la frecuencia en reposo. Una puntuación alta es luz verde para exigirte; una más baja sugiere que tu organismo aún se está reconstruyendo.",
"strainBody": "El esfuerzo capta cuánta carga cardiovascular y física le has impuesto a tu cuerpo, desde los entrenamientos hasta un día activo de pie. Cuando ya hay suficiente historial, se valora frente a tu propio esfuerzo habitual, no frente a un estándar ajeno.",
"stressBody": "El estrés aquí es una estimación de la carga fisiológica sobre tu sistema nervioso, leída sobre todo a partir de patrones de variabilidad de la frecuencia cardíaca y no de cómo te sientes conscientemente. Una puntuación más baja apunta a un estado calmado y bien regulado; una más alta es una invitación a incorporar recuperación.",
"recoveryPageTitle": "Recuperación",
"recoveryPageBody": "La recuperación reúne las señales nocturnas que registra tu wearable —recarga, esfuerzo, carga y los totales de frecuencia cardiaca y energía del día— para mostrar cómo se ha recuperado tu cuerpo. Fíjate en el patrón a lo largo de los días más que en un solo número; un valor más bajo es una invitación a bajar el ritmo, no una alarma."
},
"stats": {
"label": "Estadísticas resumidas",
"min": "Mín",
"max": "Máx",
"median": "Mediana",
"mean": "Media"
},
"showAllValues": "Mostrar todas las mediciones",
"valuesPageTitle": "{metric} — todas las mediciones",
"valuesPageDescription": "Cada medición detrás de esta métrica. Edita o elimina una entrada directamente.",
"diversity": {
"trigger": "Consejo de medición",
"weekday": "La mayoría de tus mediciones de {metric} caen en un mismo día de la semana. Registrar en otros días ofrece una imagen más completa.",
"timeOfDay": "La mayoría de tus mediciones de {metric} caen a una hora similar del día. Variar la hora ofrece una imagen más completa."
},
"valuesBack": "Volver a Insights",
"valuesBackToMetric": "Volver a {metric}",
"scoresBack": "Volver a Insights"
},
"sleep": {
"title": "Sueño",
"description": "Desglose por fases y duración nocturna, tomados de Apple Health.",
"headlineTitle": "Media por noche",
"headlineCaption": "Promediado sobre {count} noches — {suffix}",
"headlineCaptionSuffix": "por noche",
"compositionTitle": "Distribución de fases",
"compositionSubtitle": "Últimas {nights} noches",
"compositionAriaLabel": "Distribución de fases del sueño en {nights} noches",
"hypnogram": {
"title": "Última noche",
"subtitle": "{asleep} dormido",
"ariaLabel": "Progresión de las fases del sueño de la última noche: {asleep} dormido, {awakenings} despertares",
"asleepTotal": "Dormido {value}",
"inBedTotal": "En la cama {value}",
"awakenings": "{count} despertares",
"source": "Fuente: {source}"
},
"stages": {
"deep": "Profundo",
"rem": "REM",
"core": "Ligero",
"asleep": "Dormido",
"awake": "Despierto",
"inBed": "En la cama",
"unavailable": "Aún no hay datos de fases — la sincronización de fases vía Apple Health llega con la v1.5."
},
"empty": {
"title": "Aún no hay datos de sueño",
"description": "La sincronización con Apple Health llega con la v1.5 y llenará esta vista automáticamente.",
"action": "Gestionar dispositivos"
},
"debt": {
"title": "Deuda de sueño",
"value": "{hours} h {minutes} min de déficit",
"caption": "Déficit acumulado de las últimas {nights} noches",
"clearValue": "Al día",
"clearCaption": "Sin déficit acumulado en las últimas {nights} noches",
"learning": "Aún estamos midiendo tu sueño — {counted} noches hasta ahora, faltan {remaining} para un balance fiable."
},
"chronotype": {
"title": "Cronotipo",
"learning": "Aún estamos aprendiendo tu ritmo — {counted} de {total} noches libres. Un cronotipo necesita varias mañanas sin despertador para tener sentido.",
"midSleepCaption": "Punto medio del sueño en días libres en torno a las {clock}",
"advancedToggle": "Avanzado",
"socialJetlagValue": "{hours} h {minutes} min de jet lag social",
"socialJetlagCaption": "La diferencia entre el horario de sueño laboral y el de los días libres — como un pequeño cambio de huso horario semanal.",
"msfScValue": "Punto medio corregido {clock}",
"msfScCaption": "Ajustado por el sueño que recuperas el fin de semana (MSFsc).",
"dayTypeNote": "Se asume que los días libres son los fines de semana hasta que se añada el registro del tipo de día.",
"band": {
"extreme_early": "Matutino marcado",
"early": "Matutino",
"intermediate": "Intermedio",
"late": "Vespertino",
"extreme_late": "Vespertino marcado"
}
},
"rhythm": {
"loadError": "Tu ritmo de sueño no pudo cargarse ahora mismo. Reaparecerá en cuanto se estabilice la conexión."
}
},
"correlations": "Correlaciones",
"medicationCompliance": "Cumplimiento de medicación",
"dayStreak": "{count} días de racha",
"dayStreakOne": "{count} día de racha",
"compliance7d": "Cumplimiento 7 días",
"compliance30d": "Cumplimiento 30 días",
"taken": "Tomada",
"skipped": "Omitida",
"missed": "Perdida",
"generalStatusBadge": {
"good": "Bien",
"watch": "Observar",
"critical": "Crítico"
},
"assessmentTitle": "Valoración",
"assessmentShowMore": "Mostrar más",
"assessmentShowLess": "Mostrar menos",
"bloodPressureSectionTitle": "Presión arterial",
"weightSectionTitle": "Peso",
"pulseSectionTitle": "Pulso",
"bmiSectionTitle": "IMC",
"complianceNoData": "Sin datos de cumplimiento disponibles",
"generate": "Generar análisis nuevo",
"moodSectionTitle": "Estado de ánimo",
"confidence": "Confianza",
"cached": "En caché",
"emptyState": {
"bloodPressure": {
"title": "Aún no hay registros de presión arterial",
"description": "Registra una medición de presión y aquí aparecerán la tendencia, el porcentaje en rango y la clasificación de la OMS.",
"cta": "Registrar presión"
},
"weight": {
"title": "Aún no hay registros de peso",
"description": "Registra un peso y aparecerán automáticamente la tendencia, la media móvil y la zona objetivo.",
"cta": "Registrar peso"
},
"pulse": {
"title": "Aún no hay registros de pulso",
"description": "Registra un pulso y aquí aparecerán pulso en reposo, VFC y VO₂ máx.",
"cta": "Registrar pulso"
},
"bmi": {
"title": "IMC aún no calculado",
"description": "Cuando haya altura y al menos un registro de peso, aquí aparecerá la tendencia del IMC con las zonas de la OMS.",
"cta": "Registrar peso"
},
"mood": {
"title": "Aún no hay entradas de estado de ánimo",
"description": "Registra un estado de ánimo y aparecerán la tendencia, la banda de estabilidad y las correlaciones.",
"cta": "Registrar ánimo"
},
"medication": {
"title": "Aún no hay medicamentos configurados",
"description": "Configura un medicamento y aquí aparecerán la adherencia, el nivel plasmático y la titulación.",
"cta": "Añadir medicamento"
},
"sleep": {
"title": "Aún no hay registros de sueño",
"description": "Una vez disponibles los datos de sueño (manual o vía Withings / Apple Health), aquí aparecerá el desglose por fases.",
"cta": "Conectar Withings"
}
},
"navWorkouts": "Entrenamientos",
"navRecovery": "Recuperación",
"workouts": {
"title": "Entrenamientos",
"description": "Carreras, salidas en bici, paseos y sesiones de fuerza recientes, deduplicados entre Apple Watch y Withings.",
"emptyState": {
"title": "Aún no hay entrenamientos",
"description": "Abre la app Apple Salud en el iPhone para sincronizar tus entrenamientos. La importación de actividad de Withings también incorpora caminatas y rutas en bici."
},
"row": {
"duration": "Duración",
"distance": "Distancia",
"energy": "Energía activa"
},
"detail": {
"backToList": "Volver a entrenamientos",
"statsTitle": "Estadísticas",
"statsDuration": "Duración",
"statsDistance": "Distancia",
"statsActiveEnergy": "Energía activa",
"statsAvgHr": "FC media",
"statsMaxHr": "FC máx.",
"statsMinHr": "FC mín.",
"statsStepCount": "Pasos",
"statsElevation": "Desnivel",
"statsPace": "Ritmo",
"statsSource": "Fuente",
"routeTitle": "Ruta",
"routeUnavailable": "No se registró una ruta GPS para este entrenamiento.",
"hrChartTitle": "Frecuencia cardíaca",
"hrChartUnavailable": "Las muestras de frecuencia cardíaca por segundo no se almacenan para este entrenamiento.",
"notFound": "Entrenamiento no encontrado.",
"loading": "Cargando entrenamiento…"
},
"sport": {
"walking": "Caminar",
"running": "Correr",
"cycling": "Bici",
"hiking": "Senderismo",
"swimming": "Natación",
"rowing": "Remo",
"elliptical": "Elíptica",
"stairClimber": "Escalera",
"yoga": "Yoga",
"mindAndBody": "Mente y cuerpo",
"strength": "Fuerza",
"hiit": "HIIT",
"dance": "Baile",
"golf": "Golf",
"tennis": "Tenis",
"basketball": "Baloncesto",
"soccer": "Fútbol",
"crossTraining": "Entreno cruzado",
"mixedCardio": "Cardio mixto",
"other": "Otro"
}
},
"bloodGlucose": {
"title": "Glucosa en sangre",
"description": "Tus lecturas de glucosa en el tiempo, en mg/dL.",
"chartTitle": "Glucosa en sangre",
"medianLabel": "Glucosa mediana",
"emptyState": {
"title": "Aún no hay datos de glucosa",
"description": "Las lecturas de glucosa aparecen aquí cuando registras una o un dispositivo sincroniza."
},
"clinical": {
"title": "Resumen de glucosa",
"subtitle": "Una lectura de tus últimos {days} días, a partir de {count} mediciones.",
"spotCaveat": "Son estimaciones a partir de mediciones puntuales, no un perfil de un sensor continuo: léelas como una tendencia, no como un veredicto clínico.",
"learningTitle": "Aún conociendo tu glucosa",
"learningBody": "De momento son {count} en {days}. Con algo más de historial el panorama se aclara: sigue registrando o deja que lo complete un dispositivo conectado.",
"learningBodyEmpty": "En cuanto lleguen unas cuantas mediciones —registradas por ti o sincronizadas desde un dispositivo— tu tiempo en rango, promedio y variabilidad tomarán forma aquí.",
"readingsCount": "{count} mediciones",
"readingsCountOne": "1 medición",
"daysCount": "{days} días",
"daysCountOne": "1 día",
"tir": {
"title": "Tiempo en rango",
"caption": "Proporción de mediciones en cada banda (70–180 mg/dl es el objetivo).",
"veryLow": "Muy bajo",
"low": "Bajo",
"inRange": "En rango",
"high": "Alto",
"veryHigh": "Muy alto",
"ariaLabel": "Tiempo en rango: {tir}% en objetivo, {below}% por debajo, {above}% por encima.",
"empty": "Aún no hay mediciones para el gráfico."
},
"gmi": {
"label": "Indicador de gestión de la glucosa",
"help": "Una estimación tipo HbA1c derivada de tu glucosa promedio."
},
"eA1c": {
"label": "HbA1c estimada",
"help": "Una estimación de HbA1c a partir de tu glucosa media (ADAG)."
},
"mean": {
"label": "Glucosa promedio"
},
"cv": {
"label": "Variabilidad",
"steady": "Estable",
"unstable": "Inestable",
"help": "Coeficiente de variación. A partir del 36 % la glucosa se considera inestable; menos es más estable."
},
"advanced": {
"toggle": "Índices avanzados",
"intro": "Compuestos de nivel investigador para mirar más de cerca. Cada uno reduce tus mediciones a un único número ponderado por riesgo.",
"jIndex": {
"label": "Índice J",
"help": "Una puntuación única que combina tu promedio y su dispersión: cuanto más bajo, más ajustado el control."
},
"lbgi": {
"label": "Riesgo de hipoglucemia (LBGI)",
"help": "Índice de Kovatchev que pondera con qué frecuencia y profundidad bajan las lecturas."
},
"hbgi": {
"label": "Riesgo de hiperglucemia (HBGI)",
"help": "Índice de Kovatchev que pondera con qué frecuencia y altura suben las lecturas."
},
"byContext": {
"title": "Por contexto",
"fasting": "En ayunas",
"postprandial": "Después de comer",
"random": "Aleatorio",
"bedtime": "Antes de dormir",
"readingsShort": "{count} mediciones",
"readingsShortOne": "1 medición"
}
}
}
},
"navBloodGlucose": "Glucosa",
"totalBodyWater": {
"title": "Agua corporal total",
"description": "Tu agua corporal total en el tiempo, en kilogramos.",
"chartTitle": "Agua corporal total",
"emptyState": {
"title": "Aún no hay datos de agua corporal",
"description": "Las lecturas de agua corporal aparecen aquí cuando una báscula de composición se sincroniza."
}
},
"navTotalBodyWater": "Agua corporal",
"boneMass": {
"title": "Masa ósea",
"description": "Tu masa ósea en el tiempo, en kilogramos.",
"chartTitle": "Masa ósea",
"emptyState": {
"title": "Aún no hay datos de masa ósea",
"description": "Las lecturas de masa ósea aparecen aquí cuando una báscula de composición se sincroniza."
}
},
"navBoneMass": "Masa ósea",
"flightsClimbed": {
"title": "Pisos subidos",
"description": "Tramos de escaleras que subiste cada día.",
"chartTitle": "Pisos subidos por día",
"emptyState": {
"title": "Aún no hay datos de pisos",
"description": "Los totales de pisos aparecen aquí cuando Apple Health sincroniza un día."
}
},
"navFlightsClimbed": "Pisos",
"walkingRunningDistance": {
"title": "Distancia a pie + corriendo",
"description": "Distancia caminando y corriendo cada día, en kilómetros.",
"chartTitle": "Distancia por día",
"emptyState": {
"title": "Aún no hay datos de distancia",
"description": "La distancia diaria aparece aquí cuando Apple Health sincroniza un día."
}
},
"navWalkingRunningDistance": "Distancia",
"fatFreeMass": {
"title": "Masa libre de grasa",
"description": "Tu masa libre de grasa en el tiempo, en kilogramos.",
"chartTitle": "Masa libre de grasa",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando una báscula de composición se sincroniza."
}
},
"navFatFreeMass": "Masa magra",
"fatMass": {
"title": "Masa grasa",
"description": "Tu masa grasa en el tiempo, en kilogramos.",
"chartTitle": "Masa grasa",
"emptyState": {
"title": "Aún no hay datos de masa grasa",
"description": "Las lecturas aparecen aquí cuando una báscula de composición se sincroniza."
}
},
"navFatMass": "Masa grasa",
"muscleMass": {
"title": "Masa muscular",
"description": "Tu masa muscular en el tiempo, en kilogramos.",
"chartTitle": "Masa muscular",
"emptyState": {
"title": "Aún no hay datos de masa muscular",
"description": "Las lecturas aparecen aquí cuando una báscula de composición se sincroniza."
}
},
"navMuscleMass": "Masa muscular",
"skinTemperature": {
"title": "Temperatura de la piel",
"description": "La temperatura de la piel de tu muñeca en el tiempo, en grados Celsius.",
"chartTitle": "Temperatura de la piel",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando un wearable sincroniza la temperatura nocturna."
}
},
"navSkinTemperature": "Temp. piel",
"pulseWaveVelocity": {
"title": "Velocidad de onda de pulso",
"description": "Tu velocidad de onda de pulso arterial en el tiempo, en m/s — valores más altos sugieren arterias más rígidas.",
"chartTitle": "Velocidad de onda de pulso",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando un dispositivo Withings compatible se sincroniza."
}
},
"navPulseWaveVelocity": "Velocidad de onda de pulso",
"vascularAge": {
"title": "Edad vascular",
"description": "Tu edad vascular estimada en el tiempo, en años.",
"chartTitle": "Edad vascular",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las estimaciones aparecen aquí cuando un dispositivo Withings compatible se sincroniza."
}
},
"navVascularAge": "Edad vascular",
"visceralFat": {
"title": "Grasa visceral",
"description": "Tu índice de grasa visceral en el tiempo.",
"chartTitle": "Grasa visceral",
"emptyState": {
"title": "Aún no hay datos",
"description": "Los índices aparecen aquí cuando una báscula de composición compatible se sincroniza."
}
},
"navVisceralFat": "Grasa visceral",
"audioExposureEnv": {
"title": "Ruido ambiental",
"description": "Tu exposición media diaria a sonido ambiental, en dBA.",
"chartTitle": "Exposición a sonido ambiental",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas de nivel sonoro aparecen aquí cuando Apple Health sincroniza."
}
},
"navAudioExposureEnv": "Ruido ambiental",
"audioExposureHeadphone": {
"title": "Audio de auriculares",
"description": "Tu exposición media diaria con auriculares, en dBA.",
"chartTitle": "Exposición de auriculares",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navAudioExposureHeadphone": "Audio auriculares",
"timeInDaylight": {
"title": "Tiempo con luz diurna",
"description": "Minutos al día con luz diurna.",
"chartTitle": "Luz diurna por día",
"emptyState": {
"title": "Aún no hay datos",
"description": "Los totales aparecen aquí cuando Apple Health sincroniza un día."
}
},
"navTimeInDaylight": "Luz diurna",
"walkingSteadiness": {
"title": "Estabilidad al andar",
"description": "Tu estabilidad al andar en el tiempo, en porcentaje.",
"chartTitle": "Estabilidad al andar",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navWalkingSteadiness": "Estabilidad al andar",
"audioExposureEvent": {
"title": "Eventos de audio fuerte",
"description": "Días con un evento de exposición a ruido fuerte.",
"chartTitle": "Eventos de ruido por día",
"emptyState": {
"title": "Aún no hay datos",
"description": "Los eventos aparecen aquí cuando Apple Health sincroniza."
}
},
"navAudioExposureEvent": "Eventos de ruido",
"respiratoryRate": {
"title": "Frecuencia respiratoria",
"description": "Tu frecuencia respiratoria en el tiempo, en respiraciones por minuto.",
"chartTitle": "Frecuencia respiratoria",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza la respiración del sueño o del entrenamiento."
}
},
"navRespiratoryRate": "Frecuencia respiratoria",
"leanBodyMass": {
"title": "Masa corporal magra",
"description": "Tu masa corporal magra en el tiempo, en kilogramos.",
"chartTitle": "Masa corporal magra",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando una báscula de composición se sincroniza."
}
},
"navLeanBodyMass": "Masa corporal magra",
"walkingHeartRateAverage": {
"title": "Pulso al caminar",
"description": "Tu frecuencia cardíaca media al caminar, en lpm.",
"chartTitle": "Pulso medio al caminar",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navWalkingHeartRateAverage": "Pulso al caminar",
"walkingAsymmetry": {
"title": "Asimetría al andar",
"description": "Tu asimetría al andar en el tiempo, en porcentaje.",
"chartTitle": "Asimetría al andar",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navWalkingAsymmetry": "Asimetría al andar",
"walkingDoubleSupport": {
"title": "Tiempo de doble apoyo",
"description": "El porcentaje de cada zancada con ambos pies en el suelo.",
"chartTitle": "Tiempo de doble apoyo",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navWalkingDoubleSupport": "Doble apoyo",
"walkingStepLength": {
"title": "Longitud de paso",
"description": "Tu longitud de paso media en el tiempo, en metros.",
"chartTitle": "Longitud de paso",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navWalkingStepLength": "Longitud de paso",
"walkingSpeed": {
"title": "Velocidad al andar",
"description": "Tu velocidad media al andar en el tiempo, en km/h.",
"chartTitle": "Velocidad al andar (km/h)",
"emptyState": {
"title": "Aún no hay datos",
"description": "Las lecturas aparecen aquí cuando Apple Health sincroniza."
}
},
"navWalkingSpeed": "Velocidad al andar",
"mood": {
"heatmapTitle": "Calendario de ánimo",
"heatmapNoEntry": "Sin registro",
"legendGreat": "Genial",
"legendGood": "Bien",
"legendOkay": "Regular",
"legendLow": "Bajo",
"distributionTitle": "Distribución del ánimo",
"distributionDaysUnit": "días",
"weekdayTitle": "Promedio por día de la semana",
"weekdayNoData": "Sin datos",
"weekdayBestWorst": "Mejor día: {best} · Día más difícil: {worst}",
"tagsTitle": "Etiquetas y desencadenantes",
"tagAvgMood": "Ánimo promedio con esta etiqueta",
"correlationsTitle": "Ánimo y otras métricas",
"correlationsDescription": "Cómo se mueve tu ánimo con el sueño, la actividad y el pulso el mismo día.",
"correlation": {
"sleepTitle": "Ánimo vs. sueño",
"stepsTitle": "Ánimo vs. actividad",
"pulseTitle": "Ánimo vs. pulso",
"sleepAxis": "Sueño (min)",
"stepsAxis": "Pasos",
"pulseAxis": "Pulso (lpm)",
"strengthStrong": "Fuerte",
"strengthModerate": "Moderada",
"strengthWeak": "Débil",
"strengthNone": "Ninguna",
"source": "{n} días emparejados · r = {r}",
"emptyTitle": "Aún no hay suficientes datos emparejados",
"emptyDescription": "Registra el ánimo y esta métrica los mismos días para ver una correlación.",
"weightTitle": "Ánimo vs. peso",
"bloodPressureTitle": "Ánimo vs. presión arterial",
"weightAxis": "Peso",
"bloodPressureAxis": "Sistólica (mmHg)",
"sourceLabel": "Cómo se calculó esto"
},
"structuredTagsTitle": "Desglose de etiquetas",
"inTargetValue": "{pct} %",
"inTargetCaption": "de los últimos días en tu rango de buen ánimo",
"narrative": {
"title": "Lo que destaca",
"weekdayDip": "Tu ánimo baja más el {weekday}: {delta} por debajo de tu semana.",
"weekdayPeak": "El {weekday} es siempre tu mejor día, con una media de {value}.",
"trendUp": "Tu ánimo va al alza en los últimos {days} días (+{delta} frente al periodo anterior).",
"trendDown": "Tu ánimo va a la baja en los últimos {days} días (-{delta} frente al periodo anterior).",
"weekendUp": "Te sientes mejor los fines de semana (+{delta} frente a entre semana).",
"weekendDown": "Tu ánimo es más bajo los fines de semana (-{delta} frente a entre semana).",
"tagLift": "Los días con la etiqueta «{tag}» promedian {delta} por encima de tu ánimo general.",
"tagDrop": "Los días con la etiqueta «{tag}» quedan {delta} por debajo de tu media.",
"inTarget": "Has estado en tu rango de buen ánimo el {pct} % de los últimos 30 días.",
"streak": "Has registrado tu ánimo {days} días seguidos: sigue así.",
"timeOfDay": "Te sientes mejor por la {bucket}, con una media de {value}."
},
"timeOfDay": {
"title": "Estado de ánimo por hora del día",
"morning": "Mañana",
"afternoon": "Tarde",
"evening": "Noche",
"night": "Madrugada",
"bestCaption": "Sueles sentirte mejor por la {bucket}."
},
"stability": {
"value": "{score}/100",
"bandVerySteady": "Tu estado de ánimo ha sido muy estable",
"bandSteady": "Tu estado de ánimo ha sido bastante estable",
"bandVariable": "Tu estado de ánimo ha sido notablemente variable",
"bandVeryVariable": "Tu estado de ánimo ha fluctuado mucho últimamente",
"title": "Estabilidad"
},
"influence": {
"title": "Influencia en el estado de ánimo",
"detail": "Promedio de {withAvg} en los {withDays} días que lo etiquetaste, frente a {withoutAvg} sin él.",
"confidenceLow": "Confianza baja",
"confidenceMedium": "Confianza media",
"confidenceHigh": "Confianza alta"
},
"betterDays": {
"title": "Qué acompaña a tus mejores días",
"description": "Etiquetas y métricas que coinciden con tus días de mejor y peor ánimo, ordenadas por la fuerza con que se mueven juntas."
},
"crosstab": {
"title": "Etiquetas y tus métricas de salud",
"description": "Cómo difiere una métrica de salud en los días que etiquetaste cada actividad, frente a los días que no.",
"pairLabel": "{tag} · {metric}",
"metricActiveEnergy": "Energía activa",
"metricSleepDuration": "Sueño",
"metricNextDayRecovery": "Recuperación al día siguiente",
"unitHours": "h",
"unitKcal": "kcal",
"unitScore": "pts",
"detailSameDay": "Promedia {withAvg} {unit} en los {withDays} días que lo etiquetaste frente a {withoutAvg} {unit} sin él.",
"detailNextDay": "Promedia {withAvg} {unit} el día después de los {withDays} días que lo etiquetaste frente a {withoutAvg} {unit} el resto."
},
"factorCrosstab": {
"title": "Tus factores valorados y tus constantes",
"description": "Cómo difiere una constante en los días en que valoraste bajo cada factor frente a los días en que lo valoraste alto.",
"pairLabel": "{factor} · {metric}",
"metricSleepDuration": "Sueño",
"metricSteps": "Pasos",
"metricRestingHeartRate": "Frecuencia cardíaca en reposo",
"metricHrv": "Variabilidad de la frecuencia cardíaca",
"metricWeight": "Peso",
"metricBloodPressureSys": "Sistólica",
"unitHours": "h",
"unitScore": "pts",
"unitSteps": "pasos",
"unitBpm": "ppm",
"unitMs": "ms",
"unitKg": "kg",
"unitMmHg": "mmHg",
"detail": "Promedia {lowAvg} {unit} en los {lowDays} días que valoraste {factor} bajo frente a {highAvg} {unit} en los días que lo valoraste alto.",
"detailInverse": "Promedia {lowAvg} {unit} en tus {lowDays} peores días de {factor} frente a {highAvg} {unit} en los mejores."
},
"discovery": {
"title": "Lo que destaca",
"subheading": "Relaciones descubiertas",
"footer": "Extraídas de {tested} pares de un día a otro probados en todas tus métricas, tras la corrección de falsos descubrimientos.",
"empty": "Todavía ninguna relación de ánimo superó el umbral estadístico. Sigue registrando.",
"disclaimer": "Filtrado estadísticamente, pero aún observacional: un patrón que vale la pena observar, no una causa.",
"moodUp": "Un mayor {factor} suele coincidir con mejor ánimo al día siguiente en tus datos.",
"moodDown": "Un mayor {factor} suele coincidir con peor ánimo al día siguiente en tus datos.",
"outcomeUp": "Mejor ánimo suele coincidir con un {factor} más alto al día siguiente en tus datos.",
"outcomeDown": "Mejor ánimo suele coincidir con un {factor} más bajo al día siguiente en tus datos.",
"stat": "{n} días emparejados · r = {r} · q = {q}",
"statLabel": "Cómo se calculó esto",
"explainerLabel": "Cómo se calculó esto"
},
"inTargetTitle": "En tu rango"
},
"derived": {
"coverage": {
"summary": "{present} de {required} entradas · {percent}%",
"ratioLabel": "{present}/{required}",
"historyDays": "Basado en {count} días de historial",
"missing": "Registra estos para afinar el valor: {list}"
},
"scoreRing": {
"aria": "Puntuación {score} de 100, {band}",
"ariaProvisional": "Puntuación aún no disponible — datos insuficientes",
"provisionalCaption": "Datos aún insuficientes",
"band": {
"green": "bueno",
"yellow": "medio",
"red": "bajo"
}
},
"provenance": {
"title": "Cómo se calcula esto",
"trigger": "Cómo se calcula esto",
"inputsLabel": "Entradas",
"noInputs": "Aún no hay entradas que respalden este valor.",
"methodLabel": "Método",
"window": "De tus últimos {days} días · datos de {source}",
"asOf": "a fecha de {date}",
"standardLink": "Estándar: {name}"
},
"vitals": {
"sectionTitle": "Tus constantes",
"loadingLabel": "Cargando tus constantes",
"loadError": "No se pudieron cargar tus constantes en este momento.",
"building": "Creando tu rango habitual — {count} de {target} días",
"typicalRange": "Habitual para ti: {low}–{high}",
"fitnessYounger": "Forma cardiovascular de alguien ~{years} años más joven",
"fitnessOlder": "Forma cardiovascular ~{years} años por encima de tu edad",
"fitnessTypical": "Forma cardiovascular típica para tu edad",
"fitnessNoNorm": "Añade tu edad y sexo para enmarcar esto",
"vascularBelow": "{years} años por debajo de tu edad",
"vascularAbove": "{years} años por encima de tu edad",
"vascularMatch": "Acorde con tu edad",
"vascularNoAge": "Añade tu fecha de nacimiento para enmarcar esto",
"hrvBand": {
"balanced": "Equilibrado para ti",
"unbalanced": "Por encima de tu rango habitual",
"low": "Por debajo de tu rango habitual"
},
"bmiCategory": {
"underweight": "Bajo peso (OMS)",
"normal": "Rango normal (OMS)",
"overweight": "Sobrepeso (OMS)",
"obese": "Obesidad (OMS)"
},
"sixMinuteBand": {
"green": "{percent}% de lo previsto para tu perfil",
"yellow": "{percent}% de lo previsto para tu perfil",
"red": "{percent}% de lo previsto para tu perfil"
},
"sixMinuteNoBand": "Añade tu edad, altura, peso y sexo para encuadrar esto",
"mobilitySectionTitle": "Movilidad y cuerpo"
},
"anatomy": {
"outOf": "/100",
"contributorsLabel": "Factores",
"contributorValue": "{value} · {weight}% de peso",
"contributorMissing": "sin datos",
"disclaimer": "Indicativo — no es una evaluación clínica.",
"insufficient": "Aún no hay datos suficientes para puntuarlo. Sigue registrando y aparecerá aquí."
},
"composite": {
"SLEEP_SCORE": {
"title": "Puntuación de sueño",
"description": "Una puntuación de calidad del sueño transparente con todos sus subvalores.",
"method": "Una mezcla de 0–100 de suficiencia (sueño frente a tu necesidad por edad), eficiencia (sueño ÷ tiempo en cama), consistencia (qué tan estable es tu punto medio de sueño), horario (frente a tu punto medio habitual) y composición (proporción de REM + sueño profundo). Los subvalores se reponderan en torno a los que tus datos no pueden sustentar; nada se inventa.",
"sub": {
"sufficiency": "Suficiencia",
"efficiency": "Eficiencia",
"consistency": "Consistencia",
"timing": "Horario",
"composition": "Composición"
}
},
"READINESS": {
"title": "Disposición",
"description": "Un indicador diario de bienestar según cómo se sitúan tus señales frente a tu propia base.",
"method": "Una mezcla de 0–100 de desviación de la frecuencia cardíaca en reposo, desviación de la VFC (SDNN), calidad del sueño, estabilidad de la frecuencia respiratoria y estabilidad del estado de ánimo — cada una medida frente a tu base personal. Los pesos se renormalizan según los componentes que tus datos sustentan. Un indicador de bienestar, no una puntuación de recuperación ni clínica.",
"component": {
"rhr": "Frecuencia cardíaca en reposo",
"hrv": "VFC (SDNN)",
"sleep": "Sueño",
"respiratory": "Frecuencia respiratoria",
"mood": "Estabilidad del ánimo"
},
"caveat": "Un indicador de bienestar, no una puntuación de recuperación ni clínica."
},
"VITALS_BASELINE": {
"method": "Tu rango típico personal es la mediana de tus valores diarios en el periodo, ± una dispersión robusta (desviación absoluta mediana, escalada). Sigue TUS lecturas, no una norma poblacional, así que un valor dentro de la banda es típico para ti."
},
"HRV_BALANCE": {
"method": "Tu media reciente de VFC (SDNN) frente a tu propia línea base móvil (mediana ± dispersión robusta). Equilibrada significa que está dentro de tu rango personal; la banda se construye con tus datos, nunca con un umbral poblacional."
},
"BMI": {
"method": "Peso ÷ altura², clasificado según las categorías de la OMS para adultos (bajo peso / normal / sobrepeso / obesidad). Solo es una proporción de cribado: no distingue músculo de grasa."
},
"FITNESS_AGE": {
"method": "Tu VO₂máx situado frente a percentiles de forma cardiorrespiratoria por edad y sexo, expresado como una diferencia de edad de forma física. El VO₂máx es la estimación de tu dispositivo, nunca se recalcula aquí."
},
"VASCULAR_AGE_DELTA": {
"method": "La estimación de edad vascular / velocidad de onda de pulso de tu dispositivo comparada con tu edad cronológica, expresada como una diferencia en años. La estimación es del dispositivo; HealthLog solo la reinterpreta.",
"caveat": "La propia estimación de tu dispositivo, solo reinterpretada: descriptiva, no una evaluación vascular clínica.",
"description": "Cómo se sitúa la estimación de edad vascular de tu dispositivo frente a tu edad cronológica."
},
"COINCIDENT_DEVIATION": {
"method": "Un aviso que aparece cuando dos o más de tus constantes quedan fuera de su rango típico personal el mismo día. Cada banda es la mediana robusta ± k·MAD de tu propio historial, así que se adapta a ti y no a un umbral poblacional.",
"caveat": "Un aviso a partir de tus propias líneas base: descriptivo, no un diagnóstico ni una alerta clínica."
},
"RECOVERY_SCORE": {
"method": "Un indicador nocturno de recuperación de 0 a 100 que combina tu VFC, frecuencia cardíaca en reposo y sueño frente a tu línea base. Más alto significa mejor recuperado. Se calcula una vez por noche y aquí solo se lee, nunca se recalcula al vuelo.",
"caveat": "Un indicador de bienestar descriptivo, no una medida de recuperación clínica ni de nivel de entrenamiento.",
"description": "Un indicador nocturno de recuperación a partir de tu VFC, frecuencia en reposo y sueño."
},
"STRESS_SCORE": {
"method": "Un indicador nocturno de estrés de 0 a 100 a partir de la forma de tu VFC a lo largo del día frente a tu línea base. Más alto significa más carga fisiológica.",
"caveat": "Un indicador derivado de la VFC, NO una medición de estrés por EDA / actividad electrodérmica: tu reloj no tiene sensor EDA. Descriptivo, no clínico.",
"description": "Un indicador nocturno de estrés a partir de la forma de tu VFC durante el día."
},
"STRAIN_SCORE": {
"method": "Un indicador nocturno de esfuerzo de 0 a 100 a partir de tu carga de actividad ponderada por frecuencia cardíaca (un modelo de impulso de entrenamiento tipo TRIMP). Más alto significa un día más exigente.",
"anchorPersonal": "Anclado a tu propia carga reciente de días de entrenamiento: se evalúa en relación con tu esfuerzo habitual, de modo que un día realmente duro para ti aparece alto.",
"anchorPopulation": "Se evalúa frente a una referencia general mientras acumulas historial de entrenamiento; cuando tengas suficiente, pasa a tu propio esfuerzo habitual.",
"caveat": "Un indicador descriptivo de carga de actividad, no una medida de carga clínica ni de nivel de entrenamiento.",
"description": "Un indicador nocturno de carga de actividad a partir de tu esfuerzo ponderado por frecuencia cardíaca, relativo a tu esfuerzo habitual."
},
"WRIST_TEMPERATURE_BASELINE": {
"method": "Tu temperatura típica de muñeca durante la noche es la mediana de tus lecturas nocturnas en el periodo, ± una dispersión robusta (desviación absoluta de la mediana, escalada). Sigue TUS lecturas: la noche pasada se muestra como una desviación respecto a tu propia base, no a una norma poblacional.",
"caveat": "Solo una banda de desviación personal: descriptiva, no una señal de enfermedad, fiebre ni fase del ciclo. Tú la interpretas."
},
"STAIR_ASCENT_SPEED_BASELINE": {
"method": "Tu ritmo típico al subir escaleras es la mediana de tus valores diarios en el periodo, ± una dispersión robusta (desviación absoluta de la mediana, escalada). La banda se construye con tus datos: no hay un umbral poblacional de velocidad en escaleras, porque el ritmo depende de la geometría de la escalera y la longitud de las piernas.",
"caveat": "Una banda personal de tendencia de movilidad: descriptiva, no una evaluación de fragilidad ni de riesgo de caídas."
},
"STAIR_DESCENT_SPEED_BASELINE": {
"method": "Tu ritmo típico al bajar escaleras es la mediana de tus valores diarios en el periodo, ± una dispersión robusta (desviación absoluta de la mediana, escalada). La banda se construye con tus datos: no hay un umbral poblacional de velocidad en escaleras, porque el ritmo depende de la geometría de la escalera y la longitud de las piernas.",
"caveat": "Una banda personal de tendencia de movilidad: descriptiva, no una evaluación de fragilidad ni de riesgo de caídas."
},
"SIX_MINUTE_WALK_BAND": {
"method": "La distancia ESTIMADA de marcha de seis minutos de tu dispositivo situada frente a la referencia de Enright y Sherrill para tu edad, estatura, peso y sexo, como porcentaje de lo previsto. La distancia es la estimación del dispositivo: nunca se recalcula aquí. Sin tu edad, estatura, peso y sexo se oculta el porcentaje y solo se muestran la distancia y la tendencia.",
"caveat": "Una estimación reformulada frente a una referencia publicada: una señal de capacidad funcional, no una prueba clínica de marcha de seis minutos ni un diagnóstico. La referencia se estableció para edades de 40 a 80 años; fuera de ese rango el valor previsto es una extrapolación."
},
"TRAJECTORY": {
"method": "Una recta de mínimos cuadrados ajustada a tus valores diarios recientes y proyectada hacia delante en un horizonte corto, con el intervalo de predicción clásico que se ensancha cuanto más lejos llega. Solo se calcula cuando la tendencia reciente es lo bastante marcada y tu historial es lo bastante largo y actual; de lo contrario no se traza ninguna línea.",
"caveat": "Una proyección de tu propia tendencia reciente, no una predicción, un objetivo ni un pronóstico clínico. Solo se cumple si el patrón reciente continúa; la banda sombreada muestra con qué rapidez se desvanece esa certeza."
}
},
"scores": {
"sectionTitle": "Tus indicadores de salud",
"loadError": "No se pudieron cargar tus puntuaciones de bienestar en este momento.",
"recovery": "Recuperación",
"stress": "Estrés",
"strain": "Esfuerzo"
},
"coincident": {
"label": "Varias constantes fuera de la base",
"summary": "Hoy, {count} de tus constantes quedaron fuera de su rango personal.",
"vitals": "Fuera de rango: {list}",
"cardTitle": "Señales del día",
"allClear": "Hoy todas tus constantes están dentro de su rango personal.",
"allClearMeta": "Se revisaron {count} de tus constantes frente a tu propio rango habitual.",
"watch": "Hoy una constante está fuera de su rango habitual.",
"watchVital": "Fuera de rango: {vital}. A menudo es algo puntual; conviene vigilarlo los próximos días.",
"firedHeadline": "Hoy, {count} de tus constantes están fuera de su rango personal.",
"factors": "Posibles factores, nunca una causa: un entrenamiento intenso, dormir mal, alcohol, altitud, estrés o una enfermedad. Es un aviso a partir de tus propias bases, no un diagnóstico.",
"building": "Construyendo tus bases personales: registra unos días más y esto aparecerá."
},
"trajectory": {
"cardTitle": "Proyección a corto plazo",
"headline": "Si este patrón continúa: los próximos {days} días",
"range": "Proyectado en torno a {low}–{high} {unit} en {days} días.",
"caveat": "Una proyección de tu propia tendencia reciente, no una predicción. La banda sombreada se ensancha para mostrar la rapidez con que crece la incertidumbre.",
"insufficient": "Aún no hay una tendencia lo bastante clara para proyectar: sigue registrando y aparecerá una proyección cuando el patrón reciente sea lo bastante marcado.",
"daysNeeded": "Faltan unos {count} días más de registro para que pueda aparecer una proyección."
}
},
"cardioFitness": {
"title": "Condición física",
"description": "Tu VO₂ máx a lo largo del tiempo, la medida principal de la forma aeróbica.",
"chartTitle": "VO₂ máx (mL/(kg·min))",
"emptyState": {
"title": "Aún no hay datos de condición física",
"description": "Los valores de VO₂ máx aparecen aquí cuando Apple Health los sincroniza desde tus entrenamientos."
}
},
"navCardioFitness": "Condición física",
"cardioRecovery": {
"title": "Recuperación cardiaca",
"description": "Cuánto baja tu frecuencia cardiaca un minuto después del esfuerzo máximo.",
"chartTitle": "Recuperación cardiaca (lpm)",
"emptyState": {
"title": "Aún no hay datos de recuperación cardiaca",
"description": "Los valores de recuperación cardiaca aparecen aquí cuando Apple Health los sincroniza desde un entrenamiento."
}
},
"navCardioRecovery": "Recuperación cardiaca",
"wristTemperature": {
"title": "Temperatura de muñeca",
"description": "Tu temperatura de muñeca durante la noche, comparada con tu valor de referencia.",
"chartTitle": "Temperatura de muñeca (°C)",
"emptyState": {
"title": "Aún no hay datos de temperatura de muñeca",
"description": "Los valores aparecen aquí cuando Apple Health sincroniza el uso nocturno."
}
},
"navWristTemperature": "Temp. muñeca",
"falls": {
"title": "Caídas",
"description": "Caídas fuertes que detectó tu Apple Watch, contadas por día.",
"chartTitle": "Caídas por día",
"emptyState": {
"title": "Aún no hay datos de caídas",
"description": "Las caídas detectadas aparecen aquí cuando Apple Health se sincroniza. Cero caídas es el objetivo."
}
},
"navFalls": "Caídas",
"sixMinuteWalk": {
"title": "Marcha de 6 minutos",
"description": "La estimación de Apple de cuánto podrías caminar en seis minutos.",
"chartTitle": "Distancia en 6 minutos (m)",
"emptyState": {
"title": "Aún no hay datos de marcha de 6 minutos",
"description": "Las estimaciones aparecen aquí cuando Apple Health se sincroniza."
}
},
"navSixMinuteWalk": "Marcha 6 min",
"stairAscentSpeed": {
"title": "Velocidad subiendo escaleras",
"description": "Lo rápido que subes escaleras, medido por tu iPhone o Watch.",
"chartTitle": "Velocidad de subida (m/s)",
"emptyState": {
"title": "Aún no hay datos de subida de escaleras",
"description": "Los valores aparecen aquí cuando Apple Health se sincroniza."
}
},
"navStairAscentSpeed": "Subir escaleras",
"stairDescentSpeed": {
"title": "Velocidad bajando escaleras",
"description": "Lo rápido que bajas escaleras, medido por tu iPhone o Watch.",
"chartTitle": "Velocidad de bajada (m/s)",
"emptyState": {
"title": "Aún no hay datos de bajada de escaleras",
"description": "Los valores aparecen aquí cuando Apple Health se sincroniza."
}
},
"navStairDescentSpeed": "Bajar escaleras",
"breathingDisturbances": {
"title": "Alteraciones respiratorias",
"description": "Con qué frecuencia se alteró tu respiración durante el sueño.",
"chartTitle": "Alteraciones respiratorias del sueño",
"emptyState": {
"title": "Aún no hay datos de alteraciones respiratorias",
"description": "Los valores aparecen aquí cuando Apple Health los sincroniza desde un Apple Watch compatible."
}
},
"navBreathingDisturbances": "Respiración",
"rhythmEvents": {
"sectionTitle": "Notificaciones de salud del dispositivo",
"sectionIntro": "Notificaciones que tu reloj envió por su cuenta. HealthLog solo las muestra — no las detecta, confirma ni interpreta.",
"loadError": "No se pudieron cargar las notificaciones de tu dispositivo.",
"disclaimer": "Estas son alertas que tu dispositivo generó con su propia detección integrada. Se muestran aquí solo para tu información. No es una evaluación médica de HealthLog, y HealthLog no diagnostica ninguna afección. Si una notificación te preocupa, habla con tu médico.",
"event": {
"irregularRhythm": "Notificación de ritmo irregular",
"highHeartRate": "Notificación de frecuencia cardíaca alta",
"lowHeartRate": "Notificación de frecuencia cardíaca baja",
"walkingSteadiness": "Alerta de estabilidad al caminar",
"breathingDisturbance": "Alteración respiratoria durante el sueño"
},
"verdict": {
"irregular": "Tu dispositivo detectó un posible ritmo irregular.",
"notDetected": "Tu dispositivo no detectó un ritmo irregular.",
"inconclusive": "Tu dispositivo no pudo realizar una medición.",
"low": "Tu dispositivo detectó una estabilidad al caminar baja.",
"veryLow": "Tu dispositivo detectó una estabilidad al caminar muy baja.",
"fired": "Tu dispositivo señaló este evento."
}
},
"trendDescriptor": {
"rising": "Al alza en 30 días ({delta}{unit}).",
"falling": "A la baja en 30 días ({delta}{unit}).",
"stable": "Estable en los últimos 30 días.",
"moodImproved": "El estado de ánimo mejoró ligeramente en 30 días.",
"moodDeclined": "El estado de ánimo bajó ligeramente en 30 días.",
"moodStable": "El estado de ánimo se mantuvo estable en los últimos 30 días."
},
"target": {
"heading": "Objetivo"
},
"disclaimer": {
"footer": "HealthLog describe tus propios datos registrados — no es una evaluación clínica ni un diagnóstico. Habla con tu médico sobre cualquier cosa que te preocupe."
},
"settings": {
"overviewTitle": "Organizar la vista general",
"overviewDescription": "Muestra u oculta secciones y define su orden en la vista general de Análisis."
},
"pillOrder": {
"title": "Ordenar las pestañas de navegación",
"description": "Arrastra las pestañas al orden que quieras y muéstralas u ocúltalas con el icono del ojo. Las páginas de detalle ocultas también se quitan de la navegación superior.",
"dragHandle": "Reordenar",
"saveSuccess": "Orden de las pestañas guardado.",
"saveError": "No se pudo guardar el orden de las pestañas.",
"save": "Guardar",
"empty": "Aún no hay pestañas de navegación disponibles."
},
"customize": "Personalizar Análisis",
"regenerateRateLimited": "Límite de actualizaciones alcanzado: inténtalo de nuevo más tarde.",
"regenerateUnavailable": "No llegó un análisis nuevo: inténtalo de nuevo más tarde.",
"regenerateError": "Aún se está actualizando: inténtalo de nuevo en un momento.",
"deviceScore": {
"learning": "Aún estamos aprendiendo tu línea base: unas noches más completarán la tendencia.",
"average": "Media de 30 días {value}",
"unitScore": "puntos",
"unitMinutes": "min",
"unitBpm": "ppm",
"unitKj": "kJ"
},
"sleepQuality": {
"title": "Calidad del sueño",
"subtitle": "Puntuaciones nocturnas de tu wearable"
},
"recovery": {
"title": "Recuperación",
"description": "Cómo se ha recuperado tu cuerpo: las señales de recuperación, esfuerzo y carga que tu wearable registra durante la noche.",
"emptyTitle": "Aún no hay datos de recuperación",
"empty": "Aún no hay datos de recuperación. Conecta una cuenta de WHOOP, Polar u Oura y estas puntuaciones se completarán cuando tu dispositivo sincronice.",
"recharge": {
"title": "Recarga",
"subtitle": "Carga del sistema nervioso autónomo"
},
"strain": {
"title": "Esfuerzo y carga",
"subtitle": "Carga cardiovascular diaria"
},
"cardio": {
"title": "Corazón y energía del día",
"subtitle": "Totales cardiacos y de energía de todo el día"
},
"scoreLink": {
"title": "Puntuación de recuperación",
"subtitle": "Mira cómo se descompone la puntuación nocturna",
"cta": "Ver"
}
},
"bodyTempDeviation": {
"title": "Desviación de la temperatura corporal",
"subtitle": "Variación nocturna respecto a tu línea base"
}
},
"thresholds": {
"defaultLabel": "Por defecto",
"autoModeLabel": "Auto",
"overrideModeLabel": "Personalizado",
"overrideToggleLabel": "Valores propios",
"resetAction": "Restablecer valor por defecto",
"resetAllAction": "Restablecer todos los valores",
"minLabel": "Mín",
"maxLabel": "Máx",
"unitSuffix": "({unit})",
"outOfBoundsHint": "Rango permitido: {min}–{max} {unit}",
"overrideWarning": "Los valores fuera de las guías clínicas pueden dar objetivos poco saludables. Personaliza solo tras consultar con tu médico.",
"saveSuccess": "Objetivos actualizados",
"saveError": "No se han podido guardar los objetivos",
"resetSuccess": "Restablecido al valor por defecto",
"sourceOverride": "Valor propio",
"metricWeight": "Peso",
"metricBpSys": "Tensión arterial (sistólica)",
"metricBpDia": "Tensión arterial (diastólica)",
"metricPulse": "Pulso en reposo",
"metricBodyFat": "Grasa corporal",
"metricSleep": "Duración del sueño",
"metricSteps": "Pasos/día",
"metricGlucoseFasting": "Glucemia — en ayunas",
"metricGlucosePostprandial": "Glucemia — posprandial",
"metricGlucoseRandom": "Glucemia — cualquiera",
"metricGlucoseBedtime": "Glucemia — antes de dormir",
"metricBodyWater": "Agua corporal",
"metricBoneMass": "Masa ósea",
"metricOxygenSaturation": "Saturación de oxígeno (SpO₂)",
"unsetExplanation": "Sin valor propio — se aplica el valor por defecto calculado."
},
"onboarding": {
"errorGeneric": "Algo ha salido mal al finalizar la configuración. Inténtalo de nuevo.",
"tour": {
"stepOf": "Paso {current} de {total}",
"next": "Siguiente",
"back": "Atrás",
"skip": "Saltar tour",
"done": "Entendido",
"restart": "Reiniciar tour",
"restartHint": "Vuelve a mostrar el tour del panel la próxima vez.",
"restartConfirmation": "El tour se reiniciará en tu próxima visita al panel.",
"steps": {
"tileStrip": {
"title": "Tus valores del día",
"body": "La fila de tarjetas muestra el último valor y la tendencia de 7 días de cada métrica — peso, tensión arterial, pulso, ánimo. Oculta lo que no necesites en Ajustes → Panel."
},
"quickAdd": {
"title": "Registrado en dos toques",
"body": "Con el botón Añadir puedes registrar mediciones o entradas de ánimo sin salir del panel. El formulario recuerda tu último contexto y etiquetas."
},
"insights": {
"title": "Insights automáticos",
"body": "Insights convierte tus valores en un resumen claro de salud, con interpretación de tensión arterial, peso y ánimo. Clave propia o por defecto — tú eliges."
},
"integrations": {
"title": "Conectar dispositivos",
"body": "En Ajustes conectas Withings (sincronización automática de peso, tensión y pulso), moodLog o tu proveedor de análisis. Todo es opcional y queda cifrado."
},
"achievements": {
"title": "Acumula rachas e insignias",
"body": "La página de Logros lleva la cuenta de rachas de registro diario, hitos de tensión arterial e insignias de constancia. Un pequeño empujón para no abandonar."
}
}
},
"shell": {
"back": "Atrás",
"skip": "Omitir",
"next": "Continuar",
"step1of4": "Paso 1 de 4",
"step2of4": "Paso 2 de 4",
"step3of4": "Paso 3 de 4",
"step4of4": "Paso 4 de 4"
},
"goals": {
"title": "¿Qué te gustaría registrar?",
"body": "Elige las áreas que te interesan: las mostraremos primero en tu panel y te ayudarán a decidir qué configurar a continuación.",
"helpHint": "Una a tres prioridades suelen funcionar mejor — siempre podrás añadir más más adelante.",
"options": {
"weightManagement": "Control del peso",
"bpTracking": "Presión arterial",
"glucoseTracking": "Glucosa",
"sleepImprovement": "Mejor sueño",
"medicationCompliance": "Medicamentos",
"generalWellness": "Bienestar general"
}
},
"source": {
"title": "Conectar una fuente",
"body": "Importa las mediciones automáticamente o sigue con la entrada manual. Aquí no se configura nada por ti: cada tarjeta solo muestra dónde conectarla.",
"recommended": "Recomendado",
"manual": {
"title": "Entrada manual",
"body": "Registra tus mediciones tú mismo cuando te venga bien. Funciona en cualquier dispositivo, sin cuenta de terceros."
},
"withings": {
"title": "Withings",
"body": "Las básculas, los tensiómetros y los trackers de Withings se sincronizan automáticamente.",
"cta": "Conectar Withings"
},
"more": {
"title": "Más fuentes",
"body": "Conecta cualquiera de ellas en Ajustes cuando quieras.",
"appleHealth": "Apple Health",
"whoop": "WHOOP",
"oura": "Oura",
"polar": "Polar",
"nightscout": "Nightscout",
"fitbit": "Fitbit"
},
"import": "Importar historial existente"
},
"baseline": {
"title": "Cuéntanos sobre ti",
"body": "Cuatro campos opcionales afinan los valores objetivo, el IMC y los recordatorios. Podrás ajustarlo todo más tarde desde Ajustes.",
"displayNameLabel": "Nombre para mostrar",
"displayNamePlaceholder": "¿Cómo debería llamarte HealthLog?",
"displayNameHint": "Aparece en el saludo del panel y en los informes.",
"heightLabel": "Altura (cm)",
"genderLabel": "Sexo",
"genderNone": "Prefiero no decirlo",
"genderMale": "Hombre",
"genderFemale": "Mujer",
"dateOfBirthLabel": "Fecha de nacimiento",
"dateOfBirthHint": "Se utiliza solo para análisis sensibles a la edad.",
"saveCta": "Guardar y continuar"
},
"done": {
"title": "Todo listo",
"body": "Bienvenido a bordo. Tu panel ya está preparado.",
"returnCta": "Abrir el panel",
"learning": "Algunas conclusiones —glucosa, ritmo de sueño, tendencias de presión arterial, ciclo— se afinan durante la primera semana o dos a medida que se acumulan tus datos. Las casillas vacías ahora solo significan que aún estamos aprendiendo tu línea base.",
"connectCta": "Conectar un dispositivo",
"logCta": "Registra tu primera medición",
"importCta": "Importar historial existente"
},
"welcomeBack": {
"title": "Bienvenido de nuevo",
"body": "Ya completaste la configuración inicial. Para cambiar algo, abre Ajustes — todo lo que configuraste se puede editar desde ahí.",
"cta": "Abrir el panel"
},
"welcome": {
"title": "Bienvenido a HealthLog",
"carouselLabel": "Carrusel de bienvenida",
"slideOf": "Diapositiva {current} de {total}",
"prevSlide": "Diapositiva anterior",
"nextSlide": "Diapositiva siguiente",
"gotoSlide": "Ir a la diapositiva {index}",
"cta": "Empezar",
"slide1": {
"title": "Registra cada señal",
"body": "Peso, presión, glucosa, sueño, ánimo — todo en un único registro que es tuyo."
},
"slide2": {
"title": "Conecta tus fuentes",
"body": "Sincroniza con Apple Health y Withings o añade datos a mano. Tus datos se quedan en tu servidor."
},
"slide3": {
"title": "Descubre los patrones",
"body": "Resúmenes diarios, gráficas de tendencias y un coach que destaca lo que cambió — todo en tu propio dispositivo."
}
},
"anamnesis": {
"title": "Sobre tu salud (opcional)",
"subtitle": "Un poco de contexto para que HealthLog interprete tus valores de forma más justa.",
"intro": "Comparte lo que quieras: cada campo es opcional y puedes editarlo cuando quieras en Ajustes.",
"conditionsLabel": "Afecciones actuales",
"conditionsPlaceholder": "p. ej. hipertensión, diabetes tipo 2",
"conditionsHint": "Ayuda a HealthLog a interpretar tus lecturas en contexto en lugar de marcar lo esperado.",
"allergiesLabel": "Alergias o intolerancias",
"allergiesPlaceholder": "p. ej. penicilina, lactosa",
"privacyNote": "Se almacena cifrado y solo se usa para darte mejor contexto. Aquí no te pedimos tu medicación: puedes añadirla cuando quieras desde la página de Medicación."
}
},
"gettingStarted": {
"title": "Primeros pasos",
"subtitle": "Quick wins para sacar el máximo provecho a HealthLog.",
"progress": "{done} de {total} completados",
"dismissAll": "Ocultar la lista",
"dismissTooltip": "Ocultar este punto",
"items": {
"profileTitle": "Configurar el perfil",
"profileDescription": "Altura, fecha de nacimiento y sexo desbloquean objetivos personalizados.",
"profileCta": "Abrir perfil",
"measurementTitle": "Registrar la primera medición",
"measurementDescription": "Una medición activa la tarjeta — la tendencia se dibuja a partir de la 5.ª medición.",
"measurementCta": "Añadir medición",
"medicationTitle": "Añadir medicamento",
"medicationDescription": "Sigue el cumplimiento y recibe recordatorios justo cuando los necesites.",
"medicationCta": "Añadir medicamento",
"dataSourceTitle": "Conectar una fuente de datos (opcional)",
"dataSourceDescription": "Sincroniza peso, presión, sueño y más desde Withings, WHOOP, Oura, Polar, Nightscout, Fitbit o Apple Health.",
"dataSourceCta": "Conectar",
"notificationsTitle": "Configurar notificaciones",
"notificationsDescription": "Elige cómo te recuerda HealthLog — Telegram, ntfy o Web Push.",
"notificationsCta": "Abrir notificaciones"
}
},
"trendHints": {
"title": "Primera tendencia tras 5 mediciones",
"remainingOne": "Falta 1 medición para la tendencia.",
"remainingMany": "Faltan {count} mediciones para la tendencia."
},
"settings": {
"researchMode": {
"sectionTitle": "Modo Investigación",
"subtitle": "Visualización opcional de una curva estimada del nivel de fármaco GLP-1, derivada de la farmacocinética poblacional publicada por la EMA. Solo lectura: nunca una medición ni un consejo médico.",
"toggleLabel": "Mostrar la curva estimada del nivel de fármaco",
"disabledStatus": "Desactivado. La curva está oculta.",
"enabledStaleStatus": "El disclaimer se actualizó. Reconfirma debajo para volver a mostrar la curva.",
"acknowledgedOn": "Confirmado el {date}.",
"rePromptTitle": "Disclaimer actualizado",
"rePromptBody": "El disclaimer del modo Investigación se actualizó desde tu última confirmación. Relelo y reconfirma para mantener la curva visible.",
"rePromptCta": "Reconfirmar disclaimer",
"disableError": "No se pudo desactivar el modo Investigación. Inténtalo de nuevo."
},
"shell": {
"sectionsNav": "Secciones de ajustes"
},
"sections": {
"account": {
"title": "Cuenta",
"description": "Perfil, contraseña, claves de acceso y tu recorrido de incorporación."
},
"integrations": {
"title": "Integraciones",
"description": "Withings, moodLog y otros servicios conectados."
},
"notifications": {
"title": "Notificaciones",
"description": "Vista en vivo de cada canal configurado."
},
"layout": {
"title": "Diseño y personalización",
"description": "Organiza cómo está dispuesta tu app — un único lugar para el panel, los análisis, los medicamentos y el ánimo.",
"backToHub": "Volver a Diseño y personalización",
"dashboard": {
"title": "Panel",
"description": "Diseño y orden de los mosaicos."
},
"insights": {
"title": "Análisis",
"description": "Orden de la vista general y de las pestañas de navegación."
},
"medications": {
"title": "Medicamentos",
"description": "Vista de lista y orden de los medicamentos."
},
"mood": {
"title": "Etiquetas de ánimo",
"description": "Grupos, etiquetas y orden del selector de ánimo."
}
},
"dashboard": {
"title": "Panel",
"description": "Diseño y orden de los mosaicos."
},
"thresholds": {
"title": "Objetivos",
"description": "Por métrica: tu propio rango objetivo de valores saludables."
},
"sources": {
"title": "Prioridad de fuentes",
"description": "Elige qué fuente prevalece cuando varias registran la misma métrica el mismo día.",
"integrationsHint": "Conecta o desconecta fuentes de datos en la página de integraciones.",
"integrationsHintLink": "Abrir integraciones",
"cardTitle": "Prioridad de fuentes por métrica",
"help": "Si varias fuentes entregan el mismo valor el mismo día, la fuente superior cuenta como canónica. Las demás se conservan para la traza de auditoría.",
"resetDefaults": "Restablecer valores predeterminados",
"moveUp": "Subir",
"moveDown": "Bajar",
"saveSuccess": "Prioridad de fuentes guardada.",
"saveError": "No se pudo guardar la prioridad de fuentes.",
"resetSuccess": "Prioridad de fuentes restablecida a los valores predeterminados.",
"perMetricToggle": "Ajustes por métrica ({count})",
"perMetricHelp": "Métricas que has personalizado respecto al orden predeterminado. Usa esta lista para devolver cualquier métrica concreta a su valor predeterminado sin tocar las demás.",
"perMetricEmpty": "No hay ajustes por métrica — todas las métricas usan el orden global de arriba.",
"resetMetric": "Restablecer",
"deviceTypeToggle": "Prioridad por tipo de dispositivo ({count})",
"deviceTypeHelp": "Dentro de una fuente, qué dispositivo prevalece. Cuando un Apple Watch y un iPhone registran ambos los pasos, el tipo de dispositivo mejor clasificado cuenta como la lectura canónica.",
"deviceTypeDefault": "Orden predeterminado por tipo de dispositivo",
"resetDeviceTypes": "Restablecer tipos de dispositivo",
"metrics": {
"steps": "Pasos",
"activeEnergy": "Energía activa",
"walkingRunningDistance": "Distancia a pie + corriendo",
"flightsClimbed": "Pisos subidos",
"sleep": "Sueño",
"weight": "Peso",
"bloodPressure": "Presión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"bodyTemperature": "Temperatura corporal",
"spo2": "Saturación de oxígeno",
"hrv": "Variabilidad de la frecuencia cardíaca",
"restingHeartRate": "Frecuencia cardíaca en reposo",
"vo2Max": "VO2 máx.",
"skinTemperature": "Temperatura de la piel",
"respiratoryRate": "Frecuencia respiratoria",
"recovery": "Recuperación"
},
"sourceLabels": {
"WITHINGS": "Withings",
"APPLE_HEALTH": "Apple Health",
"MANUAL": "Entrada manual",
"IMPORT": "Importar",
"WHOOP": "WHOOP",
"FITBIT": "Fitbit",
"COMPUTED": "Calculado"
},
"deviceLabels": {
"watch": "Reloj",
"band": "Pulsera",
"ring": "Anillo",
"phone": "Teléfono",
"scale": "Báscula",
"other": "Otro",
"unknown": "Desconocido"
}
},
"ai": {
"title": "Análisis con IA",
"description": "Proveedor, modelo, clave."
},
"api": {
"title": "API & Tokens",
"description": "Tokens Bearer para tus propios scripts y apps — registra mediciones o tomas de medicación desde cualquier lugar."
},
"advanced": {
"title": "Avanzado",
"description": "Activador opt-in del modo Investigación y zona de peligro para borrar irrevocablemente todos los registros de salud."
},
"export": {
"title": "Exportar e importar",
"description": "Descarga tus datos de salud como PDF, CSV o una copia de seguridad JSON completa, o importa datos desde Apple Health o un archivo JSON.",
"otherOptionsHeading": "Otras opciones de exportación",
"downloadFailed": "No se pudo descargar la exportación. Inténtalo de nuevo.",
"hero": {
"eyebrow": "Cita médica",
"valueStatement": "Un informe PDF imprimible para tu cita médica — constantes, IMC, clasificación de la tensión, cumplimiento de la medicación y (opcionalmente) el estado de ánimo, en pocas páginas.",
"cta": "Configurar y generar informe",
"formatHint": "PDF · listo para imprimir"
},
"actions": {
"download": "Descargar"
},
"filters": {
"since": "Desde",
"until": "Hasta"
},
"cards": {
"doctorReport": {
"title": "Informe médico",
"description": "PDF imprimible para la cita médica — constantes vitales, IMC, clasificación de la presión arterial, cumplimiento de la medicación, estado de ánimo."
},
"measurementsCsv": {
"title": "Mediciones",
"description": "Peso, presión arterial, pulso, glucosa y todas las demás mediciones como valores separados por comas."
},
"medicationsCsv": {
"title": "Medicamentos",
"description": "Tu lista de medicación con dosis, horarios y (opcionalmente) el historial completo de tomas.",
"includeIntake": "Incluir historial de tomas"
},
"moodCsv": {
"title": "Estado de ánimo",
"description": "Entradas de estado de ánimo diarias con puntuación, etiquetas y marcas de tiempo."
},
"fullBackup": {
"title": "Copia completa",
"description": "Un único archivo JSON con todo — el mismo formato que la copia automática semanal. Útil para restaurar tú mismo mediante la carga de administrador."
},
"cycle": {
"title": "Ciclo",
"description": "Datos del ciclo y de salud reproductiva como documento FHIR: última menstruación, duración media del ciclo y del periodo, fase actual."
}
},
"import": {
"heading": "Importar",
"description": "Importa datos a HealthLog desde una exportación de Apple Health o un archivo JSON. La importación omite las filas que ya existen, así que repetirla es seguro.",
"charCount": "{used} / {max} caracteres",
"appleHealth": {
"title": "Apple Health",
"description": "Sube el archivo export.zip de la app Salud del iPhone (Perfil → Exportar todos los datos de salud).",
"dropLabel": "Suelta export.zip aquí",
"dropHint": "o haz clic para elegir un archivo",
"fileInputLabel": "Elegir un archivo export.zip de Apple Health",
"choose": "Elegir archivo",
"idempotencyNote": "Volver a subir el mismo archivo lo fusiona; no crea duplicados. Los archivos grandes se procesan en segundo plano.",
"uploading": "Subiendo…",
"uploadFailed": "Error al subir. Inténtalo de nuevo.",
"rateLimited": "Demasiadas subidas. Espera un momento e inténtalo de nuevo.",
"tooLarge": "El archivo es demasiado grande (límite 1,5 GB).",
"failed": "La importación falló.",
"rowsImported": "{count} filas importadas hasta ahora",
"doneSummary": "Listo: {imported} de {read} registros importados, {skipped} registros clínicos omitidos.",
"phase": {
"queued": "En cola…",
"unpacking": "Descomprimiendo el archivo…",
"parsing": "Leyendo la exportación…",
"upserting": "Importando registros…"
}
},
"json": {
"title": "Archivo JSON",
"description": "Pega JSON o sube un archivo .json con mediciones y entradas de ánimo.",
"pasteLabel": "Pegar JSON",
"fileInputLabel": "Elegir un archivo JSON para importar",
"schemaHint": "Dos arrays: measurements y moodEntries.",
"docsLink": "Ver el esquema y un ejemplo.",
"uploadFile": "Subir archivo",
"downloadExample": "Descargar ejemplo",
"import": "Importar",
"invalidJson": "Eso no es JSON válido. Revisa la sintaxis e inténtalo de nuevo.",
"invalidPayload": "Los datos no coinciden con el esquema de importación.",
"rateLimited": "Demasiadas importaciones esta hora (límite 5). Inténtalo más tarde.",
"failed": "La importación falló. Inténtalo de nuevo.",
"readFailed": "No se pudo leer ese archivo.",
"resultSummary": "{measurements} mediciones y {moods} entradas de ánimo importadas, {skipped} omitidas."
},
"csv": {
"title": "Archivo CSV",
"description": "Importa mediciones desde una hoja de cálculo o la exportación de un medidor. Una fila por lectura.",
"pasteLabel": "Pegar CSV",
"fileInputLabel": "Elegir un archivo CSV para importar",
"schemaHint": "Columnas: type, value, unit, measuredAt (con desfase de zona horaria) y opcionales glucoseContext, notes, externalId.",
"docsLink": "Ver el esquema de columnas y un ejemplo.",
"uploadFile": "Subir archivo",
"downloadExample": "Descargar ejemplo",
"preview": "Vista previa",
"import": "Importar",
"empty": "Añade al menos una fila CSV antes de importar.",
"rateLimited": "Demasiadas importaciones esta hora (límite 5). Inténtalo más tarde.",
"tooLarge": "Ese archivo es demasiado grande (límite 16 MB).",
"invalidPayload": "No se pudo analizar el CSV. Revisa la fila de encabezado e inténtalo de nuevo.",
"failed": "La importación falló. Inténtalo de nuevo.",
"readFailed": "No se pudo leer ese archivo.",
"previewSummary": "Vista previa: {inserted} se importarían, {skipped} omitidas.",
"resultSummary": "{inserted} nuevas importadas y {updated} actualizadas, {skipped} omitidas.",
"rowError": "Línea {line}: {reason}"
}
}
},
"about": {
"title": "Acerca de esta app",
"description": "Versión, licencia, enlaces."
},
"sharing": {
"title": "Compartir",
"description": "Crea un enlace de solo lectura para compartir tu historial de salud con un profesional médico."
},
"insights": {
"title": "Análisis",
"description": "Orden de la vista general y de las pestañas de navegación."
},
"medications": {
"title": "Medicamentos",
"description": "Vista de lista y orden de los medicamentos."
},
"mood": {
"title": "Etiquetas de ánimo",
"description": "Grupos, etiquetas y orden del selector de ánimo."
},
"reminders": {
"title": "Recordatorios y notificaciones",
"description": "Un único lugar para cada recordatorio — qué se recuerda y cuándo — y los canales que lo entregan.",
"categoriesGroup": "Recordatorios",
"channelsGroup": "Canales de entrega",
"medication": {
"title": "Recordatorios de medicación",
"description": "Horas y ventanas de dosis, configuradas en cada medicamento."
},
"vorsorge": {
"title": "Cuidado preventivo",
"description": "Revisiones y mediciones periódicas, con el lugar al que acudir."
},
"mood": {
"title": "Registro de ánimo",
"description": "Un aviso diario para registrar cómo te sientes."
},
"lowStock": {
"title": "Margen por bajo stock",
"description": "Recibe un aviso antes de que se acabe un medicamento."
},
"coach": {
"title": "Sugerencia del coach",
"description": "Indicaciones proactivas del coach de IA."
},
"channels": {
"title": "Canales de notificación",
"description": "APNs, Telegram, ntfy, Web Push, Webhook y correo."
}
}
},
"profile": "Perfil",
"language": "Idioma",
"languageDescription": "Elige el idioma de visualización de la aplicación.",
"timeFormat": {
"title": "Formato horario",
"description": "Determina si las horas se muestran en formato de 24 horas o de 12 horas (AM/PM).",
"auto": "Automático (idioma)",
"h24": "24 horas",
"h12": "12 horas (AM/PM)",
"saved": "Formato horario guardado.",
"saveError": "No se pudo guardar el formato horario."
},
"username": "Nombre de usuario",
"height": "Altura (cm)",
"dateOfBirth": "Fecha de nacimiento",
"dateOfBirthHint": "Se usa para el cálculo automático de los objetivos de presión arterial.",
"gender": "Sexo",
"genderNone": "Sin especificar",
"genderMale": "Hombre",
"genderFemale": "Mujer",
"genderHint": "Se usa para valores objetivo específicos por sexo.",
"timezone": "Zona horaria",
"timezoneHint": "Se usa para las etiquetas de los ejes de los gráficos, las horas de recordatorio, las marcas de tiempo de exportación y el contexto del Coach. Los datos almacenados no cambian.",
"timezoneInvalid": "No es una zona horaria IANA válida.",
"profileSaved": "Perfil guardado",
"avatar": {
"title": "Foto de perfil",
"description": "Sube una foto que se almacena en tu propio servidor. Aparece en toda la aplicación en lugar de un servicio de avatares externo.",
"upload": "Subir foto",
"replace": "Reemplazar foto",
"remove": "Quitar",
"hint": "JPEG, PNG o WebP. Hasta 2 MB y 2048×2048 píxeles.",
"uploaded": "Foto de perfil actualizada",
"removed": "Foto de perfil eliminada",
"invalidType": "Tipo de imagen no admitido. Usa JPEG, PNG o WebP.",
"tooLarge": "La imagen supera el límite de 2 MB.",
"error": "No se pudo actualizar la foto de perfil. Inténtalo de nuevo."
},
"changePassword": "Cambiar contraseña",
"changePasswordDescription": "Sustituye tu contraseña actual por una nueva.",
"passwordReset": "Restablecer contraseña",
"currentPassword": "Contraseña actual",
"newPassword": "Nueva contraseña",
"confirmNewPassword": "Confirmar nueva contraseña",
"passwordMismatch": "Las nuevas contraseñas no coinciden",
"passwordUpdated": "Contraseña actualizada correctamente",
"passkeys": "Passkeys",
"registeredPasskeys": "Claves de acceso registradas",
"passkeysDescription": "Las claves de acceso permiten iniciar sesión de forma segura sin contraseña.",
"passkeyName": "Nombre",
"passkeyDevice": "Dispositivo",
"passkeyBackup": "Backup",
"passkeyCreated": "Creada",
"passkeyActions": "Acciones",
"noPasskeys": "No hay claves de acceso registradas.",
"addPasskey": "Añadir clave de acceso",
"passkeyAdded": "¡Clave de acceso añadida correctamente!",
"passkeyOptionsError": "No se pudieron cargar las opciones de la clave de acceso",
"passkeyRegistrationFailed": "Falló el registro de la clave de acceso",
"passkeyRegistrationCancelled": "Registro de la clave de acceso cancelado",
"passkeyNotSupported": "Tu navegador o dispositivo aún no admite claves de acceso. Prueba con otro navegador o dispositivo.",
"passkeyAlreadyRegistered": "Este dispositivo ya está registrado como clave de acceso de tu cuenta.",
"passkeySecurityBlocked": "Tu navegador bloqueó la solicitud de clave de acceso por motivos de seguridad. Asegúrate de estar en un origen HTTPS de confianza e inténtalo de nuevo.",
"passkeyTimeout": "La solicitud de la clave de acceso expiró. Inténtalo de nuevo.",
"passkeyUnknownError": "Falló el registro de la clave de acceso: {message}",
"deletePasskey": "¿Eliminar clave de acceso?",
"deletePasskeyDescription": "La clave de acceso se eliminará de forma permanente.",
"singleDevice": "Un solo dispositivo",
"multiDevice": "Varios dispositivos",
"backedUp": "con copia de seguridad",
"telegram": "Telegram Notifications",
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
"botToken": "Token del bot",
"chatId": "ID del chat",
"enableNotifications": "Activar notificaciones",
"telegramStep1": "1. Crea un bot con @BotFather en Telegram y copia el token.",
"telegramStep2": "2. Envía /start a tu bot para activar el chat.",
"telegramStep3": "3. Obtén tu ID del chat con @userinfobot o la API del bot.",
"ntfy": "ntfy",
"ntfyDescription": "Notificaciones a través de ntfy (autoalojado o ntfy.sh).",
"ntfyEnable": "Activar ntfy",
"ntfyServer": "URL del servidor",
"ntfyTopic": "Topic",
"ntfyAuthToken": "Token de autenticación (opcional)",
"ntfyAuthTokenHint": "Solo necesario para temas privados con control de acceso.",
"webhook": "Webhook",
"webhookDescription": "Envía notificaciones por POST a cualquier URL: Gotify, Discord, Slack, Matrix o Home Assistant.",
"webhookEnable": "Activar webhook",
"webhookUrl": "URL del webhook",
"webhookUrlHint": "La URL completa para el POST. Debe ser accesible públicamente.",
"webhookHeaderName": "Nombre de cabecera (opcional)",
"webhookHeaderValue": "Valor de cabecera (opcional)",
"email": "Correo electrónico",
"emailDescription": "Recibe alertas y recordatorios por correo electrónico.",
"emailEnable": "Activar correo electrónico",
"emailRecipient": "Dirección del destinatario",
"webPush": "Push del navegador",
"webPushDescription": "Recibe notificaciones directamente en tu navegador, incluso cuando HealthLog no está abierto.",
"webPushNotSupported": "Tu navegador no admite notificaciones push.",
"webPushDenied": "Las notificaciones push están bloqueadas. Permítelas en los ajustes de tu navegador.",
"webPushNotConfigured": "Web Push no está configurado en el servidor.",
"webPushSubscribe": "Activar push",
"webPushUnsubscribe": "Desactivar push",
"webPushSubscribed": "¡Notificaciones push activadas!",
"webPushUnsubscribed": "Notificaciones push desactivadas.",
"webPushSubscribeFailed": "Falló la activación",
"webPushActive": "Activo",
"kiInsightsDescription": "Opcional: guarda tu clave de OpenAI para análisis diarios y automáticos en Insights.",
"codexConnected": "¡ChatGPT conectado correctamente! Insights ya está activo.",
"codexDisconnected": "Conexión con ChatGPT eliminada.",
"codexConnectionFailed": "Falló la conexión con ChatGPT. Inténtalo de nuevo.",
"rawData": "Enviar datos en bruto",
"rawDataOnDescription": "Se envían métricas agregadas más puntos individuales anonimizados de los últimos 30 días con contexto temporal — nunca el nombre, el correo electrónico ni los identificadores directos de la cuenta.",
"rawDataOffDescription": "Solo se envían métricas resumidas (por ejemplo, promedios, tendencias, mínimo/máximo) — sin puntos individuales ni contexto temporal exacto.",
"rawDataWarning": "Modo en bruto activado: el proveedor recibe puntos anonimizados adicionales de los últimos 30 días para un análisis más preciso.",
"regenerateInsights": "Regenerar informes",
"regenerateSuccess": "Informes regenerados correctamente",
"regenerateRateLimit": "Espera un momento — has alcanzado el límite por hora de análisis.",
"lastGeneratedAt": "Generado por última vez",
"ai": {
"chatgptConnectedBadge": "ChatGPT conectado",
"adminAiActiveBadge": "Proveedor de administrador activo",
"connectionExpiredBadge": "Conexión caducada",
"connectedSince": "Conectado desde {when}.",
"deviceCodeHeading": "Termina de conectar en chatgpt.com",
"deviceCodeStep1": "Abre este enlace en cualquier dispositivo:",
"deviceCodeStep2": "Introduce este código de un solo uso:",
"deviceCodeStep3": "Aprueba la conexión — esta página se actualiza automáticamente.",
"deviceCodeCopy": "Copiar",
"deviceCodeWaiting": "Esperando aprobación…",
"deviceCodeCancel": "Cancelar",
"oauthNotConfigured": "El OAuth de ChatGPT no está configurado en esta instancia — usa tu propia clave de API a continuación.",
"modelLabel": "Modelo",
"modelOptionDefault": "— Predeterminado —",
"modelOptionCustom": "Personalizado…",
"customModelLabel": "Nombre del modelo personalizado",
"anthropicKeyLabel": "Clave de API de Anthropic",
"baseUrlLabel": "Base URL",
"localKeyLabel": "Clave de API (opcional)",
"savedPreview": "(guardada {preview})",
"savedShort": "(guardada)",
"saveCta": "Guardar",
"saved": "Guardado",
"saveFailed": "Falló el guardado",
"errorGeneric": "Error",
"providerChain": {
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (tu clave)",
"anthropic": "Anthropic (Claude)",
"local": "Modelo local",
"admin-openai": "OpenAI de administrador"
},
"title": "Cadena de respaldo",
"description": "Si el proveedor principal falla, HealthLog recorre la cadena en orden. Arrastra las filas para reordenarlas; usa el interruptor para desactivar un proveedor sin eliminarlo.",
"moveUp": "Subir",
"moveDown": "Bajar",
"removeFromChain": "Quitar de la cadena",
"addProvider": "Añadir proveedor",
"addNoneAvailable": "Todos los proveedores ya están en la cadena",
"saveOrder": "Guardar el orden de la cadena",
"saved": "Cadena guardada",
"saveFailed": "Falló el guardado de la cadena",
"resetDefaults": "Restablecer",
"resetConfirmTitle": "¿Restablecer la cadena a los valores predeterminados?",
"resetConfirmBody": "La cadena vuelve a Codex → OpenAI → Anthropic → Local → OpenAI de administrador. Tus credenciales guardadas no se modifican."
},
"providerCardTitle": "Proveedor de IA",
"activeProviderHeading": "Proveedor activo",
"activeProviderBody": "Elige el proveedor que quieres usar primero. El formulario de abajo configura únicamente el proveedor seleccionado; la cadena de respaldo del final decide qué ocurre si falla.",
"activeProviderLabel": "Proveedor principal",
"providerConfigTitle": "Configuración del proveedor",
"providerSelect": {
"codex": "Cuenta de ChatGPT (Codex)",
"openai": "OpenAI (tu clave de API)",
"anthropic": "Anthropic (Claude)",
"local": "Modelo local (compatible con OpenAI)",
"admin-openai": "OpenAI proporcionado por el administrador"
},
"openai": {
"modelSelect": "Modelo",
"modelOptionCustom": "Slug personalizado…",
"modelCustomLabel": "Slug del modelo personalizado",
"modelCustomPlaceholder": "gpt-5",
"baseUrlLabel": "URL base (avanzado)",
"baseUrlPlaceholder": "https://api.openai.com/v1",
"baseUrlHelp": "Sobrescribe solo cuando uses una pasarela compatible con OpenAI. Déjalo en blanco para OpenAI directamente.",
"showAdvanced": "Mostrar opciones avanzadas",
"hideAdvanced": "Ocultar opciones avanzadas",
"apiKey": "Clave de API",
"apiKeyPlaceholder": "sk-…"
},
"codex": {
"statusConnected": "Conectado",
"statusDisconnected": "No conectado",
"statusExpired": "Conexión caducada",
"connectButton": "Conectar con ChatGPT",
"disconnectButton": "Desconectar",
"modelSlugLabel": "Slug del modelo",
"modelSlugBody": "Codex usa el modelo al que enruta tu suscripción de ChatGPT. La variable de entorno CODEX_MODEL permite al operador sobrescribirlo en la instancia.",
"lastInsight": "Último análisis: {when}"
},
"adminOpenai": {
"title": "OpenAI de administrador",
"body": "Clave de OpenAI proporcionada por el operador, usada como último recurso sin proveedor personal. No hay nada que configurar aquí.",
"notConfigured": "El operador no ha configurado una clave de OpenAI compartida en esta instancia."
},
"testProvider": "Probar el proveedor activo",
"testSuccess": "OK — {provider} ({model})",
"testFailedShort": "Prueba fallida: {message}",
"testUnexpectedResponse": "Falló la conexión con el proveedor de IA — respuesta inesperada del servidor.",
"testReasonCredentials": "El proveedor rechazó las credenciales — vuelve a autenticarte en los ajustes de IA.",
"testReasonRateLimited": "El proveedor limitó la solicitud — inténtalo de nuevo en breve.",
"testReasonServerError": "El proveedor de IA devolvió un error del servidor.",
"testReasonUnreachable": "No se pudo contactar con el proveedor de IA.",
"coachMemory": {
"title": "Lo que el Coach recuerda",
"description": "Datos duraderos que le has contado al Coach. Los usa para que sus respuestas sigan siendo relevantes. Elimina lo que prefieras que olvide.",
"empty": "El Coach aún no ha guardado ningún dato. A medida que conversas, recuerda detalles duraderos que compartes: tus objetivos, afecciones y preferencias, y puedes borrarlos aquí cuando quieras.",
"learnedPrefix": "aprendido {when}",
"categoryPreference": "Preferencias",
"categoryCondition": "Afecciones",
"categoryGoal": "Objetivos",
"categoryConstraint": "Restricciones",
"categoryContext": "Contexto",
"forget": "Olvidar",
"forgetAria": "Olvidar este dato",
"forgetAll": "Olvidar todo",
"forgetAllConfirmTitle": "¿Olvidar todo lo que recuerda el Coach?",
"forgetAllConfirmBody": "Esto elimina todos los datos guardados. El Coach empezará de cero la próxima vez que converses. No se puede deshacer.",
"forgetAllConfirmAction": "Olvidar todo",
"cancel": "Cancelar",
"summaryNote": "El Coach también puede mantener un breve resumen continuo de cada conversación. No hay un control individual para él: eliminar una conversación elimina su resumen.",
"loadError": "No se pudo cargar lo que recuerda el Coach.",
"forgotToast": "Dato olvidado.",
"forgotError": "No se pudo olvidar ese dato. Inténtalo de nuevo.",
"clearedToast": "Se olvidaron {count} datos guardados.",
"clearError": "No se pudieron borrar los datos guardados. Inténtalo de nuevo."
},
"disableCoach": {
"title": "Ocultar el Coach",
"description": "Oculta el botón del Coach y el panel en todas las páginas.",
"toggleAria": "Ocultar el botón del Coach y el panel",
"savedHidden": "Coach oculto.",
"savedShown": "Coach visible.",
"saveError": "No se pudo guardar el cambio. Inténtalo de nuevo."
},
"aboutMe": {
"title": "Sobre mí",
"description": "Contexto personal que el Coach y el informe diario leen junto con tus datos.",
"placeholder": "P. ej. trabajo por turnos, dieta vegetariana, lesión de rodilla, entrenamiento para una media maratón…",
"charCount": "{used} / {max} caracteres",
"clear": "Vaciar",
"save": "Guardar",
"savedToast": "Nota «Sobre mí» guardada.",
"clearedToast": "Nota «Sobre mí» eliminada.",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"loadError": "No se pudo cargar la nota.",
"hint": "Se envía al Coach y al informe diario como contexto adicional. Déjalo vacío para no enviar nada.",
"profileHint": "La edad y el género provienen de tu perfil y se incluyen automáticamente.",
"freeTextLabel": "Sobre mí (texto libre)",
"conditionsLabel": "Enfermedades crónicas",
"conditionsPlaceholder": "P. ej. hipertensión, diabetes tipo 2…",
"allergiesLabel": "Alergias e intolerancias",
"allergiesPlaceholder": "P. ej. intolerancia a la lactosa, alergia a la penicilina…",
"focusLabel": "¿En qué debería fijarse el Coach?",
"focusPlaceholder": "P. ej. vigila mi tensión arterial, motívame a moverme más…",
"completeness": "{answered} de {total} respondidas",
"questionsTitle": "El Coach tiene preguntas",
"questionsOpenCoach": "Responderlas en el Coach"
}
},
"dashboard": {
"units": {
"title": "Unidades",
"description": "Elige cómo se muestran las distancias y velocidades en los gráficos y mosaicos.",
"metric": "Métrico",
"imperial": "Imperial",
"saved": "Preferencia de unidades guardada.",
"saveError": "No se pudo guardar tu preferencia de unidades."
}
},
"withings": "Withings",
"withingsDescription": "Conecta tu báscula y tensiómetros Withings.",
"withingsCredentials": "Credenciales de API",
"withingsClientId": "ID de cliente",
"withingsClientSecret": "Secreto de cliente",
"withingsCredentialsSaved": "Credenciales guardadas",
"withingsCredentialsSavedPlaceholder": "Guardado — introduce uno nuevo para reemplazarlo",
"withingsCredentialsSavedPlaceholderSecret": "Guardado — introduce uno nuevo para reemplazarlo",
"withingsSaveCredentials": "Guardar",
"configured": "Configurado",
"withingsSync": "Sincronizar ahora",
"withingsFullSync": "Sincronizar todos los datos",
"withingsFullSyncTitle": "¿Sincronización completa?",
"withingsFullSyncDescription": "Se sincronizarán por completo todos los datos disponibles de Withings. Esto puede tardar un poco según tu historial.",
"withingsSyncResult": "{count} mediciones sincronizadas",
"withingsFullSyncResult": "{count} mediciones sincronizadas por completo",
"withingsSyncFailed": "Falló la sincronización",
"withingsOauthConnected": "Withings conectado — la primera sincronización comienza en segundo plano.",
"withingsOauthFailed": "Error al conectar con Withings",
"withingsOauthError": {
"csrf1": "La comprobación de seguridad falló porque faltaba la cookie del navegador. Inicia la conexión de nuevo en el mismo navegador.",
"replay": "Este enlace de confirmación ya se ha utilizado. Inicia la conexión de nuevo.",
"state": "La respuesta de Withings no coincide con ninguna solicitud de conexión abierta. Inicia la conexión de nuevo.",
"expired": "La solicitud de conexión ha caducado. Inicia la conexión de nuevo y completa la autorización en pocos minutos.",
"cross_user": "La respuesta pertenece a una solicitud de otra cuenta. Reinicia la conexión desde tu propia cuenta.",
"nocode": "Withings no devolvió ningún código de autorización. Inténtalo de nuevo y permite el acceso en el diálogo de Withings.",
"nocreds": "No hay credenciales de la API de Withings guardadas. Guarda primero el Client ID y el Client Secret y vuelve a conectar.",
"token": "El intercambio de tokens con Withings falló. Comprueba el Client ID y el Client Secret e inténtalo de nuevo.",
"generic": "Error desconocido al conectar. Inicia la conexión de nuevo."
},
"integrationsSourcesHint": "Si varias fuentes aportan la misma métrica, la prioridad de fuentes decide qué valor cuenta.",
"integrationsSourcesHintLink": "Abrir prioridad de fuentes",
"withingsSynchronize": "Sincronizar",
"withingsDisconnect": "Desconectar",
"withingsDisconnectTitle": "¿Desconectar Withings?",
"withingsDisconnectDescription": "Se desconectará la conexión con Withings. Los datos ya sincronizados se conservarán.",
"withingsConnect": "Conectar con Withings",
"withingsNoCredentials": "Introduce primero tus credenciales de API arriba para conectar Withings.",
"whoop": "WHOOP",
"whoopDescription": "Conecta tu banda WHOOP para sincronizar recuperación, sueño, esfuerzo y entrenamientos.",
"whoopOverlapNote": "Si WHOOP y otra fuente proporcionan el mismo valor vital —frecuencia cardíaca en reposo, oxígeno en sangre, temperatura corporal, frecuencia respiratoria o fases del sueño—, es posible que veas ambos valores hasta que una futura actualización elija una única fuente preferida.",
"whoopCredentials": "Credenciales de API",
"whoopCredentialsHelp": "Registra tu propia app de desarrollador de WHOOP y pega aquí su Client ID y Client Secret.",
"whoopClientId": "Client ID",
"whoopClientSecret": "Client Secret",
"whoopCredentialsSaved": "Credenciales guardadas",
"whoopCredentialsSavedPlaceholder": "Guardado — introduce nuevas para reemplazar",
"whoopCredentialsSavedPlaceholderSecret": "Guardado — introduce nuevas para reemplazar",
"whoopSaveCredentials": "Guardar",
"whoopSync": "Sincronizar ahora",
"whoopFullSync": "Sincronizar todos los datos",
"whoopFullSyncTitle": "¿Sincronización completa?",
"whoopFullSyncDescription": "Se sincronizará todo el historial de WHOOP disponible. Esto puede tardar según tu historial.",
"whoopSyncResult": "{count} mediciones sincronizadas",
"whoopSyncFailed": "Error de sincronización",
"whoopSynchronize": "Sincronizar",
"whoopDisconnect": "Desconectar",
"whoopDisconnectTitle": "¿Desconectar WHOOP?",
"whoopDisconnectDescription": "Se desconectará la conexión con WHOOP. Los datos ya sincronizados se conservarán.",
"whoopConnect": "Conectar con WHOOP",
"whoopNoCredentials": "Introduce tus credenciales de API arriba para conectar WHOOP.",
"whoopBackfillInProgress": "Importando tu historial de WHOOP en segundo plano…",
"whoopOauthConnected": "WHOOP conectado: la primera sincronización empieza en segundo plano.",
"whoopOauthFailed": "Error al conectar con WHOOP",
"whoopOauthError": {
"csrf1": "La verificación de seguridad falló porque faltaba la cookie del navegador. Inicia la conexión de nuevo en el mismo navegador.",
"state": "La respuesta de WHOOP no coincidió con ninguna solicitud de conexión abierta. Inicia la conexión de nuevo.",
"expired": "La solicitud de conexión caducó antes de completarse. Inicia la conexión de nuevo.",
"cross_user": "La respuesta pertenece a una solicitud de otra cuenta. Reinicia la conexión desde tu propia cuenta.",
"nocode": "WHOOP no devolvió un código de autorización. Inténtalo de nuevo y permite el acceso en el diálogo de WHOOP.",
"nocreds": "WHOOP no está configurado. Añade tus credenciales OAuth de WHOOP arriba e inténtalo de nuevo.",
"token": "El intercambio de token con WHOOP falló. Inicia la conexión de nuevo.",
"generic": "Error desconocido al conectar. Inicia la conexión de nuevo."
},
"fitbit": "Google Health",
"fitbitTag": "Fitbit y Pixel",
"fitbitDescription": "Conecta Google Health para sincronizar tus métricas de Fitbit y Pixel Watch: peso, grasa corporal, frecuencia cardíaca en reposo, saturación de oxígeno, variabilidad de la frecuencia cardíaca y más.",
"fitbitOverlapNote": "Si Google Health y otra fuente proporcionan la misma constante vital —frecuencia cardíaca en reposo, saturación de oxígeno, temperatura corporal o frecuencia respiratoria—, es posible que veas ambos valores hasta que una actualización futura defina una única fuente preferida.",
"fitbitExperimentalBadge": "Experimental",
"fitbitExperimentalNote": "Esta integración está en fase beta: la cobertura de datos y la asignación de campos aún se están verificando con cuentas reales de Google Health, por lo que algunos valores pueden faltar o cambiar en una actualización futura.",
"fitbitCredentials": "Credenciales de API",
"fitbitCredentialsHelp": "Registra tu propio cliente OAuth de Google Cloud para la API de Google Health y pega aquí su Client ID y Client Secret.",
"fitbitClientId": "Client ID",
"fitbitClientSecret": "Client Secret",
"fitbitCredentialsSaved": "Credenciales guardadas",
"fitbitCredentialsSavedPlaceholder": "Guardado: introduce nuevas para reemplazar",
"fitbitCredentialsSavedPlaceholderSecret": "Guardado: introduce nuevas para reemplazar",
"fitbitSaveCredentials": "Guardar",
"fitbitSync": "Sincronizar ahora",
"fitbitFullSync": "Sincronizar todos los datos",
"fitbitFullSyncTitle": "¿Sincronización completa?",
"fitbitFullSyncDescription": "Se sincronizará por completo todo el historial disponible de Google Health. Esto puede tardar un tiempo según tu historial.",
"fitbitSyncResult": "{count} mediciones sincronizadas",
"fitbitSyncFailed": "Error de sincronización",
"fitbitSynchronize": "Sincronizar",
"fitbitDisconnect": "Desconectar",
"fitbitDisconnectTitle": "¿Desconectar Google Health?",
"fitbitDisconnectDescription": "Se desconectará la conexión con Google Health. Los datos sincronizados previamente se conservarán.",
"fitbitConnect": "Conectar con Google Health",
"fitbitNoCredentials": "Introduce tus credenciales de API arriba para conectar Google Health.",
"fitbitBackfillInProgress": "Importando tu historial de Google Health en segundo plano…",
"fitbitOauthConnected": "Google Health conectado: la primera sincronización empieza en segundo plano.",
"fitbitOauthFailed": "Error al conectar con Google Health",
"fitbitOauthError": {
"csrf1": "La verificación de seguridad falló porque faltaba la cookie del navegador. Inicia la conexión de nuevo en el mismo navegador.",
"state": "La respuesta de Google no coincidió con ninguna solicitud de conexión abierta. Inicia la conexión de nuevo.",
"expired": "La solicitud de conexión caducó antes de completarse. Inicia la conexión de nuevo.",
"cross_user": "La respuesta pertenece a una solicitud de otra cuenta. Reinicia la conexión desde tu propia cuenta.",
"nocode": "Google no devolvió un código de autorización. Inténtalo de nuevo y permite el acceso en el diálogo de Google.",
"nocreds": "Google Health no está configurado. Añade tus credenciales OAuth de Google arriba e inténtalo de nuevo.",
"token": "El intercambio de token con Google falló. Inicia la conexión de nuevo.",
"generic": "Error desconocido al conectar. Inicia la conexión de nuevo."
},
"integrations": {
"withings": {
"reconnect": {
"banner": {
"title": "Sincronización de actividad disponible",
"body": "Tu conexión con Withings se autorizó antes de añadir la sincronización de actividad. Vuelve a conectar una vez para habilitar la importación de pasos, energía activa, distancia caminando y corriendo, y pisos subidos desde tus dispositivos Withings.",
"action": "Reconectar Withings"
}
}
}
},
"integrationPill": {
"connected": "Conectado",
"errorReconnect": "Error — reconectar",
"warningServerError": "Conectado, error del servidor",
"parkedReconnect": "Pausado — reconectar manualmente",
"notConnected": "No conectado",
"justNow": "ahora mismo",
"minutesAgo": "hace {count} min",
"hoursAgo": "hace {count} h",
"daysAgo": "hace {count} d",
"ariaLabel": "Estado de la integración",
"resumeCta": "Reconectar",
"resumeSuccess": "Integración reanudada",
"resumeError": "Reconexión fallida"
},
"apiTokens": "Tokens de API",
"apiTokensDescription": "Crea tokens de API para registrar tomas de medicación externas (p. ej., Atajos, automatizaciones).",
"tokenNamePlaceholder": "Nombre del token (p. ej., Atajo de iPhone)",
"tokenCreated": "Token creado — ¡cópialo ahora! No se mostrará de nuevo.",
"tokenCopy": "Copiar token",
"tokenCopied": "Token copiado al portapapeles",
"tokenCopyFailed": "No se pudo copiar el token",
"tokenRevokeFailed": "No se pudo revocar el token. Inténtalo de nuevo.",
"tokenRevoke": "¿Revocar token?",
"tokenRevokeAction": "Revocar token",
"tokenRevokeDescription": "El token se desactivará de forma permanente. Las aplicaciones que lo usen perderán el acceso.",
"tokenRevoked": "Revocado",
"tokenExpired": "Caducado",
"tokenActive": "Activo",
"activeTokensTitle": "Tokens activos",
"revokedTokensTitle": "Tokens revocados ({count})",
"tokenTableName": "Nombre",
"tokenTablePermissions": "Permisos",
"tokenTableStatus": "Estado",
"tokenTableCreated": "Creado",
"tokenTableLastUsed": "Último uso",
"tokenTableActions": "Acciones",
"noActiveTokens": "No hay tokens activos.",
"tokenNeverUsed": "Nunca",
"apiEndpointsTitle": "Endpoints de API",
"apiEndpointsDescription": "Resumen de los endpoints externos disponibles actualmente para la ingesta basada en tokens.",
"apiEndpointMethod": "Método",
"apiEndpointPath": "Ruta",
"apiEndpointAuth": "Autenticación",
"apiEndpointExample": "Ejemplo de cuerpo",
"collapse": "Contraer",
"expand": "Expandir",
"dangerZone": "Eliminar todos los datos",
"dangerZoneTitle": "Zona de peligro",
"dangerZoneDescription": "Elimina todos tus datos de salud e integraciones. Tu cuenta de usuario se conservará.",
"dangerZoneConfirm": "¿Eliminar todos los datos?",
"dangerZoneConfirmDescription": "Esto eliminará de forma permanente todos tus datos de salud e integraciones. Tu cuenta de usuario se conservará.",
"dangerZoneSuccess": "Se han eliminado todos los datos personales",
"dangerZoneDeleteFailed": "Falló la eliminación",
"finalDelete": "Eliminar permanentemente",
"deleteAccountCardTitle": "Eliminar la cuenta por completo",
"deleteAccountCardDescription": "Elimina tu cuenta junto con las claves de acceso, el registro de auditoría y las sesiones. Esto no se puede deshacer.",
"deleteAccountCta": "Eliminar cuenta",
"deleteAccountConfirmTitle": "¿Eliminar la cuenta de forma permanente?",
"deleteAccountConfirmDescription": "Tu cuenta, todos los datos de salud, las claves de acceso, las sesiones y las entradas de auditoría se eliminarán de forma permanente. Se cerrará tu sesión inmediatamente después.",
"deleteAccountSuccess": "Cuenta eliminada — cerrando tu sesión.",
"deleteAccountFailed": "No se pudo eliminar la cuenta",
"deleteAccountFinal": "Eliminar permanentemente",
"saved": "Guardado",
"savingError": "Error al guardar",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogDeprecated": "Obsoleto: el estado de ánimo ahora se registra de forma nativa en HealthLog con etiquetas y factores. Esta integración sigue funcionando, pero se eliminará en una versión futura.",
"moodLogUrl": "moodLog URL",
"moodLogUrlPlaceholder": "https://mood.example.com",
"moodLogApiKey": "Clave de API",
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Secreto del webhook",
"moodLogWebhookSecretHelp": "Introduce este secreto en moodLog como secreto del webhook",
"moodLogSync": "Sincronizar ahora",
"moodLogFullSync": "Sincronizar todos los datos",
"moodLogFullSyncConfirm": "Sincronizar",
"moodLogFullSyncTitle": "¿Sincronización completa?",
"moodLogFullSyncDescription": "Se sincronizarán por completo todos los datos de estado de ánimo disponibles.",
"moodLogDisconnect": "Desconectar",
"moodLogDisconnectTitle": "¿Desconectar moodLog?",
"moodLogDisconnectDescription": "Se eliminará la conexión y se borrarán todos los datos de estado de ánimo importados.",
"moodLogEntries": "Entradas",
"moodLogSyncResult": "{count} entradas sincronizadas",
"moodLogSyncFailed": "Falló la sincronización",
"moodLogDisconnected": "moodLog desconectado",
"about": {
"version": "Versión de la app",
"gitSha": "Build",
"builtAt": "Compilado {time}",
"builtAtLabel": "Compilado",
"license": "Licencia",
"repository": "Código fuente",
"changelog": "Changelog",
"docs": "Documentación",
"linksHeading": "Fuentes y documentación",
"newerAvailable": "Nueva versión: {tag}",
"tourReplay": "Volver a ver el recorrido",
"tourReplayHint": "Mira el recorrido del panel — útil si lo saltaste en la primera visita."
},
"testConnection": {
"test": "Probar conexión",
"testing": "Probando…",
"ok": "Conectado (latencia {latency} ms)",
"errors": {
"credentials_rejected": "Credenciales rechazadas — comprueba tu token",
"rate_limited": "Limitado por el servidor remoto",
"timeout": "La solicitud agotó el tiempo de espera",
"upstream_error": "El servidor remoto devolvió un error",
"connection_failed": "Falló la conexión",
"not_configured": "No configurado",
"url_not_public": "La URL no es un endpoint público",
"url_invalid": "La URL no es válida",
"redirected": "El endpoint redirige — comprueba la URL",
"endpoint_not_found": "No se encontró el endpoint en la URL",
"credentials_unreadable": "Las credenciales no se pueden descifrar",
"upstream_invalid_json": "El servidor remoto envió un JSON no válido",
"vapid_not_configured": "Web Push no configurado (faltan las claves VAPID)",
"rate_limited_self": "Demasiadas solicitudes de prueba",
"generic": "Prueba fallida"
}
},
"notificationStatus": {
"title": "Channel reliability",
"description": "Live status of every notification channel — Auto-disabled means HealthLog stopped retrying after a permanent error.",
"emptyDescription": "Aún no hay canales configurados. Añade un canal abajo para empezar a controlar su estado de entrega.",
"stateActive": "Activo",
"stateAutoDisabled": "Desactivado automáticamente",
"stateSendingPaused": "Envío en pausa",
"stateManuallyDisabled": "Desactivado",
"lastSuccess": "Último envío correcto",
"lastFailure": "Último fallo",
"consecutiveFailures": "Fallos consecutivos",
"disabledReason": "Motivo",
"nextRetry": "Próximo intento",
"reEnable": "Reactivar",
"sendTest": "Enviar prueba"
},
"identity": {
"description": "Datos opcionales para la exportación del historial de salud (portada PDF + exportación FHIR). Todos los campos son opcionales.",
"fullName": "Nombre completo",
"fullNamePlaceholder": "p. ej. Ana García",
"insurer": "Seguro médico",
"insurerPlaceholder": "p. ej. AOK Bayern",
"insuranceNumber": "Número de asegurado (KVNR)",
"insuranceNumberHint": "10 caracteres: una letra + nueve dígitos (p. ej. A123456780)."
},
"healthRecord": {
"title": "Exportar historial de salud",
"description": "Genere un historial de salud completo para su médico — como PDF, estructurado (FHIR) o un paquete combinado.",
"format": "Formato",
"format_pdf": "PDF",
"format_fhir": "Estructurado (FHIR)",
"format_package": "Paquete: PDF + FHIR",
"range": "Período",
"range90": "Últimos 90 días",
"range180": "Últimos 6 meses",
"range365": "Últimos 12 meses",
"practiceName": "Consulta (opcional)",
"practiceNamePlaceholder": "p. ej. Dr. García",
"includedData": "Datos incluidos",
"groupVitals": "Signos vitales",
"groupCardio": "Corazón y forma física",
"groupActivity": "Actividad y sueño",
"weight": "Peso",
"bp": "Presión arterial",
"pulse": "Pulso",
"oxygenSaturation": "Saturación de oxígeno",
"bodyFat": "Grasa corporal",
"bodyComposition": "Composición corporal",
"restingHeartRate": "Pulso en reposo",
"hrv": "Variabilidad de la frecuencia cardíaca",
"vo2max": "VO₂máx",
"steps": "Pasos",
"distance": "Distancia",
"sleep": "Sueño",
"glucose": "Glucosa en sangre",
"medications": "Medicamentos y adherencia",
"mood": "Estado de ánimo (desactivado por defecto — datos sensibles)",
"bmi": "IMC",
"includeCharts": "Incrustar gráficos de tendencia (solo PDF)",
"includeAiSummary": "Añadir resumen de IA (no validado clínicamente)",
"fhirNote": "La salida estructurada sigue el estándar FHIR R4 (compatible con ePA).",
"generate": "Generar",
"error": "Error en la exportación ({code}).",
"labs": "Resultados de análisis"
},
"globalExcludedInjectionSitesLabel": "Sitios de inyección excluidos globalmente",
"globalExcludedInjectionSitesHint": "Los sitios listados aquí no se ofrecen para ningún medicamento y se rechazan al registrar una dosis, aunque un medicamento los prefiera.",
"sharing": {
"createTitle": "Nuevo enlace para compartir",
"createDescription": "El enlace es de solo lectura y limitado en el tiempo. El token se muestra una sola vez al crearlo — guárdalo entonces; no se puede recuperar.",
"label": "Etiqueta",
"labelPlaceholder": "p. ej. Dra. García — revisión anual",
"range": "Días de historial",
"rangeHint": "Hasta cuándo se remonta la ventana compartida.",
"expiry": "Caduca en (días)",
"expiryHint": "Como máximo {max} días.",
"expiryInvalid": "La caducidad debe estar entre 1 y {max} días.",
"fhirApi": "Permitir API FHIR acotada",
"fhirApiHint": "Deja que el enlace sirva un endpoint FHIR de solo lectura además de la vista de página.",
"resourceTypes": "Tipos de recurso FHIR",
"create": "Crear enlace",
"tokenCreated": "Enlace para compartir creado",
"tokenOnce": "Copia este enlace ahora — el token se muestra una sola vez y no se puede recuperar.",
"copy": "Copiar enlace",
"copied": "Copiado al portapapeles.",
"activeTitle": "Enlaces activos",
"noActive": "No hay enlaces para compartir activos.",
"created": "Creado",
"expires": "Caduca",
"accessCount": "Vistas",
"revoke": "Revocar",
"revokeDescription": "Revoca este enlace de inmediato. Quien lo tenga pierde el acceso al instante. Esto no se puede deshacer.",
"statusActive": "Activo",
"statusRevoked": "Revocado",
"statusExpired": "Caducado",
"inactiveTitle": "Revocados y caducados ({count})"
},
"genderOther": "Otro",
"cycleTracking": {
"title": "Seguimiento del ciclo",
"description": "Registra tu ciclo menstrual, predicciones, síntomas e información de fases. Activado por defecto en cuentas configuradas como femeninas; disponible para todos.",
"enable": "Activar el seguimiento del ciclo",
"manage": "Abrir seguimiento del ciclo",
"error": "No se pudo actualizar el seguimiento del ciclo."
},
"nightscout": "Nightscout",
"nightscoutTag": "CGM",
"nightscoutDescription": "Conecta tu propio sitio Nightscout para sincronizar lecturas continuas de glucosa en el panel de glucosa.",
"nightscoutViewData": "Ver tu glucosa",
"nightscoutHelp": "Apunta HealthLog a tu instancia de Nightscout. Las lecturas se obtienen en segundo plano una vez por hora.",
"nightscoutUrl": "URL de Nightscout",
"nightscoutUrlSavedPlaceholder": "Guardado: introduce una URL nueva para reemplazarla",
"nightscoutToken": "Token de API",
"nightscoutTokenOptional": "Opcional para un sitio público",
"nightscoutTokenSavedPlaceholder": "Guardado: introduce un token nuevo para reemplazarlo",
"nightscoutTokenHelp": "Pega un token de acceso de las herramientas de administración de Nightscout. Déjalo vacío si tu sitio es de lectura pública.",
"nightscoutPrivateHost": "Este sitio funciona en una red privada",
"nightscoutPrivateHostHelp": "Actívalo solo si tu instancia de Nightscout está en una dirección LAN, VPN o Tailscale. Desactivado para sitios públicos.",
"nightscoutConnect": "Conectar",
"nightscoutUpdate": "Guardar cambios",
"nightscoutConnected": "Nightscout conectado.",
"nightscoutConnectFailed": "No se pudo conectar con Nightscout.",
"nightscoutDisconnect": "Desconectar",
"nightscoutDisconnectTitle": "¿Desconectar Nightscout?",
"nightscoutDisconnectDescription": "Las sincronizaciones futuras se detienen. Las lecturas de glucosa ya importadas permanecen en tu historial.",
"polar": "Polar",
"polarDescription": "Conecta tu cuenta de Polar para sincronizar la recuperación Nightly Recharge, las fases de sueño y la actividad diaria.",
"polarViewData": "Ver tu sueño y recuperación",
"polarHelp": "Inicia sesión en Polar para conceder acceso. Los datos se obtienen en segundo plano una vez por hora.",
"polarCredentials": "Credenciales de API",
"polarCredentialsHelp": "Opcional: registra tu propia app de Polar AccessLink y pega aquí su Client ID y Client Secret. Déjalo en blanco para usar la app compartida del servidor.",
"polarClientId": "Client ID",
"polarClientSecret": "Client Secret",
"polarCredentialsSaved": "Credenciales guardadas",
"polarCredentialsSavedPlaceholder": "Guardado — introduce nuevas para reemplazar",
"polarSaveCredentials": "Guardar",
"polarUnavailable": "Polar no está configurado en este servidor. Añade arriba tus propias credenciales OAuth de Polar, o pide a tu administrador que configure la app compartida.",
"polarConnect": "Conectar Polar",
"polarDisconnect": "Desconectar",
"polarDisconnectTitle": "¿Desconectar Polar?",
"polarDisconnectDescription": "Las sincronizaciones futuras se detienen. Las lecturas ya importadas permanecen en tu historial.",
"polarOauthConnected": "Polar conectado: la primera sincronización empieza en segundo plano.",
"polarOauthFailed": "Error al conectar con Polar",
"polarOauthError": {
"csrf1": "La verificación de seguridad falló porque faltaba la cookie del navegador. Inicia la conexión de nuevo en el mismo navegador.",
"state": "La respuesta de Polar no coincidió con ninguna solicitud de conexión abierta. Inicia la conexión de nuevo.",
"cross_user": "La respuesta pertenece a una solicitud de otra cuenta. Reinicia la conexión desde tu propia cuenta.",
"nocode": "Polar no devolvió un código de autorización. Inténtalo de nuevo y permite el acceso en el diálogo de Polar.",
"nocreds": "Polar no está configurado en este servidor. Pide a tu administrador que añada las credenciales OAuth de Polar.",
"token": "El intercambio de token con Polar falló. Inicia la conexión de nuevo.",
"rate_limited": "Demasiados intentos de conexión. Espera un momento e inténtalo de nuevo.",
"generic": "Error desconocido al conectar. Inicia la conexión de nuevo."
},
"oura": "Oura",
"ouraDescription": "Conecta tu cuenta de Oura para sincronizar readiness, fases de sueño, VFC y actividad diaria.",
"ouraViewData": "Ver tu sueño y recuperación",
"ouraHelp": "Inicia sesión en Oura para conceder acceso. Los datos se obtienen en segundo plano una vez por hora.",
"ouraCredentials": "Credenciales de API",
"ouraCredentialsHelp": "Opcional: registra tu propia app de Oura y pega aquí su Client ID y Client Secret. Déjalo en blanco para usar la app compartida del servidor.",
"ouraClientId": "Client ID",
"ouraClientSecret": "Client Secret",
"ouraCredentialsSaved": "Credenciales guardadas",
"ouraCredentialsSavedPlaceholder": "Guardado — introduce nuevas para reemplazar",
"ouraSaveCredentials": "Guardar",
"ouraUnavailable": "Oura no está configurado en este servidor. Añade arriba tus propias credenciales OAuth de Oura, o pide a tu administrador que configure la app compartida.",
"ouraConnect": "Conectar Oura",
"ouraDisconnect": "Desconectar",
"ouraDisconnectTitle": "¿Desconectar Oura?",
"ouraDisconnectDescription": "Las sincronizaciones futuras se detienen. Las lecturas ya importadas permanecen en tu historial.",
"ouraOauthConnected": "Oura conectado: la primera sincronización empieza en segundo plano.",
"ouraOauthFailed": "Error al conectar con Oura",
"ouraOauthError": {
"csrf1": "La verificación de seguridad falló porque faltaba la cookie del navegador. Inicia la conexión de nuevo en el mismo navegador.",
"state": "La respuesta de Oura no coincidió con ninguna solicitud de conexión abierta. Inicia la conexión de nuevo.",
"cross_user": "La respuesta pertenece a una solicitud de otra cuenta. Reinicia la conexión desde tu propia cuenta.",
"nocode": "Oura no devolvió un código de autorización. Inténtalo de nuevo y permite el acceso en el diálogo de Oura.",
"nocreds": "Oura no está configurado en este servidor. Pide a tu administrador que añada las credenciales OAuth de Oura.",
"token": "El intercambio de token con Oura falló. Inicia la conexión de nuevo.",
"rate_limited": "Demasiados intentos de conexión. Espera un momento e inténtalo de nuevo.",
"generic": "Error desconocido al conectar. Inicia la conexión de nuevo."
},
"integrationSetupGuide": "Guía de configuración"
},
"admin": {
"title": "Administration",
"subtitle": "Estado del sistema, usuarios y ajustes",
"settingsSaveError": "No se pudieron guardar los ajustes",
"systemStatus": "Estado del sistema",
"systemStatusDescription": "Estado de ejecución de esta instancia: base de datos, worker y contadores.",
"database": "Base de datos",
"databaseConnected": "Conectada",
"databaseError": "Error",
"startedAt": "Iniciado",
"users": "Usuarios",
"measurementsCount": "Mediciones",
"activeTokens": "Tokens de API activos",
"activeSessions": "Sesiones activas",
"loadingStatus": "Cargando estado...",
"systemStatusLoadError": "No se pudo cargar el estado del sistema.",
"systemStatusRetry": "Reintentar",
"adminSettingsLoadError": "No se pudieron cargar los ajustes de administración. Los interruptores de abajo pueden no reflejar el estado actual: recarga la página.",
"hostMetrics": {
"title": "Carga del host",
"load1": "Carga (1m)",
"memUsedPercent": "Memoria",
"diskBusyPercent": "Disk I/O",
"last2hours": "Últimas 2 horas",
"empty": "Muestreo iniciado: los datos aparecen en 1–2 minutos.",
"loadError": "No se pudieron cargar las métricas del host. Prueba a recargar la página."
},
"aiServerKey": {
"title": "Clave de IA del servidor",
"description": "Una clave de proveedor a nivel de operador a la que puede recurrir cualquier cuenta cuando no hay una clave personal configurada.",
"byokHint": "La clave propia del usuario (BYOK, inicio de sesión de ChatGPT o proveedor local) siempre tiene prioridad — la clave del servidor es el último paso de la cadena de proveedores.",
"consentHint": "Las solicitudes con la clave del servidor requieren el consentimiento de IA activo del usuario; sin un recibo de consentimiento no se envía nada.",
"statusConfigured": "Configurada",
"statusNotConfigured": "Sin configurar",
"keyLabel": "Clave de API",
"keyPlaceholder": "sk-...",
"keyPlaceholderSet": "Guardada ({preview}) — introduce una clave nueva para reemplazarla",
"modelLabel": "Modelo",
"baseUrlLabel": "URL base",
"save": "Guardar",
"remove": "Eliminar clave",
"saved": "Ajustes de la clave de IA del servidor guardados",
"error": "No se pudo guardar la clave de IA del servidor"
},
"aiQuality": {
"title": "Calidad de los análisis",
"loading": "Cargando resumen de comentarios...",
"loadError": "No se pudo cargar el resumen de calidad de los análisis. Prueba a recargar la página.",
"empty": "Aún no hay comentarios. El agregador se ejecuta a diario a las 04:00; en cuanto los usuarios valoren las recomendaciones, aquí aparecerán las tasas de utilidad.",
"windowLabel": "Últimos {days} días",
"generatedAtLabel": "Generado",
"colSeverity": "Gravedad",
"colMetric": "Métrica",
"colProvider": "Proveedor",
"colPromptVersion": "Prompt",
"colHelpful": "Útil",
"colNotHelpful": "No útil",
"colHelpfulRate": "Tasa de utilidad"
},
"coachFeedback": {
"title": "Comentarios del Coach",
"loading": "Cargando resumen de comentarios del Coach...",
"loadError": "No se pudo cargar el resumen de comentarios del Coach. Prueba a recargar la página.",
"empty": "Aún no hay comentarios del Coach. El agregador se ejecuta a diario a las 04:00; en cuanto los usuarios valoren las respuestas del Coach, aquí aparecerán las tasas de utilidad.",
"windowLabel": "Últimos {days} días",
"generatedAtLabel": "Generado",
"colPromptVersion": "Versión del prompt",
"colTone": "Tono",
"colVerbosity": "Nivel de detalle",
"colHelpful": "Útil",
"colNotHelpful": "No útil",
"colN": "n",
"colHelpfulRate": "Tasa de utilidad"
},
"workerStatus": "Worker de tareas",
"workerRunning": "En ejecución",
"workerStopped": "Detenido",
"lastReminderCheck": "Última comprobación de recordatorios",
"appSettings": "Ajustes de la aplicación",
"appSettingsDescription": "Valores globales por defecto para registro, idioma y zona horaria de cuentas nuevas.",
"registrationEnabled": "Permitir el registro",
"registrationEnabledDescription": "Cuando está desactivado, los nuevos usuarios no pueden registrarse.",
"defaultLanguage": "Idioma predeterminado",
"defaultLanguageDescription": "Se usa para los nuevos usuarios y como reserva.",
"defaultUserTimezone": "Zona horaria predeterminada para cuentas nuevas",
"defaultUserTimezoneDescription": "Se usa para cuentas nuevas que no tienen una zona detectada por el navegador. No afecta a los usuarios existentes.",
"defaultUserTimezoneFallback": "Europe/Berlin (predeterminada)",
"servicesGlobal": "Servicios (global)",
"servicesGlobalDescription": "Los servicios desactivados no están disponibles para ningún usuario.",
"telegramGlobal": "Permitir notificaciones de Telegram.",
"ntfyGlobal": "Permitir notificaciones de ntfy.",
"webPushGlobal": "Permitir notificaciones push del navegador.",
"moodLogGlobal": "Permitir recordatorios del registro de ánimo.",
"integrationWebPush": "Web Push",
"integrationBugReport": "Informe de errores",
"offlineGeoLabel": "Datos geográficos",
"offlineGeoEnabled": "Sin conexión (GeoLite2)",
"offlineGeoFallback": "Respaldo (ipwho.is) — configura MAXMIND_LICENSE_KEY en CI",
"apiGlobal": "Permitir endpoints de API y tokens de API.",
"umamiTitle": "Umami",
"umamiDescription": "Analítica web con Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Seguimiento de errores con GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"umamiEnabled": "Activar el seguimiento de Umami.",
"umamiScriptUrl": "URL del script de Umami",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
"umamiWebsiteId": "ID del sitio web de Umami",
"umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"glitchtipEnabled": "Activar el seguimiento de errores de GlitchTip.",
"glitchtipDsn": "GlitchTip DSN",
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "Entorno de GlitchTip",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapidDescription": "Configura aquí las claves VAPID y el subject para que el push del navegador funcione sin variables de entorno.",
"webPushVapidPublicKey": "Clave pública VAPID",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
"webPushVapidPrivateKey": "Clave privada VAPID",
"webPushVapidPrivateKeyPlaceholder": "Opcional: introduce una nueva clave privada",
"webPushVapidSubject": "Subject de VAPID",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"webPushVapidGenerate": "Generar claves",
"webPushVapidGenerating": "Generando…",
"webPushVapidGenerated": "Claves VAPID generadas. Guarda el asunto para terminar.",
"webPushVapidGenerateFailed": "No se pudieron generar las claves VAPID.",
"webPushVapidGenerateConfirm": "Las claves VAPID ya están configuradas. Generar un par nuevo invalida todas las suscripciones push del navegador: cada dispositivo debe volver a suscribirse. ¿Continuar?",
"webPushVapidGenerateConfirmTitle": "¿Regenerar las claves VAPID?",
"webPushVapidRegenerate": "Regenerar",
"configured": "Configurado",
"monitoringTestSuccess": "Evento de prueba enviado",
"monitoringTestFailed": "La prueba de monitorización falló",
"bugReportGithub": "Informe de errores (GitHub Issues)",
"bugReportGithubDescription": "Configura el token de issues de GitHub y el repositorio para los informes de errores entrantes.",
"bugReportEnabledLabel": "Informes de errores activados",
"bugReportEnabledDescription": "Cuando está desactivado, el botón de informe en la app se oculta; el token y el repositorio permanecen configurados.",
"assistant": {
"title": "Superficies del asistente",
"description": "Cada conmutador oculta una superficie impulsada por el modelo en toda la aplicación sin retirar la configuración del proveedor. El interruptor maestro fuerza cada opción secundaria a off.",
"master": {
"title": "Asistente activado",
"description": "Interruptor maestro para cada superficie impulsada por el modelo. Cuando está desactivado, todas las opciones secundarias se fuerzan a off."
},
"coach": {
"title": "Coach",
"description": "Drawer de chat, botón de lanzamiento y FAB móvil en cada página de Insights."
},
"briefing": {
"title": "Briefing diario",
"description": "Tarjeta de briefing, narración del hero strip, cuadrícula de recomendaciones y la acción Regenerar."
},
"insightStatus": {
"title": "Tarjetas de estado",
"description": "Tarjetas de estado por métrica en cada sub-página /insights."
},
"correlations": {
"title": "Correlaciones",
"description": "Narración de la tarjeta de correlación en la vista general de Insights."
},
"healthScoreExplainer": {
"title": "Explicador de Health-Score",
"description": "El icono ? junto a la línea de delta del Health-Score. El dígito del delta permanece visible siempre."
}
},
"bugReportRepo": "Repositorio",
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Token de issues",
"bugReportTokenPlaceholder": "ghp_...",
"invites": {
"title": "Invitaciones",
"description": "Enlaces de invitación para el registro: funcionan incluso con el registro cerrado. El enlace se muestra solo una vez.",
"adminOnlyHint": "Solo los administradores pueden crear y revocar invitaciones.",
"create": "Crear invitación",
"createTitle": "Crear invitación",
"createDescription": "El enlace permite registrarse incluso con el registro cerrado.",
"ttlLegend": "Válida durante",
"createDays": "{days} días",
"maxUsesLabel": "Usos máximos",
"maxUsesHint": "Cuántos registros admite este enlace (1–50).",
"createConfirm": "Crear invitación",
"createdToast": "Invitación creada.",
"createError": "No se pudo crear la invitación.",
"tokenTitle": "Enlace de invitación",
"tokenOnceHint": "Solo se puede copiar ahora: copia el enlace o deja que escaneen el código QR.",
"hashExplainer": "Solo se guarda un hash del enlace, por lo que no se puede volver a mostrar. Si se pierde, revoca la invitación y crea una nueva.",
"copyLink": "Copiar enlace",
"copiedToast": "Enlace copiado.",
"copyError": "No se pudo copiar.",
"qrAlt": "Código QR del enlace de invitación",
"loadError": "No se pudieron cargar las invitaciones.",
"emptyTitle": "Todavía no hay invitaciones",
"emptyDescription": "Crea un enlace de invitación para admitir a alguien con el registro cerrado.",
"colStatus": "Estado",
"colCreated": "Creada",
"colExpires": "Caduca",
"colUses": "Usos",
"colRedeemedBy": "Canjeada por",
"colActions": "Acciones",
"byCreator": "por {by}",
"expiresInDaysOne": "en 1 día",
"expiresInDaysOther": "en {count} días",
"statusActive": "Activa",
"statusExpired": "Caducada",
"statusExhausted": "Agotada",
"statusRevoked": "Revocada",
"redeemerDeleted": "cuenta eliminada",
"redeemedByMore": "{username} + {count} más",
"redemptionsTitle": "{count} canjes",
"revoke": "Revocar",
"revokeAria": "Revocar invitación",
"revokeConfirmTitle": "¿Revocar esta invitación?",
"revokeConfirmBody": "El enlace de invitación dejará de ser válido de inmediato. Las cuentas ya registradas con él se mantienen y el historial de canjes sigue visible.",
"revokeConfirmAction": "Revocar",
"cancel": "Cancelar",
"revokedToast": "Invitación revocada.",
"revokeError": "No se pudo revocar la invitación."
},
"userManagement": "Gestión de usuarios",
"userManagementDescription": "Gestiona las cuentas: roles, restablecimientos de contraseña y cierres de sesión forzados.",
"userName": "Nombre",
"userEmail": "Correo electrónico",
"userRole": "Rol",
"userPasskeys": "Passkeys",
"userCreated": "Creado",
"userActions": "Acciones",
"editUser": "Editar usuario",
"editUserTitle": "Editar usuario: {name}",
"demoteToUser": "Degradar a usuario",
"promoteToAdmin": "Promover a administrador",
"toUser": "Convertir en usuario",
"toAdmin": "Convertir en administrador",
"ownRoleUnchangeable": "No puedes cambiar tu propio rol",
"resetPassword": "Restablecer contraseña",
"resetPasswordTitle": "Restablecer contraseña: {name}",
"newPassword": "Nueva contraseña",
"newPasswordPlaceholder": "Al menos 12 caracteres",
"passwordReset": "La contraseña se ha restablecido",
"reset": "Restablecer",
"loadingUsers": "Cargando usuarios...",
"apiTokens": "Tokens de API",
"apiTokensDescription": "Todos los tokens de API activos y revocados de todas las cuentas.",
"tokenUser": "Usuario",
"tokenName": "Nombre",
"tokenPermissions": "Permisos",
"tokenPermissionAll": "Todo",
"tokenPermissionAllTooltip": "Permiso comodín: este token puede llamar a cualquier ruta de la API.",
"tokenStatus": "Estado",
"tokenLastUsed": "Último uso",
"tokenCreated": "Creado",
"tokenNeverUsed": "Nunca",
"tokensEmptyTitle": "Aún no hay tokens de API",
"tokensEmptyDescription": "Los tokens se emiten cuando un cliente nativo inicia sesión o desde Ajustes → Cuenta.",
"loginOverview": "Resumen de inicios de sesión",
"loginOverviewDescription": "Eventos de inicio de sesión y autenticación de todas las cuentas, filtrables y exportables como CSV.",
"allAuthEvents": "Todos los eventos de autenticación",
"failedOnly": "Solo fallidos",
"loginEmptyDescription": "Aquí aparecerán los inicios de sesión, los cierres de sesión y los cambios de passkey.",
"loginEmptyFailedTitle": "Sin intentos de inicio de sesión fallidos",
"loginEmptyFailedDescription": "Ese es el estado seguro. Cambia a todos los eventos para ver los inicios de sesión correctos.",
"loginEmptyResetFilter": "Mostrar todos los eventos",
"showingEntries": "Mostrando {count} de {total} entradas de autenticación",
"status": "Estado",
"action": "Acción",
"ip": "IP",
"location": "Ubicación",
"timestamp": "Hora",
"provider": "Proveedor",
"providerPassword": "Contraseña",
"providerPasskey": "Passkey",
"providerApiToken": "Token de API",
"providerWithings": "Withings",
"providerUnknown": "Desconocido",
"outcome": "Resultado",
"outcomeSuccess": "Éxito",
"outcomeFailed": "Fallido",
"auditDetails": "Detalles",
"deleteAllData": "Eliminar todos los datos globalmente",
"deleteAllDescription": "Elimina todos los datos de mediciones, medicación, integraciones y registros de todos los usuarios. Las cuentas de usuario se conservarán.",
"deleteAllConfirm": "¿Eliminar realmente todos los datos?",
"deleteAllConfirmDescription": "Esto eliminará permanentemente todas las mediciones, medicamentos, eventos de toma, tokens de API, conexiones de Withings, retos de autenticación abiertos, canales de notificación (Telegram, ntfy, Web Push), suscripciones push y eliminaciones de mensajes de Telegram en cola de todos los usuarios. Las cuentas de usuario, el registro de auditoría y los comentarios enviados se conservan para que el borrado siga siendo rastreable y los informes de errores se puedan seguir clasificando.",
"deleteButton": "Eliminar todos los datos",
"finalDelete": "Eliminar permanentemente",
"deletedResult": "Deleted: {measurements} measurements, {medications} Medicamentos,{intakeEvents} intakes, {apiTokens} API tokens, {withingsConnections} Withings connections, {authChallenges} auth challenges, {notificationChannels} notification channels, {pushSubscriptions} push subscriptions, {telegramScheduledDeletions} queued Telegram deletions. Feedback rows preserved.",
"authRegister": "Registro",
"authLogin": "Iniciar sesión",
"authLoginPasskey": "Inicio de sesión con passkey",
"authLoginPassword": "Inicio de sesión con contraseña",
"authLoginFailed": "Fallido",
"authLogout": "Cerrar sesión",
"authPasskeyRegister": "Passkey añadida",
"authPasskeyDelete": "Passkey eliminada",
"authTokenAutoissueNative": "Token de cliente nativo emitido",
"authTokenRefresh": "Token renovado",
"authTokenRevoke": "Token revocado",
"medicationReminders": "Recordatorios de medicación",
"medicationRemindersDescription": "Umbrales para los cambios de color de las insignias de recordatorio en las tarjetas de medicación.",
"notificationHealth": {
"title": "Estado de entrega",
"description": "Resultados de entrega de todos los usuarios en las últimas 24 horas.",
"empty": "No se enviaron notificaciones en este periodo.",
"ok": "OK",
"error": "Fallidas",
"skipped": "Omitidas",
"autoDisabled": "Canales desactivados automáticamente"
},
"reminderLateMinutes": "Umbral de retraso (minutos)",
"reminderLateMinutesDescription": "Minutos tras el fin de la ventana hasta que la insignia cambia de amarillo a naranja.",
"reminderMissedMinutes": "Umbral de omisión (minutos)",
"reminderMissedMinutesDescription": "Minutos tras el fin de la ventana hasta que la toma se considera omitida.",
"notificationTestSend": "Enviar prueba",
"notificationTestSuccess": "Notificación de prueba enviada",
"notificationTestFailed": "No se pudo enviar la notificación de prueba",
"reminderCheckRun": "Ejecutar comprobación de recordatorios",
"reminderCheckSuccess": "Comprobación de recordatorios completada",
"reminderCheckFailed": "No se pudo ejecutar la comprobación de recordatorios",
"reminderCheckResults": "Resultados",
"reminderCheckNotifOn": "Notificaciones activadas",
"reminderCheckNotifOff": "Notificaciones desactivadas",
"reminderCheckEventsToday": "Eventos de hoy",
"reminderCheckNotifSent": "Enviadas",
"feedback": {
"tabOpen": "Abierto",
"tabAcknowledged": "Confirmado",
"tabResolved": "Resuelto",
"tabArchived": "Archivado",
"subject": "Asunto",
"category": "Categoría",
"user": "Usuario",
"createdAt": "Enviado",
"actions": "Acciones",
"details": "Detalles",
"emptyTitle": "Todo al día",
"emptyDescription": "No hay comentarios de usuarios en este estado. Los errores, preguntas y solicitudes de funciones enviados aparecerán aquí.",
"loading": "Cargando comentarios...",
"anonymous": "anónimo",
"categoryBug": "Error",
"categoryFeature": "Función",
"categoryQuestion": "Pregunta",
"categoryOther": "Otro",
"metadataHeading": "Metadatos",
"metaUrl": "URL",
"metaLocale": "Idioma",
"metaUserAgent": "Agente de usuario",
"metaAppVersion": "Versión de la app",
"screenshotHeading": "Screenshot",
"adminNote": "Nota de administración",
"adminNotePlaceholder": "Nota interna (no visible para el usuario)",
"saveNote": "Guardar nota",
"noteSaved": "Nota guardada",
"actionAcknowledge": "Confirmar",
"actionResolve": "Resolver",
"actionArchive": "Archivar",
"actionPublishGithub": "Publicar en GitHub",
"publishedToGithub": "Publicado en GitHub",
"viewIssue": "Ver issue",
"publishSuccess": "Issue creada",
"publishFailed": "La publicación en GitHub falló",
"updateFailed": "La actualización falló",
"archiveConfirm": "¿Archivar esta entrada de comentarios?",
"submittedBy": "Enviado por"
},
"shell": {
"overview": "Resumen",
"sectionsNav": "Secciones de administración"
},
"overview": {
"welcomeTitle": "Bienvenido,{name}",
"welcomeSubtitle": "Has iniciado sesión como administrador. Elige una sección para gestionar HealthLog.",
"snapshotTitle": "Instantánea del sistema",
"snapshotVersion": "Versión",
"snapshotDatabase": "Base de datos",
"snapshotWorker": "Worker",
"snapshotStarted": "Iniciado",
"snapshotBuildSha": "Build SHA",
"snapshotBuiltAt": "Compilado el",
"snapshotOfflineGeo": "Datos geográficos",
"snapshotOfflineGeoOn": "Sin conexión (GeoLite2)",
"snapshotOfflineGeoOff": "Respaldo (ipwho.is)",
"versionTileTitle": "Versión",
"versionTileVersion": "Versión en ejecución",
"versionTileBuildSha": "SHA de compilación",
"versionTileBuiltAt": "Compilado el",
"versionTileUpdateAvailable": "Actualización disponible: {tag}",
"versionTileUpToDate": "Actualizado",
"snapshotLoadError": "No se pudo cargar la instantánea del sistema.",
"snapshotLoading": "Cargando instantánea...",
"auditTitle": "Actividad reciente",
"auditEmpty": "No hay entradas de auditoría recientes.",
"auditLoadError": "No se pudo cargar la actividad reciente.",
"auditLoading": "Cargando actividad...",
"auditViewAll": "Ver todo"
},
"section": {
"system-status": {
"title": "Estado del sistema",
"subtitle": "Estado del worker, la base de datos y las integraciones de un vistazo."
},
"general": {
"title": "General",
"subtitle": "Registro, idioma predeterminado y otros interruptores de toda la aplicación."
},
"services": {
"title": "Servicios",
"subtitle": "Activa o desactiva los canales de notificación y las integraciones en todo el sistema."
},
"integrations": {
"title": "Integraciones",
"subtitle": "Configura Umami, GlitchTip, Web Push e informes de errores."
},
"ai-quality": {
"title": "Calidad de los análisis",
"subtitle": "Puntuaciones de utilidad agrupadas por gravedad y proveedor, de los últimos 30 días de comentarios de usuarios."
},
"assistant": {
"title": "Superficies del asistente",
"subtitle": "Activa o desactiva cada superficie impulsada por el modelo sin retirar la configuración del proveedor."
},
"coach-feedback": {
"title": "Comentarios del Coach",
"subtitle": "Tasa de utilidad por versión de prompt, tono y nivel de detalle del Coach de los últimos 30 días."
},
"feedback": {
"title": "Comentarios",
"subtitle": "Clasifica los comentarios de usuarios, los informes de errores y las solicitudes de funciones."
},
"reminders": {
"title": "Recordatorios",
"subtitle": "Ajusta los umbrales de los recordatorios de medicación y ejecuta una comprobación manual."
},
"users": {
"title": "Usuarios",
"subtitle": "Gestiona las cuentas de usuario, los roles y las sesiones activas.",
"filter": {
"all": "Todo",
"admin": "Administradores",
"user": "Usuarios"
},
"forceLogout": "Forzar cierre de sesión",
"forceLogoutConfirmTitle": "¿Forzar el cierre de sesión de {name}?",
"forceLogoutConfirmBody": "Se revocarán todas las sesiones activas de este usuario. Tendrá que volver a iniciar sesión en todos los dispositivos.",
"forceLogoutSuccess": "Se cerró la sesión de {name} en {count} sesión(es)",
"forceLogoutFailed": "No se pudo forzar el cierre de sesión",
"cannotLogoutSelf": "No puedes forzar tu propio cierre de sesión",
"emptyTitle": "No hay usuarios en esta vista",
"emptyDescription": "No hay usuarios que coincidan con el filtro actual.",
"emptyResetFilter": "Mostrar todos los usuarios"
},
"invites": {
"title": "Invitaciones",
"subtitle": "Crear, seguir y revocar enlaces de invitación."
},
"api-tokens": {
"title": "Tokens de API",
"subtitle": "Tokens bearer activos emitidos a clientes nativos e integraciones."
},
"login-overview": {
"title": "Resumen de inicios de sesión",
"subtitle": "Registro de auditoría de eventos de autenticación y de administración."
},
"auditLog": {
"filterActor": "Actor (ID de usuario o nombre de usuario)",
"filterAction": "Acción",
"filterActionAll": "Todas las acciones",
"filterTarget": "Objetivo (ID o ruta)",
"filterDate": "Intervalo de fechas",
"range24h": "Últimas 24 horas",
"range7d": "Últimos 7 días",
"range30d": "Últimos 30 días",
"rangeAll": "Todo el tiempo",
"perPage": "Por página",
"prev": "Anterior",
"next": "Siguiente",
"pageOf": "Página {page} de {total}",
"export": "Exportar CSV",
"empty": "Ninguna entrada de auditoría coincide con los filtros actuales."
},
"app-logs": {
"title": "Registros de la app",
"subtitle": "Muestra los wide-events estructurados más recientes emitidos por este proceso.",
"processNote": "Solo se muestran los registros del proceso de la app; los registros del proceso del worker van a Loki cuando esa integración está configurada. El búfer es volátil y está limitado a 500 entradas.",
"filterTraceId": "ID de traza",
"filterAction": "La acción contiene…",
"filterLevel": "Nivel",
"levelAll": "Todos los niveles",
"filterRange": "Ventana de tiempo",
"range15m": "Últimos 15 minutos",
"range1h": "Última hora",
"range6h": "Últimas 6 horas",
"rangeAll": "Búfer completo",
"colLevel": "Nivel",
"colTimestamp": "Marca de tiempo",
"colAction": "Acción",
"colDuration": "Duración",
"colTraceId": "Trace",
"showing": "Mostrando {count} de hasta {bufferMax} eventos en búfer",
"empty": "El búfer está vacío",
"emptyDescription": "Aún no hay eventos que coincidan con los filtros actuales. Pulsa actualizar tras generar algo de tráfico.",
"refresh": "Actualizar",
"eventDetails": "Detalles del evento",
"closeDetails": "Cerrar detalles"
},
"backups": {
"title": "Copias de seguridad",
"subtitle": "Instantáneas de datos semanales por usuario almacenadas en PostgreSQL.",
"description": "Cada usuario tiene una instantánea rotativa por tipo de copia. Los tamaños muestran el blob cifrado; los contenidos no se pueden descargar desde esta página.",
"runNow": "Hacer copia ahora",
"runEnqueued": "Tarea de copia de seguridad en cola",
"runFailed": "No se pudo poner en cola la copia de seguridad",
"loading": "Cargando copias de seguridad...",
"loadError": "No se pudieron cargar las copias de seguridad.",
"emptyTitle": "Aún no hay copias de seguridad",
"emptyDescription": "Las copias de seguridad se ejecutan automáticamente cada domingo a las 03:00, o inicia una ahora para crear la primera instantánea.",
"colUser": "Usuario",
"colType": "Tipo",
"typeWeeklyAuto": "Semanal (auto)",
"typeManual": "Manual",
"colSize": "Tamaño",
"colCreatedAt": "Última instantánea",
"colActions": "Acciones",
"retentionLabel": "Conservación: {days} días",
"download": "Descargar",
"downloadAria": "Descargar copia de seguridad de {username}",
"downloadFailed": "La descarga falló",
"downloadStarted": "Descarga iniciada",
"uploadTitle": "Subir copia de seguridad",
"uploadDescription": "Valida un archivo de copia de seguridad y guárdalo como instantánea manual. La restauración es un paso aparte.",
"uploadButton": "Subir archivo",
"uploadHelp": "Archivo JSON que coincida con el esquema de copia de seguridad actual. Máx. 10 MB.",
"uploadSuccess": "Copia de seguridad subida ({count} registros)",
"uploadFailed": "La subida falló",
"restore": "Restaurar",
"restoreAria": "Restaurar desde copia de seguridad de {username}",
"restoreTitle": "Restaurar desde copia de seguridad",
"restoreDescription": "Esto reemplazará TODOS los datos actuales de {username} con la instantánea del {when}. Se eliminarán las mediciones, los medicamentos, los eventos de toma, las entradas de ánimo, los canales de notificación, las suscripciones push y las eliminaciones de Telegram en cola existentes.",
"restorePromptLabel": "Escribe RESTORE para continuar",
"restoreConfirm": "Restaurar ahora",
"restoreInProgress": "Restaurando...",
"restoreSuccess": "Restauración completada",
"restoreFailed": "La restauración falló",
"docsLink": "Documentación"
},
"danger-zone": {
"title": "Zona de peligro",
"subtitle": "Operaciones destructivas en todo el sistema."
},
"about": {
"title": "Acerca de",
"subtitle": "Versión, licencia, código fuente y comprobación de actualizaciones."
}
},
"carrier": "Operador",
"carrierUnknown": "Operador desconocido",
"carrierUnavailableGeoFallback": "{location} — operador no disponible"
},
"achievements": {
"title": "Logros",
"subtitle": "Consigue logros registrando tu salud y tomando tu medicación a tiempo.",
"loginRequired": "Inicia sesión para ver los logros.",
"points": "Puntos",
"unlocked": "Desbloqueado",
"nextGoal": "Próximo objetivo",
"allCompleted": "¡Todos los logros desbloqueados!",
"completed": "Completado",
"goalReached": "Objetivo alcanzado",
"remainingUnlocks": "Quedan {count} por desbloquear",
"noneUnlockedYet": "Aún no has desbloqueado ningún logro.",
"pointsValue": "{points} puntos",
"metricCount": "{count}",
"metricDays": "{count} días",
"metricPercent": "{count}%",
"badges": {
"intakeTotal1": {
"title": "Primera toma",
"description": "Registra tu primera toma de medicación."
},
"intakeTotal10": {
"title": "Iniciado en las tomas",
"description": "Registra 10 tomas de medicación."
},
"intakeTotal50": {
"title": "Rutina de tomas",
"description": "Registra 50 tomas de medicación."
},
"intakeTotal150": {
"title": "Experto en tomas",
"description": "Registra 150 tomas de medicación."
},
"intakeTotal300": {
"title": "Leyenda de las tomas",
"description": "Registra 300 tomas de medicación."
},
"overIntake1": {
"title": "Dosis doble",
"description": "Toma la medicación al menos una vez más de lo previsto."
},
"skippedIntake1": {
"title": "Un paso atrás",
"description": "Omite al menos una toma planificada."
},
"passkeyCreated1": {
"title": "Clave de acceso creada",
"description": "Crea tu primera clave de acceso."
},
"passkeyLogin1": {
"title": "Inicio con clave de acceso",
"description": "Inicia sesión al menos una vez con una clave de acceso."
},
"passwordLogin1": {
"title": "A la antigua",
"description": "Inicia sesión al menos una vez con usuario y contraseña."
},
"bugReport1": {
"title": "Cazador de errores",
"description": "Envía un informe de error."
},
"loginStreak7": {
"title": "Racha de inicios 7d",
"description": "Inicia sesión 7 días seguidos."
},
"loginStreak30": {
"title": "Racha de inicios 30d",
"description": "Inicia sesión 30 días seguidos."
},
"onTimePerfect1": {
"title": "Puntual 1d",
"description": "Toma todos los medicamentos a tiempo durante 1 día."
},
"compliance801": {
"title": "Adherencia 80% · 1d",
"description": "Alcanza al menos un 80% de adherencia de 30 días durante 1 día."
},
"bmiGreen1": {
"title": "IMC en verde · 1d",
"description": "Mantén tu IMC en el rango normal durante 1 día."
},
"bpGreen1": {
"title": "Presión en verde · 1d",
"description": "Mantén tu presión arterial en el rango normal durante 1 día."
},
"pulseGreen1": {
"title": "Pulso en verde · 1d",
"description": "Mantén tu pulso en reposo en el rango normal durante 1 día."
},
"onTimePerfect7": {
"title": "Puntual 7d",
"description": "Toma todos los medicamentos a tiempo durante 7 días seguidos."
},
"compliance807": {
"title": "Adherencia 80% · 7d",
"description": "Alcanza al menos un 80% de adherencia de 30 días durante 7 días seguidos."
},
"bmiGreen7": {
"title": "IMC en verde · 7d",
"description": "Mantén tu IMC en el rango normal durante 7 días seguidos."
},
"bpGreen7": {
"title": "Presión en verde · 7d",
"description": "Mantén tu presión arterial en el rango normal durante 7 días seguidos."
},
"pulseGreen7": {
"title": "Pulso en verde · 7d",
"description": "Mantén tu pulso en reposo en el rango normal durante 7 días seguidos."
},
"onTimePerfect30": {
"title": "Puntual 30d",
"description": "Toma todos los medicamentos a tiempo durante 30 días seguidos."
},
"compliance8030": {
"title": "Adherencia 80% · 30d",
"description": "Alcanza al menos un 80% de adherencia de 30 días durante 30 días seguidos."
},
"bmiGreen30": {
"title": "IMC en verde · 30d",
"description": "Mantén tu IMC en el rango normal durante 30 días seguidos."
},
"bpGreen30": {
"title": "Presión en verde · 30d",
"description": "Mantén tu presión arterial en el rango normal durante 30 días seguidos."
},
"pulseGreen30": {
"title": "Pulso en verde · 30d",
"description": "Mantén tu pulso en reposo en el rango normal durante 30 días seguidos."
},
"onTimePerfect180": {
"title": "Puntual 180d",
"description": "Toma todos los medicamentos a tiempo durante 180 días seguidos."
},
"compliance80180": {
"title": "Adherencia 80% · 180d",
"description": "Alcanza al menos un 80% de adherencia de 30 días durante 180 días seguidos."
},
"bmiGreen180": {
"title": "IMC en verde · 180d",
"description": "Mantén tu IMC en el rango normal durante 180 días seguidos."
},
"bpGreen180": {
"title": "Presión en verde · 180d",
"description": "Mantén tu presión arterial en el rango normal durante 180 días seguidos."
},
"pulseGreen180": {
"title": "Pulso en verde · 180d",
"description": "Mantén tu pulso en reposo en el rango normal durante 180 días seguidos."
},
"onTimePerfect360": {
"title": "Puntual 360d",
"description": "Toma todos los medicamentos a tiempo durante 360 días seguidos."
},
"compliance80360": {
"title": "Adherencia 80% · 360d",
"description": "Alcanza al menos un 80% de adherencia de 30 días durante 360 días seguidos."
},
"bmiGreen360": {
"title": "IMC en verde · 360d",
"description": "Mantén tu IMC en el rango normal durante 360 días seguidos."
},
"bpGreen360": {
"title": "Presión en verde · 360d",
"description": "Mantén tu presión arterial en el rango normal durante 360 días seguidos."
},
"pulseGreen360": {
"title": "Pulso en verde · 360d",
"description": "Mantén tu pulso en reposo en el rango normal durante 360 días seguidos."
},
"moodFirst": {
"title": "Primer estado de ánimo",
"description": "Registra tu primera entrada de estado de ánimo."
},
"moodStreak7": {
"title": "Diario de ánimo 7d",
"description": "Registra una entrada de estado de ánimo 7 días seguidos."
},
"moodStreak30": {
"title": "Diario de ánimo 30d",
"description": "Registra una entrada de estado de ánimo 30 días seguidos."
},
"moodUp7": {
"title": "Semana más luminosa",
"description": "Tu media de ánimo de 7 días mejoró al menos 1,0 punto respecto a la semana anterior."
},
"weightFirst": {
"title": "Primer pesaje",
"description": "Registra tu primera medición de peso."
},
"weight50": {
"title": "Cincuenta pesajes",
"description": "Registra 50 mediciones de peso."
},
"weight200": {
"title": "200 pesajes",
"description": "Registra 200 mediciones de peso."
},
"bpFirst": {
"title": "Primera medición",
"description": "Registra tu primera medición de presión arterial."
},
"bp50": {
"title": "Cincuenta mediciones de presión",
"description": "Registra 50 mediciones de presión arterial."
},
"bp200": {
"title": "200 mediciones de presión",
"description": "Registra 200 mediciones de presión arterial."
},
"pulseFirst": {
"title": "Primer pulso",
"description": "Registra tu primera medición de pulso."
},
"consistentMonth": {
"title": "Mes constante",
"description": "Registra entradas en al menos 25 días distintos dentro de un mismo mes natural."
},
"entryStreak7": {
"title": "Racha de registros 7d",
"description": "Registra al menos una entrada 7 días seguidos."
},
"entryStreak30": {
"title": "Racha de registros 30d",
"description": "Registra al menos una entrada 30 días seguidos."
},
"weekendWarrior": {
"title": "Registrador de fin de semana",
"description": "Registra entradas en 4 fines de semana consecutivos (sábado y domingo)."
},
"hiddenNightOwl": {
"title": "Búho nocturno",
"description": "Registraste una entrada entre las 02:00 y las 04:00 de la madrugada."
},
"hiddenEarlyBird": {
"title": "Madrugador",
"description": "Registraste una entrada entre las 04:00 y las 06:00 de la mañana."
},
"hiddenLeapDay": {
"title": "Leyenda del año bisiesto",
"description": "Registraste una entrada el 29 de febrero."
},
"hiddenDoctorPdf": {
"title": "Visita a domicilio",
"description": "Exportaste tu primer informe médico en PDF."
},
"hiddenLocaleFlip": {
"title": "Políglota",
"description": "Cambiaste el idioma de la app al menos una vez."
},
"hiddenBugBuddy": {
"title": "Colega de errores",
"description": "Enviaste al menos 5 informes de error — el proyecto te quiere."
},
"missFree7": {
"title": "Sin dosis perdidas · 7d",
"description": "7 días consecutivos sin una dosis perdida."
},
"missFree30": {
"title": "Sin dosis perdidas · 30d",
"description": "30 días consecutivos sin una dosis perdida."
},
"missFree90": {
"title": "Sin dosis perdidas · 90d",
"description": "90 días consecutivos sin una dosis perdida."
},
"measurementWeeks4": {
"title": "Rutina de medición",
"description": "4 semanas consecutivas con mediciones en al menos 5 días cada una."
},
"selfContextComplete": {
"title": "Autoinforme al día",
"description": "Los cuatro campos del autoinforme completados — el Coach conoce tu contexto."
},
"sleepLog7": {
"title": "Registro de sueño · 7d",
"description": "Datos de sueño registrados durante 7 días consecutivos."
}
},
"nextProgressLabel": "Progreso para desbloquear",
"completedOn": "Completado el {date}",
"locked": "Bloqueado",
"criterionHint": "{current} / {target}",
"progressPercent": "{percent}%",
"categories": {
"medication": "Medicamento",
"vitals": "Constantes vitales",
"mood": "Estado de ánimo",
"security": "Cuenta y seguridad",
"engagement": "Engagement",
"hidden": "Oculto"
},
"hiddenCard": {
"title": "Logro oculto",
"description": "Sigue registrando — quizá te topes con él.",
"ariaLabel": "Logro oculto bloqueado"
},
"hiddenUnlockToast": {
"title": "¡Has desbloqueado un logro oculto!"
},
"dashboardCard": {
"title": "Desbloqueos recientes",
"viewAll": "Ver todo",
"empty": "Aún no hay logros — sigue registrando para desbloquear el primero."
}
},
"bugreport": {
"title": "Reporte de bug",
"subtitle": "Envía un fallo, una sugerencia o una pregunta. El administrador del servidor verá tu envío.",
"loginRequired": "Inicia sesión para reportar un bug.",
"bugTitle": "Título",
"description": "Descripción",
"submit": "Enviar",
"success": "¡Gracias! Tu reporte se ha enviado correctamente.",
"errorCreating": "Error al crear",
"category": "Tipo",
"categoryBug": "Fallo",
"categoryFeature": "Sugerencia",
"categoryQuestion": "Pregunta",
"categoryOther": "Otro feedback",
"bugTitlePlaceholder": "Resumen breve (opcional)",
"githubEscalationNote": "Tu feedback se guarda localmente. Si el administrador activa la integración con GitHub, puede publicarse como issue público a petición.",
"internalOnlyNote": "Tu feedback se guarda localmente y solo es visible para el administrador de este servidor.",
"disabledTitle": "Los informes de errores están desactivados",
"disabledBody": "El administrador ha desactivado los informes de errores en este servidor."
},
"notifications": {
"title": "Notificaciones",
"breadcrumbInbox": "Notificaciones",
"breadcrumbChannels": "Canales de notificación",
"breadcrumbSettings": "Ajustes",
"eventColumn": "Evento",
"subtitle": "Elige qué notificaciones recibes y por qué canal.",
"loadError": "No se han podido cargar los ajustes de notificación.",
"noChannels": "Configura primero un canal de notificación en los ajustes.",
"goToSettings": "Ir a los ajustes del canal",
"channelDisabled": "Desactivado",
"admin": {
"deployFailedTitle": "Despliegue fallido: {application}",
"deployFailedBody": "Se produjo un error al desplegar {application} (#{deployment}): {error}. Ver registros: {logsUrl}",
"testNotificationTitle": "HealthLog notificación de prueba",
"testNotificationBody": "Esta notificación de prueba se activó desde el panel de administración. Si la ves, el canal funciona.",
"reminderCheckMissedTitle": "Recordatorio perdido: {medication}",
"reminderCheckMissedBody": "{medication} ({dose}) no se registró en la ventana {window}.",
"reminderCheckOverdueTitle": "Dosis atrasada: {medication}",
"reminderCheckOverdueBody": "{medication} ({dose}) en la ventana {window} lleva {minutes} minutos de retraso.",
"offlineGeoUnavailableTitle": "Bases de datos de geolocalización sin conexión no cargadas",
"offlineGeoUnavailableBody": "HealthLog está resolviendo las ubicaciones de inicio de sesión mediante el respaldo en línea ipwho.is. Para habilitar las bases sin conexión GeoLite2-City y GeoLite2-ASN, configura MAXMIND_LICENSE_KEY en los secrets de GitHub Actions en {secretsUrl} y vuelve a desplegar. Hasta entonces, la columna de operador en el resumen de inicios de sesión permanece vacía.",
"tlsPinChangedTitle": "Certificado de hoja TLS cambiado: {host}",
"tlsPinChangedBody": "La hoja TLS servida por {host} ahora tiene el pin SPKI {servedPin}, que no está en el conjunto de pines conocidos. Los clientes con pin fijo (la app nativa) no podrán conectarse una vez que desaparezca el pin antiguo. Vuelve a extraer el nuevo pin de la hoja, añádelo a TLS_LEAF_SPKI_PINS y al conjunto de pines del cliente nativo, y publica una versión antes de que este certificado caduque el {validTo}. Consulta docs/ops/tls-cert-pin.md."
},
"user": {
"telegramTestBody": "HealthLog: conexión correcta. Las notificaciones de Telegram están activas."
},
"moodReminder": {
"title": "Recordatorio diario de ánimo",
"description": "Aviso suave a la hora que elijas si aún no has registrado el ánimo del día. Se envía solo por canales ya configurados (Telegram, ntfy, Web Push, Apple Push) y permanece en silencio una vez que has registrado el ánimo hoy.",
"toggleAria": "Alternar recordatorio diario de ánimo",
"statusOn": "Activo a la hora que elijas",
"statusOff": "Desactivado",
"enabledToast": "Recordatorio de ánimo activado.",
"disabledToast": "Recordatorio de ánimo desactivado.",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"hourLabel": "Hora del recordatorio",
"hourAria": "Hora del recordatorio de ánimo",
"hourSavedToast": "Hora del recordatorio actualizada."
},
"coachNudge": {
"title": "Coach proactivo",
"description": "Se pone en contacto cuando tus datos sugieren consultar al Coach, por ejemplo baja adherencia a la medicación o una media semanal de tensión elevada. Los temas y la frecuencia son ajustables.",
"toggleAria": "Activar o desactivar los avisos proactivos del Coach",
"statusOn": "Activo",
"groupsLabel": "Temas",
"groupMedication": "Medicación",
"groupMedicationDesc": "Tomas irregulares durante la última semana.",
"groupVitals": "Constantes vitales",
"groupVitalsDesc": "Tensión, recuperación, tendencia del peso, sueño.",
"groupRoutine": "Rutina",
"groupRoutineDesc": "Pausas bruscas en los registros y revisiones de la autodescripción.",
"frequencyLabel": "Frecuencia",
"frequencyWeekly": "Como máximo una vez por semana",
"frequencyBiweekly": "Como máximo cada dos semanas",
"frequencyAria": "Seleccionar la frecuencia de los avisos",
"statusOff": "Desactivado",
"enabledToast": "Avisos proactivos del Coach activados.",
"disabledToast": "Avisos proactivos del Coach desactivados.",
"saveError": "No se pudo guardar. Inténtalo de nuevo más tarde."
},
"lowStock": {
"title": "Aviso de existencias bajas",
"description": "Comprueba una vez al día las existencias registradas de tus medicamentos y te avisa cuando alguna cubre menos días que este umbral. Un aviso por escasez; se reactiva tras reponer.",
"toggleAria": "Activar o desactivar los avisos de existencias bajas",
"statusOn": "Activo",
"statusOff": "Desactivado",
"daysLabel": "Avisar por debajo de (días)",
"daysAria": "Seleccionar el umbral de existencias en días",
"leadLabel": "Plazo de reposición (días)",
"leadAria": "Plazo de reposición en días",
"leadHelp": "El aviso se envía estos días más un intervalo de dosis antes, para que la reposición llegue antes de tu última dosis. Un medicamento concreto puede anular este valor en su pestaña de existencias.",
"leadSavedToast": "Plazo de reposición guardado.",
"savedToast": "Umbral de existencias guardado.",
"enabledToast": "Avisos de existencias bajas activados.",
"disabledToast": "Avisos de existencias bajas desactivados.",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"medicationsLink": "Ir a tus medicamentos"
},
"eventMedicationReminder": "Recordatorio de medicación",
"eventMedicationReminderDesc": "Se envía a cada hora de dosis programada.",
"eventMeasurementAnomaly": "Medición inusual",
"eventMeasurementAnomalyDesc": "Se envía cuando una lectura está claramente fuera de tu rango habitual.",
"eventComplianceLow": "Cumplimiento bajo",
"eventComplianceLowDesc": "Se envía cuando tu tasa de toma de los últimos días baja del 80 %.",
"eventWithingsSyncFailed": "Error de sincronización con Withings",
"eventWithingsSyncFailedDesc": "Se envía cuando la sincronización con Withings falla varios intentos seguidos.",
"eventSystemAlert": "Aviso del sistema",
"eventSystemAlertDesc": "Mensajes generales del servidor HealthLog, por ejemplo ventanas de mantenimiento o avisos de cuenta.",
"eventPersonalRecord": "Récord personal",
"eventPersonalRecordDesc": "Se envía cuando una lectura supera tu mejor marca anterior.",
"eventMoodReminder": "Recordatorio de ánimo",
"eventMoodReminderDesc": "Recordatorio diario para registrar tu ánimo actual.",
"eventCyclePeriodSoon": "Período próximo",
"eventCyclePeriodSoonDesc": "Se envía un par de días antes de tu próximo período previsto.",
"eventCyclePeriodConfirm": "¿Empezó tu período?",
"eventCyclePeriodConfirmDesc": "Un recordatorio suave en o después del inicio previsto mientras no se registre ningún período.",
"eventCycleFertileSoon": "Ventana fértil próxima",
"eventCycleFertileSoonDesc": "Se envía unos días antes de tu ventana fértil estimada cuando tu objetivo es concebir.",
"eventMedicationLowStock": "Existencias de medicación bajas",
"eventMedicationLowStockDesc": "Cuando unas existencias registradas cubren menos días que tu umbral de existencias"
},
"i18n": {
"maintainershipBanner": {
"notice": "Este idioma está traducido automáticamente, incluidas las instrucciones críticas para la seguridad del Coach. Un control de deriva automático se ejecuta en CI; informe de cualquier regresión del Coach en GitHub.",
"cta": "Informar en GitHub",
"dismiss": "Cerrar"
}
},
"targets": {
"bmi": "IMC",
"average30d": "Media 30 días:",
"consistency": {
"ariaLabel": "Últimos 7 días, estado dentro/fuera del rango por día",
"daysInRange": "{count} de {total} en rango",
"daysLogged": "{count} de {total} registrados",
"dotInRange": "en rango",
"dotNearRange": "cerca del rango",
"dotOutOfRange": "fuera",
"dotNotLogged": "no registrado",
"insufficientData": "Aún hay pocos datos — sigue registrando.",
"relativeDay": {
"today": "Hoy",
"yesterday": "Ayer",
"twoDaysAgo": "hace 2 días",
"threeDaysAgo": "hace 3 días",
"fourDaysAgo": "hace 4 días",
"fiveDaysAgo": "hace 5 días",
"sixDaysAgo": "hace 6 días"
}
},
"relativeDay": {
"today": "Hoy",
"yesterday": "Ayer",
"daysAgo": "hace {count} días"
},
"edit": {
"openLabel": "Editar el rango objetivo de {metric}",
"title": "Editar rango objetivo — {metric}",
"description": "Ajusta el rango objetivo usado en gráficas, insights y el informe médico. Valores en {unit}.",
"derivedHint": "Esta tarjeta se calcula a partir de otras métricas. Edita en su lugar los objetivos subyacentes (p. ej. tensión arterial o peso).",
"minLabel": "Mín",
"maxLabel": "Máx",
"systolicMin": "Sistólica mín",
"systolicMax": "Sistólica máx",
"diastolicMin": "Diastólica mín",
"diastolicMax": "Diastólica máx",
"boundsHint": "Rango permitido: {min}–{max} {unit}",
"resetToDefault": "Restablecer por defecto",
"saveSuccess": "Rango objetivo actualizado",
"saveError": "No se ha podido guardar el rango objetivo",
"resetSuccess": "Rango objetivo restablecido por defecto"
},
"mood": {
"stability": {
"stable": "estable",
"variable": "variable",
"highlyVariable": "muy variable"
}
},
"currentValue": "Actual: {value} {unit}",
"targetRangeValue": "Rango objetivo: {min}–{max} {unit}",
"sourceLabel": "Fuente: {source}",
"inTarget": "En rango objetivo",
"aboveTarget": "{delta} {unit} por encima del rango",
"belowTarget": "{delta} {unit} por debajo del rango",
"diastolic": "Diastólica",
"glucoseFasting": "Glucemia — en ayunas",
"glucosePostprandial": "Glucemia — posprandial",
"glucoseRandom": "Glucemia — cualquiera",
"glucoseBedtime": "Glucemia — antes de dormir",
"status": {
"underweight": "Peso insuficiente",
"normal": "Normal",
"overweight": "Sobrepeso",
"obesityGrade1": "Obesidad grado I",
"obesityGrade2": "Obesidad grado II",
"obesityGrade3": "Obesidad grado III",
"optimal": "Óptima",
"highNormal": "Normal-alta",
"hypertensionGrade1": "Hipertensión grado 1",
"hypertensionGrade2": "Hipertensión grado 2",
"hypertensionGrade3": "Hipertensión grado 3",
"bradycardia": "Bradicardia",
"elevated": "Elevado",
"tachycardia": "Taquicardia",
"significantlyLow": "Significativamente bajo",
"slightlyLow": "Ligeramente bajo",
"onTarget": "En rango objetivo",
"slightlyElevated": "Ligeramente elevado",
"significantlyElevated": "Significativamente elevado",
"farTooShort": "Muy corto",
"tooShort": "Corto",
"slightlyLong": "Ligeramente largo",
"farTooLong": "Muy largo",
"belowEssential": "Por debajo de lo esencial",
"essential": "Esencial",
"athletic": "Atlético",
"fitness": "Fitness",
"acceptable": "Aceptable",
"obese": "Obeso",
"veryLow": "Muy bajo",
"lowActive": "Poco activo",
"moderatelyActive": "Moderadamente activo",
"active": "Activo",
"veryActive": "Muy activo",
"good": "Bueno",
"moderate": "Moderado",
"low": "Bajo",
"high": "Alto",
"veryGood": "Muy bueno",
"veryStable": "Muy estable",
"stable": "Estable",
"fluctuating": "Variable"
}
},
"passwordStrength": {
"veryWeak": "Muy débil",
"weak": "Débil",
"acceptable": "Aceptable",
"strong": "Fuerte",
"veryStrong": "Muy fuerte",
"tooShort": "Demasiado corta",
"characters": "caracteres",
"minLength": "Se requieren al menos {count} caracteres."
},
"telegram": {
"errorInvalidAction": "Acción no válida.",
"errorMedicationNotFound": "Medicamento no encontrado.",
"errorMedicationInactive": "Medicamento no encontrado o inactivo.",
"errorUnknownAction": "Acción desconocida.",
"snoozeOneHour": "1 hora",
"snoozeThreeHours": "3 horas",
"snoozedFor": "{name} pospuesto durante {duration}.",
"skipped": "{name} omitido.",
"alreadyRecorded": "{name} ya estaba registrado.",
"recordedAsTaken": "{name} registrado como tomado.",
"confirmed": "{name} confirmado.",
"genericConfirmed": "Confirmado.",
"cancelled": "Cancelado.",
"noActiveMedications": "No se han encontrado medicamentos activos.",
"whichMedication": "<b>¿Qué medicamento has tomado?</b>",
"cancelButton": "Cancelar",
"askMedicationName": "Indica el medicamento, p. ej. <b>tomado Ramipril</b>.",
"medicationNotFoundExact": "Medicamento no encontrado. Envía el nombre exactamente como aparece en HealthLog.",
"helpHeader": "<b>Comandos disponibles:</b>",
"helpBody": "/help — mostrar esta ayuda\n/add — registrar una toma\n/start — iniciar el bot\n\n<b>Comandos de texto:</b>\ntaken &lt;nombre&gt; — confirmar una toma\n\n<b>Botones en los recordatorios:</b>\n• Tomado — confirmar la toma\n• 🕐 1h / 🕐 3h — posponer el recordatorio\n• ⏭ Omitir — omitir la toma\n• ✓ Confirmar — confirmar una toma omitida"
},
"medicationReminders": {
"phaseGreenTitle": "🟢 Recordatorio: {medName}",
"phaseGreenMessage": "🟢 Reminder:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nWindow closes in {minutes} Mín.",
"phaseYellowTitle": "🟡 Pronto: {medName}",
"phaseYellowMessage": "🟡 Pronto:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nQuedan {minutes} min.",
"phaseOrangeTitle": "🟠 Atrasado: {medName}",
"phaseOrangeMessage": "🟠 Overdue:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nOverdue by {minutes} Mín.",
"phaseRedTitle": "🔴 Omitido: {medName}",
"phaseRedMessage": "🔴 Omitido:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nMarcado como omitido.",
"buttonTaken": "Tomado",
"buttonConfirm": "✓ Confirmar",
"buttonSnoozeOneHour": "🕐 1h",
"buttonSnoozeThreeHours": "🕐 3h",
"buttonSkip": "⏭ Omitir"
},
"lowStockReminders": {
"title": "Quedan pocas existencias: {medName}",
"body": "{medName}: quedan {units} unidades — para unos {days} días más.",
"bodyToday": "{medName}: quedan {units} unidades — menos de un día de suministro.",
"bodyReorder": "{medName}: quedan {units} unidades. Las existencias se agotan hacia el {runsOutOn} — vuelve a pedir antes del {reorderBy}.",
"bodyLastDose": "{medName}: quedan {units} unidades — alrededor de tu última dosis. Las existencias se agotan hacia el {runsOutOn}."
},
"moodReminders": {
"dailyTitle": "Registrar el ánimo",
"dailyBody": "¿Cómo te sientes hoy?"
},
"coachNudges": {
"complianceTitle": "Tu Coach tiene algo que comentarte",
"complianceBody": "Tus tomas han sido irregulares esta semana. Habla un momento con el Coach: quizá se pueda simplificar el plan.",
"bpTitle": "Tensión elevada esta semana",
"bpBody": "Tu tensión media de esta semana superó tu objetivo. El Coach puede ayudarte a poner los valores en contexto.",
"scoreTitle": "Tu puntuación de recuperación baja",
"scoreBody": "Tu puntuación de recuperación ha caído notablemente esta semana. El Coach puede ayudarte a acotar las posibles causas.",
"selfContextTitle": "Ayuda a tu Coach a conocerte mejor",
"selfContextBody": "Tu autodescripción está incompleta o lleva tiempo sin actualizarse. Dos minutos en los ajustes mantienen fresco el contexto del Coach.",
"weightTitle": "Tu peso se aleja de tu rango objetivo",
"weightBody": "Tu media semanal se ha alejado más de tu rango objetivo. El Coach puede ayudarte a hacer balance con calma.",
"sleepDebtTitle": "Varias noches cortas esta semana",
"sleepDebtBody": "La mayoría de tus últimas noches quedaron por debajo de tu objetivo de sueño. El Coach puede ayudarte a buscar patrones.",
"measurementGapTitle": "Tu registro se ha quedado en silencio",
"measurementGapBody": "Hace una semana que no llegan valores nuevos. Una breve charla con el Coach ayuda a retomar la rutina — o a detectar una sincronización rota.",
"focusSuffix": "Querías prestar atención a: {focus}.",
"questionConditions": "¿Tienes enfermedades crónicas que el Coach deba conocer?",
"questionFocus": "¿Hay algo concreto en lo que el Coach deba fijarse?",
"questionAllergies": "¿Tienes alergias o intolerancias?",
"questionAboutMe": "¿Quieres contarle al Coach algo sobre ti: rutinas, objetivos, contexto?"
},
"clinicianView": {
"title": "Registro de salud compartido",
"period": "Período del informe: {start} – {end}",
"expires": "Este enlace caduca el {date}.",
"provenance": "Este es un resumen de solo lectura compartido por la persona a la que pertenece, exportado de sus datos de HealthLog autorregistrados. Los valores son autoinformados y pueden incluir lecturas sincronizadas desde dispositivos; trátelos como informados por el paciente, no como un examen clínico.",
"vitals": "Signos vitales",
"labs": "Valores de laboratorio",
"medications": "Medicamentos y adherencia",
"bmi": "Índice de masa corporal (IMC)",
"statSummary": "último {latest} (prom. {avg}, rango {min}–{max})",
"adherence": "{rate} de adherencia",
"noAdherence": "—",
"glucose": {
"FASTING": "Glucosa (en ayunas)",
"POSTPRANDIAL": "Glucosa (posprandial)",
"RANDOM": "Glucosa (aleatoria)",
"BEDTIME": "Glucosa (al acostarse)"
},
"wellness": {
"title": "Puntuaciones de bienestar",
"disclaimer": "Puntuaciones descriptivas (0–100) calculadas a partir de las señales registradas. No son una evaluación clínica ni un diagnóstico.",
"recovery": "Puntuación de recuperación",
"stress": "Puntuación de estrés",
"strain": "Puntuación de esfuerzo",
"score": "Puntuación de bienestar"
},
"footer": "Compartido desde HealthLog — un registro de salud autoalojado."
},
"cycle": {
"symptomCategory": {
"physical": "Físico",
"emotional": "Emocional",
"digestive": "Digestivo",
"custom": "Personalizado"
},
"symptom": {
"cramps": "Calambres",
"headache": "Dolor de cabeza",
"bloating": "Hinchazón",
"acne": "Acné",
"breastTenderness": "Sensibilidad en los senos",
"fatigue": "Fatiga",
"backPain": "Dolor de espalda",
"insomnia": "Insomnio",
"libidoHigh": "Libido alta",
"libidoLow": "Libido baja",
"moodSwings": "Cambios de humor",
"foodCravings": "Antojos",
"nausea": "Náuseas",
"diarrhea": "Diarrea",
"constipation": "Estreñimiento",
"custom": {
"add": "Añadir síntoma",
"label": "Nombre",
"labelPlaceholder": "p. ej. Mareo",
"icon": "Icono",
"limitReached": "Se alcanzó el límite de síntomas personalizados.",
"remove": "Eliminar {label}",
"fallbackLabel": "Síntoma personalizado"
}
},
"prediction": {
"disclaimer": "Las predicciones son estimaciones basadas en tus datos registrados, no son consejo médico ni un método anticonceptivo. La precisión mejora a medida que registras más ciclos."
},
"insights": {
"headline": {
"title": "Tu ciclo y tu cuerpo",
"restingHeartRate": "Tu frecuencia cardíaca en reposo es unos {delta} {unit} {dir} en tu fase lútea que en tu fase folicular.",
"heartRateVariability": "Tu variabilidad de la frecuencia cardíaca es unos {delta} {unit} {dir} en tu fase lútea que en tu fase folicular.",
"generic": "Tu {metric} es unos {delta} {unit} {dir} en tu fase lútea que en tu fase folicular.",
"dirHigher": "más alta",
"dirLower": "más baja",
"empty": "Aún no hay suficientes ciclos ni registros para mostrar un patrón de fase. Sigue registrando: se completará a medida que crezca tu historial."
},
"crosstab": {
"description": "Cómo se compara cada medición entre tus fases lútea y folicular, con tus propios datos.",
"pairLabel": "{metric} · lútea vs. folicular",
"detail": "Lútea {lutealAvg} {unit} ({lutealDays} días) vs. folicular {follicularAvg} {unit} ({follicularDays} días).",
"footer": "Son asociaciones en tus propios datos, no causas. Solo se muestran los patrones que superan una prueba de significación.",
"metricRestingHeartRate": "Frecuencia cardíaca en reposo",
"metricHrv": "Variabilidad de la frecuencia cardíaca",
"metricSleepDuration": "Duración del sueño",
"metricSteps": "Pasos",
"metricWeight": "Peso",
"metricBasalBodyTemp": "Temperatura basal",
"metricWristTemperature": "Temperatura de la muñeca nocturna",
"metricSkinTemperature": "Temperatura de la piel",
"metricBloodGlucose": "Glucosa en sangre",
"metricMood": "Estado de ánimo",
"unitHours": "h",
"unitSteps": "pasos",
"unitBpm": "lpm",
"unitMs": "ms",
"unitKg": "kg",
"unitCelsius": "°C",
"unitGlucose": "mg/dL",
"unitMood": "pts",
"confidenceLow": "Confianza baja",
"confidenceMedium": "Confianza media",
"confidenceHigh": "Confianza alta"
},
"title": "Análisis del ciclo",
"empty": "Los análisis por fase aparecen aquí cuando tienes suficientes ciclos registrados. Comparan tus métricas entre fases del ciclo, mostrando la estadística abiertamente.",
"sampleSize": "n = {n}",
"effectSize": "Tamaño del efecto {value}",
"qValue": "q = {value}",
"symptomPatternsTitle": "Patrones de síntomas por fase",
"symptomPatternsEmpty": "Registra síntomas a lo largo de un ciclo para ver en qué fase se concentran.",
"symptomMostlyIn": "Sobre todo en {phase} ({count}/{total} días)"
},
"phaseEducation": {
"title": "Qué está pasando ahora",
"whatsHappening": {
"MENSTRUAL": "Tu menstruación es el inicio de un nuevo ciclo, mientras el revestimiento uterino se desprende. La energía y el ánimo suelen sentirse más bajos en estos primeros días.",
"FOLLICULAR": "Tras la menstruación, el estrógeno sube de forma gradual mientras el cuerpo prepara un óvulo. Muchas personas notan una energía más estable durante esta etapa.",
"OVULATORY": "Hacia la mitad del ciclo se libera un óvulo y la fertilidad alcanza su punto máximo durante una ventana corta. Esta fase es la más breve de las cuatro.",
"LUTEAL": "Después de la ovulación, la progesterona sube y el cuerpo se asienta. En los días previos a la siguiente menstruación, algunas personas notan cambios premenstruales."
},
"context": {
"MENSTRUAL": "Los niveles hormonales están en su punto más bajo, por eso estos días pueden sentirse como un reinicio tranquilo. Algunas personas notan cólicos, un sueño más ligero o ganas de bajar el ritmo; otras los atraviesan casi sin cambios. Todo ello entra dentro de lo normal, y cómo se siente puede variar de un ciclo a otro.",
"FOLLICULAR": "Con el estrógeno en aumento, muchas personas describen estos días como luminosos y abiertos: el sueño suele llegar con más facilidad y la mente se siente más despejada. La temperatura basal suele mantenerse en su franja más baja hasta justo antes de la ovulación. La duración de esta fase es la que más varía de una persona a otra y de un ciclo a otro.",
"OVULATORY": "El estrógeno alcanza su máximo justo antes de liberarse el óvulo, a menudo junto con un breve ánimo más alto y una ligera subida de la temperatura basal en el día o los dos días siguientes. El flujo cervical tiende a volverse más transparente y elástico en torno a esta ventana. Una breve punzada en un lado es algo que algunas personas notan; muchas no sienten nada, y ambas cosas son del todo normales.",
"LUTEAL": "La progesterona guía la segunda mitad y la temperatura basal suele asentarse algo más alta que al inicio del ciclo. Algunas personas notan cambios en el sueño, el apetito, el ánimo o la energía a medida que pasan los días, mientras que otras se sienten estables todo el tiempo. El patrón es personal y a menudo se ve distinto de un mes a otro."
},
"commonHere": "Esto lo notas a menudo aquí",
"trackNudge": "Registrar hoy",
"stillLearning": "Aún estamos conociendo tu ciclo. Sigue registrando y esto se irá completando con patrones de tus propios días."
},
"insightsSummary": {
"title": "Tu ciclo",
"currentDay": "Día {day} de tu ciclo",
"noActiveCycle": "Aún no hay un ciclo activo",
"viewDetails": "Ver análisis del ciclo"
},
"wellnessRing": {
"label": "Ciclo"
},
"disclaimer": "Estas predicciones son estimaciones descriptivas a partir de tus datos registrados, no un método anticonceptivo ni un consejo médico. Nunca indican que sea seguro tener relaciones sin protección. Para anticoncepción o cualquier decisión médica, consulta a un profesional sanitario.",
"title": "Tu ciclo",
"subtitle": "Registra tu periodo y síntomas, y mira qué viene después.",
"tabs": {
"calendar": "Calendario",
"predictions": "Predicciones",
"insights": "Análisis",
"settings": "Ajustes"
},
"logToday": "Registrar hoy",
"startedPeriod": "Mi periodo empezó hoy",
"endedPeriod": "Mi periodo terminó hoy",
"phase": {
"MENSTRUAL": "Menstrual",
"FOLLICULAR": "Folicular",
"OVULATORY": "Ovulatoria",
"LUTEAL": "Lútea",
"none": "Sin fase",
"label": "Fase"
},
"flow": {
"NONE": "Ninguno",
"SPOTTING": "Manchado",
"LIGHT": "Ligero",
"MEDIUM": "Medio",
"HEAVY": "Abundante",
"label": "Flujo"
},
"ovulationTest": {
"NEGATIVE": "Negativo",
"POSITIVE_LH_SURGE": "Pico de LH",
"ESTROGEN_SURGE": "Pico de estrógeno",
"INDETERMINATE": "Indeterminado",
"label": "Test de ovulación"
},
"mucus": {
"DRY": "Seco",
"STICKY": "Pegajoso",
"CREAMY": "Cremoso",
"WATERY": "Acuoso",
"EGG_WHITE": "Clara de huevo",
"label": "Moco cervical"
},
"cervixPosition": {
"LOW": "Bajo",
"HIGH": "Alto"
},
"cervixFirmness": {
"FIRM": "Firme",
"SOFT": "Blando"
},
"cervixOpening": {
"CLOSED": "Cerrado",
"OPEN": "Abierto"
},
"goal": {
"GENERAL_HEALTH": "Salud general",
"AVOID_PREGNANCY": "Evitar el embarazo",
"TRYING_TO_CONCEIVE": "Buscando embarazo",
"PERIMENOPAUSE": "Perimenopausia",
"OFF": "Seguimiento desactivado",
"label": "¿Para qué haces seguimiento?",
"description": "Esto define el lenguaje y qué predicciones ves. La guía de ventana fértil solo aparece si buscas embarazo."
},
"ring": {
"dayOfCycle": "Día {day}",
"dayUnknown": "—",
"ariaPhase": "Día {day} del ciclo, fase {phase}",
"ariaUnknown": "Aún no hay ciclo activo",
"caption": "de tu ciclo",
"firstPeriodCta": "Registrar mi primer periodo"
},
"calendar": {
"legendPeriod": "Periodo registrado",
"legendPredicted": "Periodo previsto",
"legendFertile": "Ventana fértil",
"legendOvulation": "Ovulación",
"legendSymptoms": "Síntomas registrados",
"prevMonth": "Mes anterior",
"nextMonth": "Mes siguiente",
"loading": "Cargando tu calendario…",
"empty": "Empieza a registrar para ver tu calendario.",
"learning": "Estamos aprendiendo tu ciclo: registra al menos tres ciclos completos y se completarán la ventana fértil, la ovulación y las fases. Hasta entonces, el calendario solo muestra lo que has registrado.",
"today": "Hoy",
"dayAria": "{date}",
"legendSymptom": "Síntomas",
"legendOvulationConfirmed": "Ovulación confirmada",
"flowSpotting": "manchado",
"flowLight": "ligero",
"flowMedium": "medio",
"flowHeavy": "abundante"
},
"predictions": {
"title": "Qué viene después",
"nextPeriod": "Próximo periodo",
"nextPeriodRange": "Alrededor del {date}",
"nextPeriodWindow": "{low} – {high}",
"fertileWindow": "Ventana fértil",
"ovulation": "Ovulación estimada",
"confidence": "Confianza",
"confidenceHigh": "Alta",
"confidenceMedium": "Media",
"confidenceLow": "Baja",
"stillLearning": "Aún aprendiendo",
"stillLearningBody": "Registra al menos tres ciclos completos y tus predicciones mejorarán. Hasta entonces es una estimación aproximada.",
"rawMode": "Predicción desactivada",
"rawModeBody": "Has desactivado las predicciones — solo se muestran tus datos registrados, sin pronóstico.",
"none": "Aún no hay predicción. Registra un periodo para empezar.",
"ovulationConfirmed": "Ovulación (confirmada)"
},
"history": {
"title": "Tus ciclos",
"avgLength": "Duración media",
"variability": "Variabilidad",
"avgPeriodLength": "Periodo medio",
"regularity": "Regularidad",
"regularityREGULAR": "Regular",
"regularityIRREGULAR": "Irregular",
"regularityLEARNING": "Aprendiendo",
"days": "{count} días",
"daysPlusMinus": "± {count} días",
"none": "Aún no hay ciclos registrados.",
"recentCycles": "Ciclos recientes",
"ongoing": "en curso",
"periodDays": "período {count} d",
"ovulationChip": "Ovulación",
"chartTitle": "Duración del ciclo en el tiempo",
"chartCaption": "Cada barra es un ciclo: la base rosa es tu periodo, el resto es la duración del ciclo.",
"chartAria": "Gráfico de duración de tus últimos {count} ciclos, con una media de {avg} días, clasificado como {regularity}.",
"legendPeriodSegment": "Días de periodo",
"legendRestSegment": "Resto del ciclo"
},
"sheet": {
"title": "Registrar tu día",
"description": "Captura el flujo, los síntomas y las notas de hoy.",
"date": "Fecha",
"flow": "Flujo",
"symptoms": "Síntomas",
"temperature": "Temperatura basal",
"temperaturePlaceholder": "°C",
"temperatureDisturbed": "Marcar la medición como alterada",
"temperatureDisturbedHint": "Fiebre, enfermedad, alcohol o una medición tardía: se excluye de la evaluación de temperatura.",
"ovulationTest": "Test de ovulación",
"mucus": "Moco cervical",
"cervix": "Cuello uterino",
"cervixPosition": "Posición",
"cervixFirmness": "Firmeza",
"cervixOpening": "Apertura",
"intercourse": "Relaciones",
"protected": "Protegidas",
"note": "Nota",
"notePlaceholder": "Algo que quieras recordar de hoy…",
"save": "Guardar",
"saving": "Guardando…",
"cancel": "Cancelar",
"saved": "Día guardado",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"periodStarted": "Inicio del periodo registrado",
"clear": "Ninguno",
"intermenstrualBleeding": "Manchado entre periodos",
"pregnancyTest": "Prueba de embarazo",
"progesteroneTest": "Prueba de progesterona",
"contraceptive": "Anticonceptivo",
"severity": "Intensidad",
"severityLevel": "Intensidad {level} de 4",
"delete": "Eliminar",
"temperatureSection": "Temperatura y ovulación",
"intimacySection": "Intimidad y anticoncepción",
"testsSection": "Pruebas"
},
"settings": {
"title": "Ajustes del ciclo",
"enable": "Seguimiento del ciclo",
"enableDescription": "Activa o desactiva la pestaña del ciclo en tu cuenta.",
"typicalCycleLength": "Duración típica del ciclo (días)",
"typicalPeriodLength": "Duración típica del periodo (días)",
"lutealPhaseLength": "Duración de la fase lútea (días)",
"priorsDescription": "Estos valores ayudan a tus predicciones antes de registrar muchos ciclos. Déjalos en blanco para usar los predeterminados.",
"rawChartMode": "Modo de gráfico en bruto",
"rawChartModeDescription": "Muestra solo tus datos registrados, sin predicciones ni interpretación.",
"secondarySymptomLabel": "Segundo signo de fertilidad",
"secondarySymptomDescription": "El segundo signo que se combina con tu temperatura para la doble comprobación sintotérmica. La mayoría observa el moco cervical; cambia a la observación del cuello uterino si lo prefieres.",
"secondarySymptom": {
"MUCUS": "Moco cervical",
"CERVIX": "Cuello uterino"
},
"prediction": "Predicciones",
"predictionDescription": "Pronostica tu próximo periodo y, cuando corresponda, tu ventana fértil.",
"encryption": "Cifrar entradas sensibles",
"encryptionDescription": "Cifra en reposo los campos que revelan intención (test de embarazo, anticoncepción, relaciones), además de las notas siempre cifradas.",
"discreet": "Notificaciones discretas",
"discreetDescription": "Oculta los detalles del ciclo en el texto de las notificaciones de tu pantalla de bloqueo.",
"dataTitle": "Tus datos",
"dataDescription": "Tus datos del ciclo viven solo en este servidor. Expórtalos cuando quieras o elimínalos para siempre.",
"export": "Exportar mis datos del ciclo",
"deleteData": "Eliminar mis datos del ciclo",
"saved": "Ajustes guardados",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"save": "Guardar",
"purgeTitle": "Eliminar todos los datos del ciclo",
"purgeDescription": "Elimina de forma permanente cada día registrado, ciclo, predicción y registro de recordatorio. No se puede deshacer.",
"purgeButton": "Eliminar todos los datos del ciclo",
"purgeConfirmTitle": "¿Eliminar todos los datos del ciclo?",
"purgeConfirmBody": "Esto elimina de forma permanente todos los periodos, registros diarios, síntomas y predicciones. No se puede deshacer.",
"purgeConfirm": "¿Eliminar permanentemente todos los datos del ciclo?",
"purgeCancel": "Cancelar",
"purgeSuccess": "Todos los datos del ciclo eliminados.",
"purgeError": "No se pudieron eliminar los datos del ciclo.",
"reminders": "Recordatorios",
"remindersDescription": "Activa los recordatorios de período por canal en los ajustes de notificaciones.",
"remindersLink": "Ajustes de notificaciones",
"fertileReminder": "Recordatorio de ventana fértil",
"fertileReminderDescription": "Recibe un aviso unos días antes de tu ventana fértil estimada. Desactivado por defecto: actívalo por canal en los ajustes de notificaciones.",
"purgeData": "Eliminar datos del ciclo",
"purgeConfirmAction": "Sí, eliminar todo",
"purgeDone": "Datos del ciclo eliminados."
},
"testResult": {
"POSITIVE": "Positivo",
"NEGATIVE": "Negativo",
"INDETERMINATE": "No claro"
},
"contraceptive": {
"NONE": "Ninguno",
"UNSPECIFIED": "Otro",
"IMPLANT": "Implante",
"INJECTION": "Inyección",
"IUD": "DIU",
"INTRAVAGINAL_RING": "Anillo",
"ORAL": "Píldora",
"PATCH": "Parche",
"EMERGENCY": "Emergencia"
},
"loadError": "No se pudieron cargar tus datos del ciclo.",
"saveError": "No se pudo guardar tu registro del ciclo.",
"deleteError": "No se pudo eliminar la entrada.",
"bbt": {
"title": "Temperatura basal",
"caption": "Tu temperatura matutina a lo largo de este ciclo. Una subida sostenida de unos 0,2 °C sigue a la ovulación.",
"empty": "Aún no hay mediciones de temperatura",
"emptyHint": "Registra tu temperatura basal cada mañana para ver el cambio de temperatura de tu ciclo.",
"ovulationEstimate": "Ovulación est.",
"tooltipTemp": "{temp} °C",
"ovulationConfirmed": "Ovulación confirmada"
}
},
"cycleReminders": {
"periodSoonTitle": "El periodo llegará pronto",
"periodSoonBody": "Se prevé tu próximo periodo en unos dos días.",
"periodConfirmTitle": "¿Ha comenzado tu periodo?",
"periodConfirmBody": "Tu periodo estaba previsto para ahora. Regístralo para mantener las predicciones precisas.",
"fertileSoonTitle": "Ventana fértil próxima",
"fertileSoonBody": "Se prevé que tu ventana fértil estimada comience en unos dos días. Es una estimación, no una garantía médica ni anticonceptiva.",
"discreetTitle": "Recordatorio de HealthLog",
"discreetBody": "Tienes un recordatorio en HealthLog."
},
"dataList": {
"allSources": "Todas las fuentes",
"dateFrom": "Desde",
"dateTo": "Hasta",
"dateRange": "Periodo",
"typeLabel": "Tipo",
"sourceLabel": "Fuente",
"resetFilters": "Restablecer",
"clearFilter": "Quitar filtro: {label}",
"selectAll": "Seleccionar todo en esta página",
"selectRow": "Seleccionar fila",
"selected": "{count} seleccionados",
"deleteN": "Eliminar ({count})",
"clearSelection": "Borrar selección",
"selectionBarLabel": "Acciones de selección"
},
"measurementReminders": {
"sectionTitle": "Prevención",
"sectionDescription": "Recordatorios de qué medir o revisar, cuándo y dónde.",
"addButton": "Añadir recordatorio",
"markDone": "Hecho",
"delete": "Eliminar",
"disabledBadge": "Apagado",
"nextDue": {
"none": "Sin programar",
"today": "Vence hoy",
"tomorrow": "Vence mañana",
"inDays": "En {days} días"
},
"overdueByDays": "Vencido hace {days} días",
"cadence": {
"everyNDays": "Cada {days} días",
"custom": "Programación personalizada"
},
"location": {
"prefix": "En: {location}"
},
"types": {
"WEIGHT": "Peso",
"BLOOD_PRESSURE_SYS": "Presión arterial",
"PULSE": "Pulso",
"BLOOD_GLUCOSE": "Glucosa en sangre",
"OXYGEN_SATURATION": "Saturación de oxígeno",
"BODY_FAT": "Grasa corporal",
"BODY_TEMPERATURE": "Temperatura corporal"
},
"empty": {
"title": "Aún no hay recordatorios",
"description": "Añade un recordatorio para medir la presión arterial con regularidad o programar un análisis de sangre anual."
},
"form": {
"label": "Etiqueta",
"labelPlaceholder": "p. ej. Medir la presión arterial",
"kind": "Tipo",
"kindType": "Vinculado a una medición",
"kindFreeText": "Comprobación de texto libre",
"measurementType": "Medición",
"cadence": "Repetir",
"notifyHour": "Recordar a las",
"location": "Dónde (opcional)",
"locationPlaceholder": "p. ej. Médico, Laboratorio",
"save": "Guardar"
},
"pushTitle": "Recordatorio de prevención",
"pushBody": "Toca: {label}",
"pushLocation": "(en {location})"
},
"labs": {
"title": "Resultados de análisis",
"subtitle": "Analíticas de sangre y biomarcadores",
"addResult": "Añadir",
"addDescription": "Registra un biomarcador a partir de un informe de laboratorio.",
"addFirst": "Añade tu primer resultado",
"emptyTitle": "Aún no hay resultados",
"emptyDescription": "Registra analíticas como HbA1c, LDL o ferritina para seguirlas a lo largo del tiempo y compartirlas con tu médico.",
"referenceLabel": "Referencia",
"readingsCount": "{count} valores",
"deleteLatest": "Eliminar el último valor",
"deletedToast": "Resultado eliminado",
"deleteError": "No se pudo eliminar el resultado",
"loadError": "No se pudieron cargar los resultados",
"range": {
"inRange": "En rango",
"below": "Por debajo",
"above": "Por encima"
},
"form": {
"analyte": "Biomarcador",
"analytePlaceholder": "p. ej. HbA1c, LDL, Ferritina",
"value": "Valor",
"unit": "Unidad",
"unitPlaceholder": "p. ej. mg/dL, %, ng/mL",
"takenAt": "Fecha de la muestra",
"optionalGroup": "Opcional",
"panel": "Panel",
"panelPlaceholder": "p. ej. Hemograma completo",
"referenceLow": "Referencia mínima",
"referenceHigh": "Referencia máxima",
"referenceLowPlaceholder": "Límite inferior",
"referenceHighPlaceholder": "Límite superior",
"referenceHint": "Copia el rango de referencia de tu informe de laboratorio. Cualquiera de los límites es opcional.",
"note": "Nota",
"notePlaceholder": "Contexto opcional para este resultado",
"requiredError": "El biomarcador, el valor y la unidad son obligatorios.",
"rangeOrderError": "La referencia mínima no puede superar la máxima.",
"save": "Guardar",
"savedToast": "Resultado guardado",
"saveError": "No se pudo guardar el resultado"
}
}
}