Files
HealthLog/messages/es.json
T
Marc-André Bombeck dd6b0867a4 i18n: translate illness journal strings and add v1.25 UI strings
The illness journal copy (load error, delete confirmation, edit/menu
labels, parent links, and the vital-sign labels) shipped in English in
every locale; translate it into de/es/fr/it/pl. Also add the new strings
the v1.25 surfaces introduce — the biomarker 'load more readings' action,
the environment city-search zero-result message, and an accessible label
for the document upload file input — across all six locales.
2026-06-28 18:29:26 +02:00

7810 lines
401 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",
"disabled": "Desactivado",
"networkError": "Error de red",
"openDatePicker": "Abrir el selector de fecha",
"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",
"showPassword": "Mostrar contraseña",
"hidePassword": "Ocultar contraseña",
"learnMore": "Más información",
"dismiss": "Descartar",
"moreInfo": "Más información"
},
"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",
"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",
"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",
"glucoseClinical": {
"title": "Resumen de glucosa (clínico)",
"colMetric": "Métrica",
"colValue": "Valor",
"tirInRange": "Tiempo en rango (70–180 mg/dl)",
"tirLow": "Bajo (< 70 mg/dl)",
"tirVeryLow": "Muy bajo (< 54 mg/dl)",
"tirHigh": "Alto (> 180 mg/dl)",
"tirVeryHigh": "Muy alto (> 250 mg/dl)",
"mean": "Glucosa media",
"gmi": "Indicador de gestión de la glucosa (GMI)",
"eA1c": "A1C estimada",
"cv": "Variabilidad (CV%)",
"spotCaveat": "Son estimaciones a partir de mediciones puntuales, no un perfil de monitor continuo — léelas como una tendencia, no como un veredicto clínico."
},
"illnessTitle": "Afecciones y enfermedades",
"illnessOngoing": "En curso",
"illnessColCondition": "Afección",
"illnessColType": "Tipo",
"illnessColLifecycle": "Curso",
"illnessColOnset": "Inicio",
"illnessColResolved": "Resuelta"
},
"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.",
"showingCached": "Mostrando tus últimos datos sincronizados."
},
"demoBanner": {
"message": "Modo demo — los cambios no se guardan."
},
"nav": {
"dashboard": "Panel",
"measurements": "Mediciones",
"medications": "Medicamentos",
"insights": "Insights",
"achievements": "Logros",
"settings": "Ajustes",
"admin": "Consola de administración",
"logout": "Cerrar sesión",
"login": "Iniciar sesión",
"notifications": "Notificaciones",
"theme": "Apariencia",
"themeSystem": "Sistema",
"themeDark": "Oscuro",
"themeLight": "Claro",
"collapseSidebar": "Contraer",
"userMenu": "Menú de usuario",
"accountSettings": "Ajustes de cuenta",
"mood": "Estado de ánimo",
"coach": "Coach",
"skipToContent": "Saltar al contenido",
"sidebar": "Barra lateral",
"mainNavigation": "Navegación principal",
"mobileNavigation": "Navegación móvil",
"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",
"vorsorge": "Revisiones",
"illness": "Enfermedad",
"documents": "Documentos"
},
"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",
"passwordBreached": "Esta contraseña aparece en filtraciones de datos conocidas. Elige otra.",
"mfa": {
"title": "Autenticación de dos factores",
"totpHint": "Introduce el código de 6 dígitos de tu aplicación de autenticación.",
"recoveryHint": "Introduce uno de tus códigos de recuperación guardados.",
"securityKeyHint": "Usa tu llave de seguridad registrada para continuar.",
"codeLabel": "Código de autenticación",
"recoveryLabel": "Código de recuperación",
"verify": "Verificar",
"verifyFailed": "La verificación falló. Inténtalo de nuevo.",
"useSecurityKey": "Usar una llave de seguridad",
"useRecoveryCode": "Usar un código de recuperación",
"useAuthenticator": "Usar tu aplicación de autenticación",
"backToLogin": "Volver al inicio de sesión",
"rememberDevice": "Confiar en este dispositivo durante 30 días"
},
"enrollMfa": {
"title": "Configurar un segundo factor",
"body": "Tu administrador exige un segundo factor en esta cuenta. Añade una app de autenticación o una llave de seguridad para continuar.",
"signOut": "Cerrar sesión"
}
},
"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"
},
"briefing": {
"title": "Resumen de hoy",
"viewAll": "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",
"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",
"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": "Registra lecturas y consulta el historial completo. Las tendencias y los análisis están en Análisis.",
"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",
"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)",
"openMetricInsights": "Abrir análisis de {type}",
"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",
"typeResilience": "Resiliencia",
"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.",
"typePhq9Score": "Puntuación PHQ-9",
"typeGad7Score": "Puntuación GAD-7",
"typeGripStrength": "Fuerza de agarre",
"typePainNrs": "Dolor (0–10)",
"typeWaistCircumference": "Perímetro de cintura",
"typeWaistToHeight": "Índice cintura-altura"
},
"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"
},
"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",
"loadError": "No se pudieron cargar tus registros de estado de ánimo."
},
"medications": {
"title": "Medicamentos",
"subtitle": "Medicación, horarios y tomas",
"loginRequired": "Inicia sesión para gestionar medicamentos.",
"addMedication": "Añadir",
"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",
"inactive": "En pausa",
"intakeHistory": "Historial de tomas",
"openDetailPage": "Abrir la página de detalle del 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",
"requestExample": "Ejemplo de solicitud",
"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",
"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?",
"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",
"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",
"glp1LastInjection": "{label}",
"glp1NextInjectionDays": "{label} (en {days} días)",
"glp1NextInjectionToday": "hoy",
"glp1NextInjectionTomorrow": "mañana",
"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."
}
},
"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."
},
"titration": {
"title": "Plan de titulación",
"empty": "Aún no hay pasos de escalada de dosis registrados. Añade cambios de dosis con fecha para trazar el plan.",
"youAreHere": "Estás aquí",
"doseStep": "{dose} {unit}",
"plannedFor": "Previsto · {date}"
},
"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",
"phaseConfig": "Fases de recordatorio",
"phaseConfigDescription": "Configura los momentos de los recordatorios.",
"phaseGreen": "Verde",
"phaseYellow": "Amarillo",
"phaseOrange": "Naranja",
"phaseRed": "Rojo",
"phaseMinutes": "Mín",
"phasePercent": "%",
"phaseResetDefaults": "Restablecer valores por defecto",
"phaseSaved": "Fases de recordatorio guardadas",
"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",
"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."
},
"advanced": {
"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": {
"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",
"unknown": "Desconocido",
"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",
"a11y": {
"summary": "Gráfico de {metric}. Rango de {min} a {max}, último {latest}, tendencia {trend}.",
"noData": "Gráfico de {metric}. No hay datos disponibles.",
"trendUp": "en aumento",
"trendDown": "en descenso",
"trendFlat": "estable",
"scatterSummary": "Gráfico de correlación, {count} puntos que comparan {xLabel} con {yLabel}.",
"scatterNoData": "Gráfico de correlación de {xLabel} frente a {yLabel}. No hay datos disponibles.",
"moodHeatmap": "Mapa de calor de estado de ánimo de {start} a {end}, {days} días registrados.",
"moodHeatmapEmpty": "Mapa de calor de estado de ánimo, aún no hay días registrados.",
"complianceHeatmap": "Mapa de calor de cumplimiento de medicación de {start} a {end}, {days} días activos.",
"complianceHeatmapEmpty": "Mapa de calor de cumplimiento de medicación, aún no hay días activos."
}
},
"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": "Conecta un proveedor de IA para ver aquí una valoración de tus lecturas.",
"noProviderAction": "Abrir ajustes de IA",
"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",
"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…",
"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.",
"restModePaused": "En pausa durante la enfermedad — hoy tu puntuación no se evalúa.",
"componentBp": "PA",
"componentWeight": "Peso",
"componentMood": "Estado de ánimo",
"componentCompliance": "Cumplimiento",
"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",
"signalsTitle": "Señales del día",
"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": "El briefing diario resume tus lecturas en lenguaje claro. HealthLog necesita un proveedor de IA para ello: usa tu propia clave (OpenAI, Anthropic) o un modelo local. Tus datos siguen siendo tuyos.",
"noProviderAction": "Abrir ajustes de IA",
"staleNoProviderHint": "Este briefing no puede actualizarse: no hay ningún proveedor de IA conectado.",
"refreshFailedHint": "No se pudo actualizar el briefing: se muestra el anterior.",
"retryAction": "Reintentar",
"failedTitle": "No se pudo generar el briefing",
"failedDescription": "El proveedor de IA agotó el tiempo de espera o devolvió un error. Inténtalo de nuevo o aumenta el tiempo de espera de respuesta en los ajustes de IA para un modelo local lento."
},
"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."
},
"viewDetail": "Ver detalles de {metric}"
},
"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"
},
"correlationRow": {
"title": "Correlaciones",
"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.",
"errorNoProvider": "El coach lee tus datos de salud registrados y responde preguntas sobre ellos (no es consejo médico). HealthLog necesita un proveedor de IA para ello: conecta tu propia clave o un modelo local.",
"errorNoProviderAction": "Conectar un proveedor de IA",
"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",
"actionsMenu": "Acciones",
"maximizeAriaLabel": "Abrir en pantalla completa",
"minimizeAriaLabel": "Volver al panel",
"send": "Enviar",
"stop": "Detener",
"thinking": "Pensando…",
"composerPlaceholder": "Pregúntame algo …",
"nudgeBubbleLabel": "Nuevo mensaje del coach — abrir el chat",
"fabLabel": "Abrir el coach",
"readAloud": "Leer en voz alta",
"readAloudStop": "Detener lectura",
"messageTimeLabel": "Mensaje enviado {time}",
"copyMessage": "Copiar",
"copyMessageError": "No se pudo copiar",
"regenerate": "Reintentar",
"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.",
"settingsContextLabel": "Enviar contexto",
"settingsContextHint": "Bloques opcionales en los que el coach puede apoyarse. Si desactivas alguno, se omitirá en cada respuesta.",
"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. El cupo se reinicia a medianoche (UTC).",
"providerRateLimitTitle": "Proveedor con límite de tasa",
"providerRateLimitBody": "El proveedor está temporalmente saturado; reinicio en ~5 min.",
"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",
"dictate": "Dictar",
"dictateStop": "Detener el dictado",
"voiceUnsupported": "La entrada de voz no es compatible con este navegador",
"dictateError": "No se pudo iniciar la entrada de voz. Comprueba el permiso del micrófono e inténtalo de nuevo.",
"showConversations": "Mostrar conversaciones",
"hideConversations": "Ocultar conversaciones",
"heroGreeting": "Pregúntame lo que quieras sobre tus datos",
"heroSubline": "Pregunta por tus tendencias, medicamentos o mediciones.",
"thinkingElapsed": "{seconds}s",
"thinkingDuration": "Pensó durante {seconds}s",
"thinkingExpandAria": "Mostrar lo que el Coach tuvo en cuenta",
"thinkingDetail": "Respondido a partir de tu resumen de salud.",
"tokensUsed": "{count} tokens",
"tokensUsedWithModel": "{count} tokens · {model}",
"askAboutThis": "Pregúntale al coach sobre esto",
"readStrip": {
"label": "Lectura del Coach",
"baselineWithin": "Tu rango habitual es {low}–{high} {unit}; hoy {value} se sitúa dentro de él.",
"baselineAbove": "Tu rango habitual es {low}–{high} {unit}; hoy {value} se sitúa por encima.",
"baselineBelow": "Tu rango habitual es {low}–{high} {unit}; hoy {value} se sitúa por debajo.",
"insufficient": "Todavía estoy aprendiendo tu rango habitual — sigue registrando unos días más.",
"driver": "{note}"
},
"scope": {
"prefix": "El Coach ya está en {metric}",
"tap": "Toca para preguntar",
"question": "Explícame esta métrica — ¿hay algo que deba vigilar?"
},
"seeded": {
"prefix": "Hoy merece un vistazo: {signal}",
"signal": {
"readiness": "disposición",
"recovery": "recuperación"
},
"question": {
"readiness": "Mi disposición está rara hoy — ¿a qué se debe?",
"recovery": "Mi recuperación ha cambiado — ¿qué hay detrás?"
},
"dismiss": "Descartar"
},
"settings": "Ajustes",
"history": {
"groupToday": "Hoy",
"groupYesterday": "Ayer",
"groupThisWeek": "Esta semana",
"groupEarlier": "Anteriores"
},
"seed": {
"bloodPressure": "Repasa conmigo la tendencia de mi presión arterial de los últimos 30 días — ¿hay algo que deba vigilar?",
"weight": "¿Cómo ha evolucionado mi peso últimamente y la dirección es algo sobre lo que actuar?",
"bmi": "¿Qué me dice mi tendencia de IMC y cómo debería interpretarla?",
"pulse": "Repasa conmigo mis lecturas de pulso — ¿hay algo fuera de lo normal?",
"restingHr": "¿Cómo ha evolucionado mi frecuencia cardíaca en reposo y qué dice sobre mi forma física?",
"hrv": "¿Qué me dice mi variabilidad de la frecuencia cardíaca sobre la recuperación y el estrés últimamente?",
"sleep": "Repasa conmigo mi sueño reciente — duración, regularidad y cualquier cosa que valga la pena cambiar.",
"mood": "¿Qué patrones ves en mi estado de ánimo durante las últimas semanas?",
"medications": "¿Cómo va mi adherencia a la medicación y coincide con cómo me he sentido?",
"steps": "¿Qué tan activo he estado últimamente según mis pasos y cómo se compara con un nivel de referencia saludable?",
"activeEnergy": "¿Qué dice mi tendencia de energía activa sobre mi nivel de actividad últimamente?",
"cardioFitness": "¿Qué significa la tendencia de mi capacidad cardiorrespiratoria (VO₂ máx.) y cómo la llevo en la dirección correcta?",
"bloodGlucose": "Repasa conmigo mis últimas lecturas de glucosa — ¿están en un rango saludable?",
"oxygenSaturation": "¿Qué me dice mi tendencia de oxígeno en sangre (SpO₂)?",
"respiratoryRate": "¿Qué dice mi tendencia de frecuencia respiratoria sobre mi salud?",
"workouts": "Repasa conmigo mis entrenamientos recientes — carga, frecuencia y cómo me recupero entre ellos.",
"recoveryPage": "¿Por qué mi recuperación está donde está ahora mismo y qué la está provocando?",
"briefing": "Repasa conmigo el resumen de hoy — ¿en qué debería centrarme y hay algo en lo que valga la pena actuar?",
"healthScore": "¿Por qué mi puntuación de salud es {score} de 100 y qué la mejoraría más?",
"periodWeek": "Repasa conmigo cómo fue mi última semana en mis métricas de salud — ¿qué destaca?",
"periodMonth": "Repasa conmigo cómo fue mi último mes en mis métricas de salud — ¿qué destaca?",
"correlationBpCompliance": "¿Cómo se relaciona mi adherencia a la medicación con mi presión arterial? Explícame qué significa esta correlación para mí.",
"correlationMoodPulse": "¿Existe una relación real entre mi estado de ánimo y mi pulso? Ayúdame a interpretar esta correlación.",
"correlationWeightWeekday": "¿Mi peso sigue un patrón semanal? ¿Qué me dice esta correlación por día de la semana?",
"recommendation": "Cuéntame más sobre esta recomendación: \"{text}\" — ¿por qué se aplica a mí y qué debería hacer al respecto?"
},
"assessmentPrompt": "Explícame mi evaluación de {metric}: ¿qué significa y qué debería hacer al respecto?"
},
"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."
},
"coachPrefill": "Aún no he registrado ninguna frecuencia cardíaca en reposo: ¿por qué el valor diario en reposo difiere de un pulso puntual y cómo puedo mejorarlo?"
},
"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"
},
"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: el mejor índice de laboratorio de la forma aeróbica, que los wearables estiman de forma indirecta. Como orientación general, la forma física es un predictor gradual de supervivencia: cada MET adicional (unos 3,5 ml/kg/min) se asocia a una mortalidad entre un 10 % y un 25 % menor (AHA, Circulation 2016). Una tendencia más alta o en aumento es una fuerte 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 y se indica como la diferencia respecto a tu valor de referencia, no como un valor absoluto. 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 wearable. 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 una estimación de cuánto podrías caminar en seis minutos, una prueba clínica clásica de movilidad y resistencia cardiopulmonar. El valor del wearable es una aproximación, no la prueba clínica supervisada; lo útil es la tendencia estable o en aumento.",
"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": "Un wearable puede estimar con qué frecuencia se interrumpió tu respiración mientras dormías. Un índice más bajo es mejor; un nivel marcado como elevado, sobre todo durante muchas noches, conviene comentarlo con un profesional. Es una aproximación de cribado, no un diagnóstico de apnea del sueño.",
"stepsTitle": "Pasos",
"stepsBody": "El recuento de pasos es el número total de pasos que das cada día. Es la medida más sencilla del movimiento cotidiano: un recuento diario más alto suele reflejar un estilo de vida más activo, y un hábito constante importa más que un único día destacado.",
"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.",
"pulsePressureTitle": "Presión de pulso",
"pulsePressureBody": "La presión de pulso es la diferencia entre tu valor sistólico y diastólico (sistólico menos diastólico). Como orientación general, unos 40 mmHg es lo típico en reposo; una diferencia amplia por encima de unos 60 mmHg en la mediana edad puede reflejar arterias más rígidas, mientras que una diferencia estrecha por debajo de unos 25 mmHg puede acompañar a un bajo volumen sistólico (StatPearls/NIH 2023). Es un motivo de conversación, no un diagnóstico.",
"meanArterialPressureTitle": "Presión arterial media",
"meanArterialPressureBody": "La presión arterial media es la presión promedio que ven tus órganos a lo largo de un latido, aproximadamente la diastólica más un tercio de la diferencia con la sistólica. Como orientación general, un valor en reposo ronda los 70–100 mmHg (StatPearls/NIH 2023). El umbral de ~60 mmHg que se suele citar es un concepto de cuidados agudos, no una alarma para el autocontrol.",
"cycleEducationBody": "Tu ciclo atraviesa cuatro fases impulsadas por hormonas, y su duración y regularidad son una ventana accesible a la salud general. Como orientación general, los ciclos en personas adultas suelen durar 21–35 días (las referencias clínicas citan 24–38), con un sangrado de unos cinco días (ACOG 2015). La fase lútea es el ancla estable, así que la ovulación se estima mejor contando hacia atrás desde tu próxima regla prevista, nunca con un «día 14» fijo. Una ventana fértil predicha es una estimación que necesita varios ciclos registrados y sigue siendo aproximada, y la temperatura basal confirma la ovulación a posteriori en lugar de predecirla. No es un método anticonceptivo.",
"sleepHygieneBody": "Algunos hábitos con respaldo de evidencia favorecen el sueño: mantener horarios constantes de acostarse y levantarse incluso los fines de semana, recibir luz brillante por la mañana y atenuar las noches, una habitación fresca, oscura y silenciosa, y evitar la cafeína por la tarde, el alcohol tardío y las comidas copiosas a última hora (CDC 2024). La regularidad predice la salud al menos tanto como la duración, y el tiempo total de sueño de un wearable es mucho más fiable que su reparto entre sueño profundo, ligero y REM.",
"referenceGuidance": "Orientación general, no consejo médico. Los rangos de referencia son valores poblacionales que cambian con tu edad, sexo y condiciones de salud; tu propia tendencia a lo largo del tiempo guía la lectura."
},
"bpDerived": {
"pulsePressure": "La presión de pulso (la diferencia entre tus valores) es de unos {value} mmHg; alrededor de 40 es lo típico en reposo.",
"meanArterialPressure": "La presión arterial media (el promedio que ven tus órganos) es de unos {value} mmHg, normalmente entre 70 y 100.",
"caveat": "Estos valores se derivan de tu última lectura como orientación general, no como diagnóstico."
},
"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",
"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}",
"estimateNote": "Los tiempos de cada fase son estimados: esta fuente informa totales por fase, no una cronología medida."
},
"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.",
"computedInfo": "Esta es la estimación propia de HealthLog: un balance móvil de la necesidad menos el sueño de las últimas noches, que el sueño de recuperación va reduciendo. Puede diferir de la cifra de deuda de sueño nativa de un wearable, que usa su propio modelo de necesidad."
},
"average": {
"title": "Media por noche",
"value": "{hours} h {minutes} min",
"caption": "Sueño medio en las últimas {nights} noches",
"learning": "Aún estamos midiendo tu sueño — {counted} noches hasta ahora, faltan {remaining} para una media 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.",
"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"
},
"midpointHeadline": "El punto medio natural de tu sueño ronda las {clock}."
},
"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",
"restMode": {
"title": "Modo descanso",
"body": "Hay un episodio de enfermedad o afección activo, por lo que esto refleja un periodo de recuperación. Tu puntuación no baja por ello.",
"bodySince": "Hay un episodio de enfermedad o afección activo desde el {since}, por lo que esto refleja un periodo de recuperación. Tu puntuación no baja por ello."
},
"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.",
"labsLink": "¿Resultados de laboratorio? Registra una HbA1c o glucosa en ayunas de una analítica en Laboratorio.",
"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",
"sectionSubtitle": "Señales cardiovasculares y respiratorias en reposo frente a tu propia línea base",
"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",
"sectionSubtitle": "Valores combinados de recuperación, estrés y esfuerzo leídos de tus dispositivos conectados",
"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á.",
"illnessExplained": "Es probable que estas variaciones reflejen la afección que registraste."
},
"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"
},
"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.",
"block": {
"ansChargeExplainer": "Cuán cargado está tu sistema nervioso autónomo para el día — una lectura de recarga obtenida de tus señales nocturnas de corazón y respiración.",
"dayStrainExplainer": "La carga cardiovascular del día en la escala de esfuerzo de tu dispositivo. Léela en relación con tu recuperación, no como una meta en sí.",
"workoutStrainExplainer": "Cuán exigente fue un entrenamiento en la misma escala de esfuerzo — el coste cardiovascular de esa sesión.",
"cardioLoadExplainer": "Una aproximación de la carga de entrenamiento que sigue la carga cardiovascular acumulada. Compárala con tus propios días recientes.",
"averageHeartRateExplainer": "Tu frecuencia cardíaca media a lo largo de todo el día o ciclo, según informa tu wearable.",
"maxHeartRateExplainer": "Tu frecuencia cardíaca máxima a lo largo de todo el día o ciclo, según informa tu wearable.",
"energyExpenditureKjExplainer": "La energía que tu cuerpo gastó durante el día, en kilojulios, tal como tu dispositivo la informa de forma nativa."
}
},
"bodyTempDeviation": {
"title": "Desviación de la temperatura corporal",
"subtitle": "Variación nocturna respecto a tu línea base"
},
"resilience": {
"explainer": "Cómo equilibra tu cuerpo la carga diaria con la recuperación, leído a partir de tus señales nocturnas de los últimos días.",
"learning": "Aún estamos aprendiendo tu resiliencia — unos días más asentarán el nivel.",
"band": {
"limited": "Limitada",
"adequate": "Adecuada",
"solid": "Sólida",
"strong": "Fuerte",
"exceptional": "Excepcional"
},
"trend": {
"above": "Por encima de tu media reciente.",
"steady": "En línea con tu media reciente.",
"below": "Por debajo de tu media reciente."
}
},
"briefing": {
"memory": {
"recall": "Antes, {text}",
"forward": "Mirando hacia adelante: {text}",
"forwardWatch": "Conviene vigilar {metric}.",
"forwardHolding": "Por ahora todo se mantiene estable."
}
},
"tension": {
"label": "Lectura sincera: {positive} tiene buena pinta, pero {negative} flojea — el conjunto queda en {band}.",
"contributor": {
"green": "verde",
"yellow": "amarillo",
"red": "rojo"
}
},
"streak": {
"returnLabel": "Tu {metric} ha vuelto a tu rango habitual tras {count} días — fuera lo que fuera, ya pasó.",
"daysInside": "{count} días dentro",
"daysOutside": "{count} días fuera"
},
"updatedTodayAt": "Actualizado hoy, {time}",
"updatedYesterday": "Actualizado ayer",
"updatedOn": "Actualizado el {date}",
"healthStatus": {
"sectionTitle": "Qué ha cambiado",
"subtitle": "Señales que se desvían de tu rango habitual.",
"deviationAbove": "{vital} está por encima de tu rango habitual.",
"deviationBelow": "{vital} está por debajo de tu rango habitual.",
"shiftUp": "{vital} ha subido respecto a tu normal reciente.",
"shiftDown": "{vital} ha bajado respecto a tu normal reciente.",
"rangeContext": "Ahora {value}, normalmente {low}–{high}.",
"shiftContext": "Cerca de {before} antes, {after} desde entonces."
},
"breathingScreening": {
"sectionTitle": "Respiración durante el sueño",
"subtitle": "Una señal de cribado de tus datos de sueño.",
"classificationElevated": "Tu dispositivo detectó alteraciones respiratorias elevadas.",
"classificationNotElevated": "La clasificación de tu dispositivo no es elevada.",
"trendUp": "Con tendencia al alza respecto a noches anteriores.",
"trendDown": "Con tendencia a la baja respecto a noches anteriores.",
"trendStable": "Estable respecto a noches anteriores.",
"nights": "{count} noches registradas",
"indexLine": "índice medio reciente {value}",
"eventsFlagged": "{count} eventos detectados por tu dispositivo",
"disclaimer": "Es una señal de cribado, no un diagnóstico: consultalo con un profesional médico."
},
"labsChanges": {
"sectionTitle": "Desde tu último análisis",
"subtitle": "Cómo se comparan tus últimos resultados con el análisis anterior.",
"statusInRange": "dentro del rango",
"statusBelow": "por debajo del rango",
"statusAbove": "por encima del rango",
"directionFlat": "sin cambios"
}
},
"thresholds": {
"defaultLabel": "Por defecto",
"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",
"steps": {
"dashboardOverview": {
"title": "Tu panel",
"body": "El panel reúne todos los módulos de un vistazo. Mantén pulsada una tarjeta para reordenarla u ocultarla (Ajustes → Diseño del panel). Cada tarjeta vale tanto como los datos que tiene detrás: los módulos siguientes los rellenan."
},
"quickAdd": {
"title": "Registrado en segundos",
"body": "Con «+ Añadir» registras cualquier medición en segundos: peso, tensión, pulso, glucosa. Fuerza oculta: fechar valores olvidados. Todo lo que registras aquí alimenta las tendencias, la puntuación de salud y las ideas de IA."
},
"measurements": {
"title": "Mediciones y rangos objetivo",
"body": "Mediciones muestra el historial y el rango objetivo de cada métrica. Joya oculta: define un rango por valor para que las desviaciones resalten en color. Estas series son la base de las correlaciones del Coach y del informe médico."
},
"medications": {
"title": "Medicación y tomas",
"body": "Medicación gestiona horarios, tomas, existencias y titulación. Oculto: planes recurrentes (RRULE/rotativos) y avisos de poco stock. Tu tasa de tomas alimenta el pilar de cumplimiento del panel y el contexto de la IA."
},
"labs": {
"title": "Valores de laboratorio",
"body": "Laboratorio recoge biomarcadores con rangos de referencia: hemograma, colesterol, HbA1c. Fuerza: importación y exportación FHIR. Los valores fuera de rango reaparecen como pruebas en las ideas y en el informe médico."
},
"illness": {
"title": "Diario de enfermedades",
"body": "El diario de enfermedades registra episodios agudos y diagnósticos crónicos con sus brotes. Oculto: correlacionar un episodio con tus mediciones y el Modo descanso que pausa los recordatorios. Así el Coach entiende por qué los valores varían un tiempo."
},
"vorsorge": {
"title": "Revisiones",
"body": "Las revisiones te recuerdan controles y vacunas con su propio intervalo. Consejo: «Hecho» puede crear directamente una medición o un resultado de laboratorio. Lo pendiente aparece como recordatorio y en el informe médico."
},
"cycle": {
"title": "Ciclo",
"body": "El seguimiento del ciclo registra fases y síntomas. Oculto: comparar síntomas con el ánimo y el sueño. El ciclo aporta contexto a variaciones que de otro modo parecerían inexplicables."
},
"mood": {
"title": "Ánimo",
"body": "Ánimo capta cómo te sientes y etiquetas en dos segundos. Fuerza: tus propias etiquetas. Las tendencias de ánimo se correlacionan con el sueño, la medicación y el ciclo: el Coach detecta los patrones."
},
"insights": {
"title": "Ideas",
"body": "Ideas es el corazón: análisis dinámico y basado en pruebas en lugar de consejos genéricos; cada afirmación apunta a tus datos reales. Oculto: el diseño es personalizable. Ideas reúne todo lo que aportan los módulos anteriores."
},
"coach": {
"title": "Coach",
"body": "El Coach responde preguntas sobre tus datos en diálogo, usando tu historial, medicación y valores de laboratorio como contexto. Tú eliges el proveedor de IA (tu propia clave o local). No recalcula nada: lee las mismas cifras que el panel."
},
"integrations": {
"title": "Integraciones",
"body": "Las integraciones sincronizan Withings, WHOOP, Polar, Oura y Apple Health automáticamente. Peso, sueño y recuperación se rellenan sin teclear, y a su vez alimentan las ideas y el Coach."
},
"export": {
"title": "Informe médico",
"body": "El informe médico reúne mediciones, medicación, valores de laboratorio y revisiones en PDF o FHIR para la cita. Aquí convergen todos los módulos: un informe completo solo sale de datos bien cuidados."
},
"achievements": {
"title": "Logros",
"body": "Los logros premian la constancia: rachas e hitos. Un pequeño bucle de motivación que facilita seguir adelante."
},
"wrapUp": {
"title": "Esto es la visita",
"body": "Puedes volver a ver cualquier módulo por separado cuando quieras («Mostrar esta visita» en cada página) o reiniciar la visita completa en Ajustes → Avanzado."
}
}
},
"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",
"aiTitle": "Activar Insights con IA (opcional)",
"aiBody": "El coach, el briefing diario y las valoraciones convierten tus lecturas en lenguaje claro. Para ello conectas tu propia clave de IA (OpenAI, Anthropic) o un modelo local: tus datos siguen siendo tuyos.",
"aiCta": "Conectar un proveedor de IA"
},
"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"
},
"disclaimer": {
"acknowledge": "Lo entiendo: HealthLog es una herramienta privada de seguimiento, no una valoración clínica ni un diagnóstico. Si me preocupa algo, hablaré con mi médico, no con esta app.",
"learnMore": "Más información"
},
"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.",
"subtitle": "Tu perfil, identidad y datos de acceso."
},
"integrations": {
"title": "Integraciones",
"description": "Servicios conectados, canales de entrega y prioridad de fuentes en un solo lugar.",
"subtitle": "Conecta y gestiona tus fuentes de datos y dispositivos."
},
"notifications": {
"title": "Notificaciones",
"description": "Todos los recordatorios en un solo lugar: qué se recuerda y cuándo. Los canales de entrega están en Integraciones.",
"channelsHint": "Telegram, ntfy, Web Push, Webhook y correo se configuran ahora en",
"channelsHintLink": "Integraciones → Canales",
"inboxLink": "Abrir la bandeja de entrada",
"subtitle": "Elige qué recordatorios recibes."
},
"layout": {
"title": "Panel",
"description": "Organiza cómo están dispuestos el panel y los análisis.",
"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."
},
"subtitle": "Personaliza cómo se organizan tu panel e insights."
},
"dashboard": {
"title": "Panel",
"description": "Diseño y orden de los mosaicos.",
"subtitle": "Organiza los mosaicos de tu panel."
},
"thresholds": {
"title": "Objetivos",
"description": "Por métrica: tu propio rango objetivo de valores saludables.",
"subtitle": "Define tus rangos objetivo personales por métrica."
},
"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",
"stress": "Estrés",
"sleepDebt": "Deuda de sueño"
},
"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"
},
"subtitle": "Decide qué fuente prevalece cuando dos informan la misma métrica."
},
"ai": {
"title": "Proveedor de IA",
"description": "Proveedor, modelo y clave API para los análisis, además de tu contexto «sobre mí».",
"subtitle": "Elige tu proveedor de IA y usa tu propia clave."
},
"api": {
"title": "API & Tokens",
"description": "Tokens Bearer para tus propios scripts y apps — registra mediciones o tomas de medicación desde cualquier lugar.",
"subtitle": "Gestiona los endpoints de la API y los tokens de acceso."
},
"advanced": {
"title": "Avanzado",
"description": "Activador opt-in del modo Investigación y zona de peligro para borrar irrevocablemente todos los registros de salud.",
"subtitle": "Modo investigación, restablecer datos y eliminar cuenta."
},
"export": {
"title": "Exportar e importar",
"description": "Descarga tus datos como CSV o una copia de seguridad JSON completa, o importa desde Apple Health, JSON o CSV. El informe médico ahora está en Historia de salud.",
"otherOptionsHeading": "Otras opciones de exportación",
"downloadFailed": "No se pudo descargar la exportación. Inténtalo de nuevo.",
"actions": {
"download": "Descargar"
},
"filters": {
"since": "Desde",
"until": "Hasta"
},
"cards": {
"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.",
"encryptToggle": "Cifrar con una contraseña",
"passphrasePlaceholder": "Contraseña (mín. 12 caracteres)",
"passphraseHelp": "Deriva la clave del archivo con Argon2id y lo sella con AES-256-GCM. Guarda el archivo con la extensión .hlx.",
"noRecoveryWarning": "No hay recuperación: si pierdes esta contraseña, el archivo no se podrá abrir. Guárdala en un lugar seguro.",
"stepUpNeeded": "Confirma tu segundo factor y vuelve a intentarlo."
},
"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}"
}
},
"subtitle": "Exporta tus datos o importa desde una copia de seguridad."
},
"about": {
"title": "Acerca de esta app",
"description": "Versión, licencia, enlaces.",
"subtitle": "Versión, licencia y enlaces del proyecto."
},
"sharing": {
"title": "Compartir",
"description": "Crea un enlace de solo lectura para compartir tu historial de salud con un profesional médico.",
"subtitle": "Comparte acceso de solo lectura a tus datos."
},
"insights": {
"title": "Análisis",
"description": "Orden de la vista general y de las pestañas de navegación.",
"subtitle": "Organiza las secciones de tu resumen y el orden de las píldoras."
},
"medications": {
"title": "Medicamentos",
"description": "Vista de lista, orden y zonas de inyección de tus medicamentos.",
"subtitle": "Gestiona la vista y el orden de tu lista de medicamentos."
},
"mood": {
"title": "Etiquetas de ánimo",
"description": "Grupos, etiquetas y etiquetas archivadas del selector de ánimo.",
"subtitle": "Organiza tus etiquetas de ánimo, grupos y orden del selector."
},
"labs": {
"title": "Laboratorio",
"description": "Vista, orden y biomarcadores de tu laboratorio.",
"subtitle": "Gestiona la vista, el orden y los biomarcadores."
},
"illness": {
"title": "Diario de enfermedad",
"description": "Vista y orden de tus episodios de enfermedad.",
"subtitle": "Gestiona la vista y el orden de los episodios."
},
"vorsorge": {
"title": "Revisiones",
"description": "Vista, orden y recordatorios de revisión individuales.",
"subtitle": "Gestiona la vista, el orden y los recordatorios individuales."
},
"modules": {
"title": "Módulos",
"saved": "Guardado.",
"error": "No se pudo guardar. Inténtalo de nuevo.",
"toggleable": {
"title": "Qué registras",
"description": "Áreas opcionales. Los módulos desactivados desaparecen de la navegación, los paneles y los análisis; tus datos se conservan."
},
"manageIn": "Gestionar en {section}",
"operatorDisabled": "Desactivado en todo el servidor",
"subtitle": "Elige qué áreas de seguimiento muestra HealthLog en la app."
},
"gesundheitsakte": {
"title": "Historial médico",
"description": "Exporta tu historial médico completo como PDF, FHIR R4 o un paquete ZIP combinado.",
"subtitle": "Exporta un historial de salud completo, listo para el médico."
},
"coach": {
"title": "Coach",
"description": "Activa el Coach, tono y alcance, recuerdos guardados.",
"subtitle": "Ajusta el Coach, sus avisos proactivos y su memoria."
},
"channels": {
"title": "Canales",
"description": "Envío por Telegram, ntfy, Web Push, Webhook y correo electrónico.",
"subtitle": "Dónde se entregan los recordatorios y avisos."
},
"security": {
"title": "Seguridad",
"subtitle": "Autenticación de dos factores, códigos de recuperación y claves de acceso."
},
"privacy": {
"title": "Datos y privacidad",
"subtitle": "Tus datos, su retención, el cifrado y la seguridad de la cuenta en un solo lugar.",
"description": "Exportación, eliminación, retención, estado de cifrado, sesiones y actividad de seguridad."
},
"mcp": {
"title": "Conector MCP",
"subtitle": "Conecta un asistente externo a tus propios datos de salud."
},
"anamnesis": {
"title": "Historial médico",
"subtitle": "Gestiona tus alergias y tus antecedentes familiares.",
"description": "Registros estructurados de alergias y antecedentes familiares."
},
"environment": {
"title": "Entorno",
"subtitle": "Contexto de tiempo, luz diurna y ubicación.",
"disabledHint": "Activa el módulo Entorno para definir una ubicación principal e incorporar el tiempo y las horas de luz diarias.",
"searchPlaceholder": "Buscar una ciudad",
"search": "Buscar",
"searchError": "No se pudo buscar ese lugar.",
"use": "Usar",
"select": "Seleccionar",
"saveError": "No se pudo guardar el cambio.",
"homeSaved": "Ubicación principal guardada.",
"travelAdded": "Periodo de ubicación añadido.",
"travelRemoved": "Periodo de ubicación eliminado.",
"backfillQueued": "Relleno programado.",
"backfillError": "No se pudo iniciar el relleno.",
"startDate": "Fecha de inicio",
"endDate": "Fecha de fin",
"storedDays": "{count} días de tiempo almacenados.",
"home": {
"title": "Ubicación principal",
"description": "Una ubicación aproximada a nivel de ciudad, nunca un rastro preciso. El tiempo y la luz diurna se obtienen para este lugar en los días sin un periodo de ubicación, desde la fecha en que lo configuras.",
"current": "Actual: {label}",
"none": "Aún no hay ubicación principal.",
"since": "Tiempo registrado desde {date}. Los días anteriores quedan vacíos hasta que añadas un periodo de ubicación."
},
"travel": {
"title": "Periodos de ubicación",
"description": "Añade un lugar y un rango de fechas: un viaje o un tramo de tu historial anterior. El periodo anula tu hogar en los días que cubre, para que el tiempo coincida con donde estuviste realmente. Así corriges el pasado.",
"none": "Aún no hay periodos de ubicación.",
"add": "Añadir {label}",
"remove": "Eliminar periodo de ubicación"
},
"backfill": {
"title": "Rellenar días pasados",
"description": "Obtén y guarda el tiempo de un rango de fechas pasado para que los días antiguos entren en las correlaciones. El inicio toma por defecto la fecha de vigencia de tu hogar; para llegar más atrás, añade primero un periodo de ubicación para ese rango.",
"run": "Rellenar"
},
"noResults": "No se encontraron lugares coincidentes."
}
},
"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."
},
"dateFormat": {
"title": "Formato de fecha",
"description": "Determina el orden de día, mes y año al mostrar las fechas.",
"auto": "Automático (idioma)",
"dmy": "DD.MM.AAAA",
"mdy": "MM/DD/AAAA",
"ymd": "AAAA-MM-DD",
"saved": "Formato de fecha guardado.",
"saveError": "No se pudo guardar el formato de fecha."
},
"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."
},
"coachReminders": {
"title": "Tus recordatorios",
"description": "Cosas que le pediste al Coach que retomara más tarde. Las que vencen aparecen aquí y en el Coach.",
"empty": "Aún no hay recordatorios. Pídele al Coach que te recuerde algo y aparecerá aquí.",
"loadError": "No se pudieron cargar tus recordatorios.",
"dueHeading": "Vencen ahora",
"allHeading": "Guardados",
"duePrefix": "vence {when}",
"confirm": "Conservar",
"markDone": "Hecho",
"dismiss": "Descartar",
"deleteAria": "Eliminar este recordatorio",
"note": "Los recordatorios se guardan cifrados. Elimina uno cuando quieras — desaparece de lo que el Coach puede ver.",
"status": {
"proposed": "Sugerido",
"active": "Guardado",
"due": "Vencido",
"surfaced": "Mostrado",
"done": "Hecho",
"dismissed": "Descartado"
}
},
"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"
},
"responseTimeoutHeading": "Tiempo de espera de la respuesta",
"responseTimeoutBody": "Cuánto esperar a que responda la IA antes de cancelar. Aumenta el valor para un modelo local o autoalojado que necesita tiempo para cargarse en la primera solicitud.",
"responseTimeoutLabel": "Tiempo de espera de la respuesta (segundos)",
"responseTimeoutPlaceholder": "Predeterminado (~180)",
"responseTimeoutInvalid": "Introduce un número entre 10 y 600 segundos.",
"ocrHeading": "Escaneo de documentos (informes de laboratorio)",
"ocrBody": "Usa un proveedor dedicado para leer los informes de laboratorio subidos. Si está desactivado, el escaneo usa tu proveedor principal.",
"ocrEnableLabel": "Activar un proveedor dedicado para el escaneo de documentos",
"ocrProviderLabel": "Proveedor de escaneo",
"ocrProviderOption": {
"OPENAI": "OpenAI (tu clave de API)",
"ANTHROPIC": "Anthropic (Claude)",
"LOCAL": "Modelo local (compatible con OpenAI)"
},
"ocrModelPlaceholder": "p. ej. gpt-4o",
"ocrVisionHint": "Puede que este modelo no pueda leer imágenes. Elige un modelo con capacidad de visión para el escaneo de documentos.",
"ocrKeyLabel": "Clave de API"
},
"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ómetro Withings para sincronizar peso, composición corporal y tensión arterial automáticamente.",
"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 directamente en HealthLog.",
"whoopCredentials": "Credenciales de API",
"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": "Fitbit",
"fitbitTag": "Fitbit y Pixel",
"fitbitDescription": "Conecta Fitbit para sincronizar tus datos de Fitbit y Pixel Watch — peso, frecuencia cardíaca y más.",
"fitbitExperimentalBadge": "Experimental",
"fitbitCredentials": "Credenciales de API",
"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 Fitbit. Esto puede tardar un tiempo según tu historial.",
"fitbitSyncResult": "{count} mediciones sincronizadas",
"fitbitSyncFailed": "Error de sincronización",
"fitbitSynchronize": "Sincronizar",
"fitbitDisconnect": "Desconectar",
"fitbitDisconnectTitle": "¿Desconectar Fitbit?",
"fitbitDisconnectDescription": "Se desconectará la conexión con Fitbit. Los datos sincronizados previamente se conservarán.",
"fitbitConnect": "Conectar con Fitbit",
"fitbitNoCredentials": "Introduce tus credenciales de API arriba para conectar Fitbit.",
"fitbitBackfillInProgress": "Importando tu historial de Fitbit en segundo plano…",
"fitbitOauthConnected": "Fitbit conectado: la primera sincronización empieza en segundo plano.",
"fitbitOauthFailed": "Error al conectar con Fitbit",
"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 Fitbit 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": "Fitbit no devolvió un código de autorización. Inténtalo de nuevo y permite el acceso en el diálogo de Fitbit.",
"nocreds": "Fitbit no está configurado. Añade tus credenciales OAuth de Fitbit arriba e inténtalo de nuevo.",
"token": "El intercambio de token con Fitbit 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",
"identityDescription": "Versión, licencia y detalles de compilación de esta instancia.",
"linksDescription": "Código fuente, registro de cambios y documentación.",
"newerAvailable": "Nueva versión: {tag}"
},
"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})",
"shownOnce": "Se muestra una sola vez. Guarde ahora el código QR y la frase de acceso — no se pueden recuperar después.",
"qrLabel": "Código QR",
"qrAlt": "Código QR con el enlace para compartir y la frase de acceso",
"linkLabel": "Enlace",
"passphraseLabel": "Frase de acceso",
"passphraseHint": "El destinatario necesita el enlace y esta frase de acceso. El código QR contiene ambos.",
"copyLink": "Copiar enlace",
"copyPassphrase": "Copiar frase de acceso",
"protected": "Frase de acceso"
},
"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.",
"disclaimer": "Las predicciones y las fases son estimaciones descriptivas a partir de tus datos registrados, no son consejo médico ni un método anticonceptivo. Nunca indican que sea seguro tener relaciones sin protección. La precisión mejora a medida que registras más ciclos. Para la anticoncepción o cualquier decisión médica, consulta a un profesional sanitario.",
"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",
"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, fases de sueño y 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",
"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 disposición, fases de sueño, variabilidad cardíaca 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",
"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",
"coach": {
"activate": {
"title": "Activar el Coach",
"description": "Muestra el botón y el panel del Coach. Activado por defecto: desactívalo para ocultar el Coach en todas partes.",
"toggleAria": "Activar el botón y el panel del Coach",
"savedOn": "Coach activado.",
"savedOff": "Coach oculto.",
"saveError": "No se pudo guardar el cambio. Inténtalo de nuevo."
}
},
"withingsDescriptionSecondary": "Las lecturas llegan a tu panel en segundo plano. ¿Es tu primera vez? Sigue la",
"whoopDescriptionSecondary": "Las lecturas llegan a tu panel en segundo plano. ¿Es tu primera vez? Sigue la",
"fitbitDescriptionSecondary": "Las lecturas llegan a tu panel en segundo plano. ¿Es tu primera vez? Sigue la",
"polarDescriptionSecondary": "Las lecturas llegan a tu panel en segundo plano. ¿Es tu primera vez? Sigue la",
"ouraDescriptionSecondary": "Las lecturas llegan a tu panel en segundo plano. ¿Es tu primera vez? Sigue la",
"nightscoutDescriptionSecondary": "Las lecturas llegan a tu panel en segundo plano. ¿Es tu primera vez? Sigue la",
"integrationCredentialsHint": "Dónde encontrar estas credenciales y cómo registrar tu propia aplicación se explica en la guía de configuración de arriba.",
"security": {
"sessionsTitle": "Sesiones activas",
"sessionsDescription": "Dispositivos y navegadores con sesión iniciada en tu cuenta.",
"sessionsLoadError": "No se pudieron cargar las sesiones activas.",
"sessionsEmpty": "No hay sesiones activas.",
"currentSession": "Este dispositivo",
"lastActive": "Última actividad {time}",
"unknownLocation": "Ubicación desconocida",
"revokeSession": "Cerrar sesión",
"revokeError": "No se pudo completar la solicitud. Inténtalo de nuevo.",
"signOutEverywhere": "Cerrar sesión en los demás dispositivos",
"signOutEverywhereDone": "Se cerraron {count} sesión(es).",
"activityTitle": "Actividad de seguridad",
"activityDescription": "Inicios de sesión, cambios de seguridad y exportaciones recientes de tu cuenta.",
"activityEmpty": "Aún no hay actividad de seguridad.",
"activityLoadError": "No se pudo cargar la actividad de seguridad.",
"action": {
"newDevice": "Inicio desde nuevo dispositivo",
"loginFailed": "Inicio de sesión fallido",
"login": "Inicio de sesión",
"passwordChange": "Contraseña cambiada",
"mfa": "Cambio de doble factor",
"sessionRevoke": "Sesión cerrada",
"token": "Cambio de token de API",
"accountDelete": "Cuenta eliminada",
"dataClear": "Datos restablecidos",
"export": "Exportación de datos",
"other": "Evento de seguridad"
},
"active": "Activo",
"inactive": "Inactivo",
"stepUpRequired": "Por tu seguridad, vuelve a iniciar sesión para cambiar tu segundo factor.",
"useRecoveryCode": "Usar un código de recuperación en su lugar",
"useAuthenticator": "Usar tu aplicación de autenticación en su lugar",
"totp": {
"title": "Aplicación de autenticación",
"description": "Usa un código temporal de una aplicación de autenticación como segundo factor.",
"setUp": "Configurar",
"step1": "Escanea el código QR con tu aplicación de autenticación o introduce el secreto manualmente.",
"step2": "Introduce el código de 6 dígitos que muestra la aplicación para confirmar.",
"qrAlt": "Código QR para configurar la aplicación de autenticación",
"qrUnavailable": "Código QR no disponible",
"manualEntry": "O introduce este secreto manualmente",
"enterCode": "Introduce el código de 6 dígitos",
"verify": "Verificar",
"setupFailed": "No se pudo iniciar la configuración. Inténtalo de nuevo.",
"invalidCode": "Ese código no es válido. Inténtalo de nuevo.",
"disable": "Desactivar",
"disableTitle": "Desactivar la autenticación de dos factores",
"disableConfirm": "Introduce un código actual para desactivar tu segundo factor. Esto también elimina tus códigos de recuperación.",
"currentCode": "Código actual",
"disableFailed": "No se pudo desactivar el segundo factor."
},
"recovery": {
"saveNow": "Guarda ahora estos códigos de recuperación",
"saveNowHint": "Cada código funciona una sola vez. Solo se muestran esta vez: guárdalos en un lugar seguro. Si pierdes tu autenticador, un código de recuperación es la única forma de volver a entrar.",
"download": "Descargar",
"remainingOne": "Queda {count} código de recuperación.",
"remainingOther": "Quedan {count} códigos de recuperación.",
"regenerate": "Regenerar códigos",
"regenFailed": "No se pudieron regenerar los códigos de recuperación.",
"savedIt": "Los he guardado",
"regenerateTitle": "¿Regenerar los códigos de recuperación?",
"regenerateConfirm": "Esto reemplaza tus códigos de recuperación actuales. Tus códigos existentes dejarán de funcionar de inmediato y el nuevo conjunto se muestra solo una vez."
},
"keys": {
"title": "Llaves de seguridad",
"description": "Registra una llave de seguridad de hardware o de plataforma como segundo factor.",
"empty": "Aún no hay llaves de seguridad registradas.",
"add": "Añadir llave de seguridad",
"addFailed": "No se pudo registrar la llave de seguridad.",
"rename": "Cambiar nombre",
"renameFailed": "No se pudo cambiar el nombre de la llave de seguridad.",
"remove": "Quitar llave de seguridad",
"removeFailed": "No se pudo quitar la llave de seguridad.",
"removeConfirm": "Esta llave de seguridad dejará de funcionar como segundo factor.",
"lastUsed": "Usada por última vez el {date}",
"neverUsed": "Nunca usada",
"added": "añadida el {date}",
"nameLabel": "Nombre de la llave de seguridad"
},
"passkeyNudge": {
"title": "Añade una clave de acceso para iniciar sesión más rápido",
"body": "Las claves de acceso te permiten iniciar sesión con tu huella, tu cara o el PIN del dispositivo, sin contraseñas que recordar."
},
"trustedDevices": {
"title": "Dispositivos de confianza",
"description": "Los navegadores en los que confías omiten el segundo factor durante 30 días. La contraseña sigue siendo obligatoria. Revoca los que no reconozcas.",
"loadError": "No se pudieron cargar los dispositivos de confianza.",
"revokeError": "No se pudo revocar el dispositivo. Inténtalo de nuevo.",
"revoke": "Revocar",
"revokeAll": "Olvidar todos los dispositivos",
"revokeAllDone": "Se olvidaron {count} dispositivo(s) de confianza.",
"unnamed": "Dispositivo desconocido",
"current": "Este dispositivo",
"expires": "De confianza hasta el {date}"
}
},
"privacy": {
"intro": {
"title": "Tus datos siguen siendo tuyos",
"body": "HealthLog es autoalojado. Esta página reúne cómo se protegen tus datos, cuánto tiempo se conservan, cómo exportarlos y cómo eliminarlos."
},
"encryption": {
"title": "Cifrado en reposo",
"description": "Los campos sensibles se cifran en la base de datos.",
"summary": "Tus datos sensibles se cifran en reposo con {algorithm} en {columns} campos de {models} tipos de registro.",
"statement": "Tus datos sensibles se cifran en reposo con AES-256-GCM."
},
"stored": {
"title": "Qué se almacena",
"description": "Las categorías de datos que contiene esta cuenta.",
"measurements": "Mediciones (peso, presión arterial, pulso, glucosa, sueño, composición corporal)",
"medications": "Medicamentos e historial de tomas",
"moodLabs": "Entradas de estado de ánimo y resultados de laboratorio",
"coach": "Conversaciones con el asistente",
"integrations": "Tokens de integración (cifrados)",
"security": "Actividad de la cuenta y de seguridad (sesiones, registro de inicio de sesión)"
},
"retention": {
"title": "Retención",
"description": "Cuánto tiempo se conservan los registros con límite temporal antes de su limpieza automática.",
"coach": "Conversaciones con el asistente: {days} días",
"audit": "Registro de seguridad: {days} días",
"delivery": "Registro de envío de notificaciones: {days} días",
"unavailable": "Los detalles de retención no están disponibles en este momento."
},
"export": {
"title": "Descargar mis datos",
"description": "Exporta tus registros como CSV o JSON, opcionalmente cifrados con frase de contraseña, o genera un historial médico completo.",
"openExport": "Exportar y copia de seguridad",
"openHealthRecord": "Historial médico"
},
"delete": {
"title": "Eliminar o restablecer",
"description": "Elimina tu cuenta por completo o borra tus registros de salud conservando la cuenta.",
"backupLag": "La eliminación borra tus datos de inmediato. Las copias de seguridad cifradas externas aún los contienen hasta que caduquen según la ventana de retención del operador.",
"openAdvanced": "Eliminar o restablecer"
},
"posture": {
"title": "Configuración de privacidad",
"description": "Controla cuántos de tus datos se comparten con las funciones de IA y la investigación opcional.",
"openAi": "Modo de privacidad de IA",
"openResearch": "Modo investigación"
}
},
"mcp": {
"enableTitle": "Endpoint MCP remoto",
"enableDescription": "Permite que un asistente compatible con MCP (Claude.ai, ChatGPT) lea tus datos de salud mediante un token limitado. Desactivado por defecto.",
"enabled": "Activado",
"disabled": "Desactivado",
"enableToggleLabel": "Activar el endpoint MCP",
"endpointLabel": "URL del conector",
"connectDescription": "Pega esta URL en la configuración del conector personalizado de tu asistente y autoriza con el token de abajo o inicia sesión cuando se te solicite.",
"tokensTitle": "Tokens del conector",
"tokensDescription": "Genera un token de solo lectura para conectar un asistente. El token se muestra una sola vez.",
"scopeNote": "Los tokens se limitan a health:read: acceso de solo lectura a tus propios registros. Nunca pueden acceder a funciones de administración.",
"writeScopeToggleLabel": "Permitir registro (health:write)",
"writeScopeNote": "Añade el ámbito health:write para que el asistente pueda registrar nuevas mediciones y entradas de estado de ánimo en tu cuenta. Cada escritura se confirma antes. El token sigue sin poder eliminar ni editar entradas existentes, cambiar medicamentos ni acceder a funciones REST o de administración. Déjalo desactivado para acceso de solo lectura.",
"connectionsTitle": "Asistentes conectados",
"connectionsDescription": "Asistentes que autorizaste mediante el inicio de sesión. Revocar una conexión finaliza su acceso de inmediato, incluida su capacidad de renovación.",
"noConnections": "No hay asistentes conectados.",
"connectionConnected": "Conectado",
"connectionLastUsed": "Último uso",
"connectionNeverUsed": "Nunca usado",
"connectionRevoke": "Desconectar",
"connectionRevokeDescription": "Esto finaliza el acceso del asistente de inmediato e impide su renovación. Será necesario autorizarlo de nuevo para volver a conectarlo.",
"connectionRevokeFailed": "No se pudo desconectar el asistente."
}
},
"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",
"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ó",
"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."
}
},
"modules": {
"title": "Disponibilidad de módulos",
"description": "Desactiva un módulo para todo el servidor. Un módulo desactivado aquí queda apagado para todas las cuentas, sin importar la preferencia personal. Los dominios principales (peso, presión arterial, pulso, medicación) están siempre activos y no se pueden desactivar.",
"saveError": "No se pudo actualizar la disponibilidad de módulos."
},
"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",
"deleteAllPromptLabel": "Escribe {token} para continuar",
"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",
"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."
},
"coach": {
"title": "Coach",
"subtitle": "Superficies del asistente, clave del servidor y las tablas de calidad de comentarios del Coach y de los análisis, en un solo lugar."
},
"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 y estado de actualizaciones."
},
"module-availability": {
"title": "Módulos",
"subtitle": "Activa o desactiva módulos para todas las cuentas de este servidor."
},
"encryption": {
"title": "Cifrado",
"subtitle": "Cobertura de cifrado y estado de rotación de claves para los datos en reposo.",
"loading": "Cargando el estado de cifrado...",
"loadError": "No se pudo cargar el estado de cifrado.",
"coverageTitle": "Cobertura",
"coverageDescription": "Cuántas filas cifradas hay bajo cada id de clave. Solo se muestran los id de clave y los recuentos, nunca el material de la clave.",
"activeKeyId": "Id de clave activa",
"configuredKeys": "Claves configuradas",
"totalRows": "Filas cifradas",
"staleRows": "Filas que no usan la clave activa",
"safeToDropLegacy": "Es seguro eliminar la clave antigua",
"rotationIncomplete": "Aún quedan {count} filas por rotar",
"rotationTitle": "Rotación de claves",
"rotationDescription": "Vuelve a cifrar cada columna cifrada con la clave activa. La herramienta de línea de comandos sigue siendo la vía canónica; este disparador es una comodidad.",
"rotationState": "Estado",
"lastRun": "Última ejecución: {scanned} revisadas, {rotated} rotadas, {errors} errores.",
"rotateNow": "Rotar ahora",
"rotateConfirmTitle": "¿Volver a cifrar todo el registro?",
"rotateConfirmDescription": "Vuelve a cifrar cada columna cifrada con la clave activa. Nunca añade ni elimina una clave y se puede repetir con seguridad. En cuentas grandes puede tardar un rato.",
"cancel": "Cancelar",
"rotateConfirm": "Iniciar rotación",
"rotateEnqueued": "Rotación iniciada.",
"rotateFailed": "No se pudo iniciar la rotación.",
"stepUpNeeded": "Se requiere un segundo factor reciente. Confirma tu segundo factor o usa la herramienta de línea de comandos si no tienes ninguno configurado.",
"cliNote": "Se necesita un segundo factor para usar este botón. Los operadores sin él rotan con scripts/rotate-encryption-key.ts.",
"columnsTitle": "Cobertura por columna",
"columnsDescription": "Cada columna cifrada con sus recuentos de filas en la clave activa frente a claves anteriores.",
"colColumn": "Columna",
"colTotal": "Total",
"colActive": "En clave activa",
"colStale": "Obsoletas",
"state": {
"idle": "Inactivo",
"running": "En curso",
"completed": "Completado",
"failed": "Fallido"
}
}
},
"carrier": "Operador",
"carrierUnavailableGeoFallback": "{location} — operador no disponible",
"mfaRequired": "Exigir un segundo factor",
"mfaRequiredDescription": "Cada cuenta sin un segundo factor activo se dirige a la configuración tras iniciar sesión. Esto pide a los usuarios web que lo configuren, pero no bloquea el acceso directo por API o nativo (Bearer) de las cuentas que aún no lo tienen.",
"mfaEnforcedOn": "MFA activado",
"mfaEnforcedOff": "MFA desactivado",
"mfaEnforcedOnHint": "Este usuario debe usar un segundo factor. Haz clic para dejar de exigirlo.",
"mfaEnforcedOffHint": "Exigir un segundo factor a este usuario."
},
"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."
},
"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."
},
"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."
}
},
"notifications": {
"title": "Notificaciones",
"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.",
"suggestionsLabel": "Sugerencias de ejemplo",
"suggestionsDesc": "Muestra de vez en cuando una pregunta de ejemplo en la pantalla del Coach.",
"suggestionsAria": "Activar o desactivar las sugerencias de ejemplo del Coach",
"aiComposedLabel": "Deja que el Coach redacte el aviso",
"aiComposedDesc": "Cuando hay un proveedor disponible, el aviso proactivo lo redacta el modelo en lugar de la plantilla fija. Desactivado por defecto.",
"aiComposedAria": "Activar o desactivar el aviso proactivo redactado por IA"
},
"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",
"eventCoachNudge": "Aviso del Coach",
"eventCoachNudgeDesc": "Aviso ocasional de tu Coach cuando tus tendencias recientes justifican una revisión.",
"eventMeasurementReminder": "Recordatorio de medición",
"eventMeasurementReminderDesc": "Se envía cuando una medición registrada está pendiente.",
"eventMedicationIntakeSync": "Sincronización de tomas",
"eventMedicationIntakeSyncDesc": "Actualización entre dispositivos cuando se registra, toma u omite una dosis.",
"security": {
"newDeviceTitle": "Nuevo inicio de sesión en tu cuenta",
"newDeviceBody": "Un nuevo inicio de sesión desde {device} ({location}). Si no fuiste tú, cambia tu contraseña de inmediato.",
"unknownLocation": "ubicación desconocida"
},
"loginRequired": "Inicia sesión para gestionar las notificaciones."
},
"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",
"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"
}
},
"edit": {
"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",
"validationOrder": "El mínimo debe ser inferior al máximo.",
"validationBounds": "Introduce valores dentro del rango permitido que se muestra debajo."
},
"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.",
"moodLogged": "Registrado: {score}/5",
"moodNotePrompt": "Añade una nota breve (opcional).",
"moodNoteSaved": "Nota guardada.",
"moodNoteExpired": "Esa solicitud ha caducado.",
"remindLater": "Recordatorio pospuesto {duration}.",
"measurementDone": "Marcado como hecho.",
"measurementNotFound": "Recordatorio no encontrado.",
"buttonMoodNote": "Nota…",
"buttonLater": "Más tarde",
"buttonDone": "Hecho",
"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",
"measureValuePrompt": "Responde con el valor para registrarlo (opcional).",
"buttonMeasureValue": "Valor…",
"measureValueSaved": "Lectura guardada.",
"measureValueInvalid": "Responde con un número para registrar una lectura.",
"measureValueOutOfRange": "Ese valor está fuera del rango plausible.",
"measureValueExpired": "Esa solicitud ha caducado."
},
"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}",
"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": {
"greetingMorning": "Buenos días",
"greetingMorningNamed": "Buenos días, {name}",
"greetingHey": "Hola",
"greetingHeyNamed": "Hola, {name}",
"complianceBody": "Esta semana tu rutina de tomas se descuadró un poco. Si quieres, vemos juntos qué te facilitaría mantenerla.",
"bpBody": "Tu tensión estuvo esta semana un poco por encima de tu rango habitual. Cuando te venga bien, la miro contigo encantado.",
"scoreBody": "Tu recuperación ha ido aflojando estos últimos días. Si tienes curiosidad por la causa, aquí estoy para hablarlo.",
"selfContextBody": "Hace tiempo que no actualizas tu autodescripción. Cuando tengas un momento, refrescarla me ayuda a entenderte mejor.",
"weightBody": "Tu peso se ha alejado un poco de tu rango objetivo últimamente. Si quieres, hacemos balance juntos, con calma.",
"sleepDebtBody": "Varias de tus noches se quedaron cortas esta semana. Si te apetece, buscamos un patrón juntos.",
"measurementGapBody": "Tu registro lleva una semana en silencio. Cuando te venga bien, una breve puesta al día ayuda a retomarlo.",
"focusNote": "También tiene que ver con eso que querías vigilar.",
"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.",
"unlock": {
"title": "Introduzca la frase de acceso",
"description": "Este registro de salud compartido está protegido. Introduzca la frase de acceso que recibió para verlo.",
"label": "Frase de acceso",
"error": "Esa frase de acceso no es correcta.",
"submit": "Desbloquear"
},
"loadError": {
"title": "No se pudo cargar esta vista compartida",
"description": "Se produjo un error al abrir este registro de salud compartido. Puede que el enlace haya caducado o que haya habido un problema temporal. Inténtalo de nuevo o pide un enlace nuevo a la persona que lo compartió.",
"retry": "Intentar de nuevo"
}
},
"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).",
"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",
"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í",
"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…",
"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.",
"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",
"nextPeriodWindow": "{low} – {high}",
"fertileWindow": "Ventana fértil",
"ovulation": "Ovulación estimada",
"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.",
"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",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"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",
"phaseDayHeader": "Día {day} · {phase}",
"bbtHint": "Mídela a primera hora de la mañana, antes de levantarte."
},
"settings": {
"title": "Ajustes del ciclo",
"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.",
"secondarySymptomCitation": "Más sobre el método (estudio)",
"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.",
"saved": "Ajustes guardados",
"saveError": "No se pudo guardar. Inténtalo de nuevo.",
"save": "Guardar",
"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."
},
"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"
},
"fieldInfo": {
"bbt": "Tu temperatura en reposo, medida a primera hora de la mañana antes de levantarte. Sube ligeramente (unos 0,2–0,3 °C) tras la ovulación.",
"bbtLabel": "¿Qué es la temperatura basal?",
"mucus": "El flujo vaginal cambia a lo largo del ciclo: de seco o pegajoso a cremoso, y luego acuoso y como clara de huevo en los días más fértiles.",
"mucusLabel": "¿Qué es el moco cervical?",
"ovulationTest": "Una prueba de orina casera que detecta el pico de LH, el aumento hormonal unas 24–36 h antes de la ovulación. Un positivo señala la ventana más fértil.",
"ovulationTestLabel": "¿Qué es una prueba de ovulación?",
"spotting": "Sangrado leve fuera de la menstruación.",
"spottingLabel": "¿Qué es el manchado entre periodos?",
"pregnancyTest": "Resultado de una prueba de embarazo casera (hCG).",
"pregnancyTestLabel": "¿Qué es una prueba de embarazo?",
"progesteroneTest": "Una prueba que confirma que ha ocurrido la ovulación: la progesterona sube después.",
"progesteroneTestLabel": "¿Qué es una prueba de progesterona?",
"intercourse": "Si hubo relaciones sexuales este día.",
"intercourseLabel": "¿Qué registra relaciones?",
"protected": "Si se usó anticoncepción durante las relaciones.",
"protectedLabel": "¿Qué significa protegido?"
}
},
"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",
"valueRange": "Valor",
"valueMin": "Mín.",
"valueMax": "Máx.",
"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": "Revisiones",
"sectionDescription": "Recordatorios de qué medir o revisar, cuándo y dónde.",
"addButton": "Añadir recordatorio",
"markDone": "Hecho",
"delete": "Eliminar",
"deleteConfirmTitle": "¿Eliminar recordatorio?",
"deleteConfirmDescription": "Este recordatorio de revisión se eliminará de forma permanente.",
"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",
"customInterval": "Personalizado (cada N días)",
"rruleOption": "Regla propia (RRULE)"
},
"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",
"FAT_MASS": "Masa grasa",
"FAT_FREE_MASS": "Masa libre de grasa",
"MUSCLE_MASS": "Masa muscular",
"LEAN_BODY_MASS": "Masa magra",
"BONE_MASS": "Masa ósea",
"TOTAL_BODY_WATER": "Agua corporal",
"VISCERAL_FAT": "Grasa visceral",
"BODY_MASS_INDEX": "Índice de masa corporal (IMC)"
},
"typeGroups": {
"vitals": "Constantes vitales",
"bodyComposition": "Composición 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",
"createTitle": "Nuevo recordatorio",
"editTitle": "Editar recordatorio",
"customInterval": "Repetir cada (días)",
"rrule": "Regla de recurrencia (RRULE)",
"rruleHint": "RFC-5545, p. ej. FREQ=YEARLY para una revisión anual.",
"firstDue": "Primer vencimiento (opcional)"
},
"pushTitle": "Recordatorio de revisión",
"pushBody": "Toca: {label}",
"pushLocation": "(en {location})",
"edit": "Editar",
"originCoach": "Coach",
"until": "Hasta {date}",
"selfPlanned": "Autoplanificado",
"captureValue": "Registrar valor",
"measureNow": "Medir ahora",
"nextDueLabel": "Próximo vencimiento:",
"lastDoneLabel": "Última vez:",
"customize": "Personalizar revisiones",
"adherence": {
"label": "Dentro del intervalo",
"onTrack": "Al día",
"due": "Toca ahora"
},
"capture": {
"title": "Registrar medición",
"description": "Introduce el valor; el recordatorio se marca como hecho."
},
"manage": {
"title": "Gestionar recordatorios",
"description": "Activa o desactiva recordatorios individuales.",
"empty": "Aún no hay recordatorios para personalizar."
},
"dashboard": {
"empty": "No hay revisiones próximas.",
"openLink": "Abrir revisiones"
},
"showMeasurements": "Ver mediciones",
"loadError": "No se pudieron cargar tus recordatorios."
},
"moduleList": {
"viewToggleLabel": "Vista",
"viewCards": "Vista de tarjetas",
"viewList": "Vista de lista",
"viewHeading": "Vista",
"viewDescription": "Elige si las entradas se muestran como tarjetas o como lista compacta.",
"reorder": {
"heading": "Orden",
"description": "Arrastra las entradas para definir el orden en que aparecen.",
"empty": "Aún no hay entradas para ordenar."
}
},
"labs": {
"title": "Resultados de análisis",
"subtitle": "Analíticas de sangre y biomarcadores",
"addResult": "Añadir valor",
"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} mediciones",
"deleteConfirmTitle": "¿Eliminar resultado de laboratorio?",
"deleteConfirmDescription": "Este resultado de laboratorio se eliminará de forma permanente.",
"deletedToast": "Resultado eliminado",
"deleteError": "No se pudo eliminar el resultado",
"loadError": "No se pudieron cargar los resultados",
"customize": "Personalizar laboratorio",
"localOcr": {
"heading": "Leer escaneos en este dispositivo",
"description": "Permite escanear un informe de laboratorio aunque tu proveedor de IA no pueda leer imágenes: la foto se lee en tu dispositivo y solo se envía el texto extraído a tu proveedor. Menos preciso: revisa cada valor antes de guardar."
},
"sort": {
"heading": "Orden",
"label": "Orden de los valores",
"recentDesc": "Medición más reciente primero",
"recentAsc": "Medición más antigua primero",
"alphaAsc": "Nombre (A–Z)",
"alphaDesc": "Nombre (Z–A)",
"manual": "Ordenar manualmente",
"hint": "Con el orden manual puedes arrastrar los biomarcadores de abajo en tu propio orden."
},
"range": {
"inRange": "En rango",
"below": "Por debajo",
"above": "Por encima"
},
"form": {
"value": "Valor",
"takenAt": "Fecha de la muestra",
"note": "Nota",
"notePlaceholder": "Contexto opcional para este resultado",
"requiredError": "Introduce un valor.",
"save": "Guardar",
"savedToast": "Resultado guardado",
"saveError": "No se pudo guardar el resultado",
"biomarker": "Biomarcador",
"biomarkerPlaceholder": "Elige un biomarcador",
"defineNew": "+ Definir nuevo biomarcador",
"noBiomarkersHint": "Define primero un biomarcador para registrar un valor.",
"pickBiomarkerError": "Elige primero un biomarcador.",
"resultType": "Tipo de resultado",
"numeric": "Numérico",
"qualitative": "Cualitativo",
"qualitativeResult": "Resultado",
"qualitativePlaceholder": "p. ej. negativo",
"qualNegative": "negativo",
"qualPositive": "positivo",
"qualBorderline": "límite"
},
"backToLabs": "Volver a los resultados",
"hasNote": "Nota",
"editTitle": "Editar medición",
"editDescription": "Corrige el valor, la fecha o la nota de esta medición.",
"editedToast": "Medición actualizada",
"editError": "No se pudo actualizar la medición",
"editTimestampError": "Introduce una fecha válida.",
"editReading": "Editar medición",
"deleteReading": "Eliminar medición",
"restoredToast": "Medición restaurada",
"restoreError": "No se pudo restaurar la medición",
"detail": {
"history": "Historial",
"emptyTitle": "Aún no hay mediciones",
"emptyDescription": "Añade un valor para seguir este biomarcador con el tiempo."
},
"chart": {
"empty": "Sin mediciones en este periodo.",
"valueLabel": "Valor",
"range": {
"30": "30 d",
"90": "90 d",
"365": "1 a",
"all": "Todo"
}
},
"biomarker": {
"manageTitle": "Biomarcadores",
"managerDescription": "Define un marcador una vez: su unidad y rango se reutilizan en cada medición.",
"define": "Definir",
"defineFirst": "Define tu primer biomarcador",
"defineTitle": "Definir biomarcador",
"defineDescription": "Configura el nombre, la unidad y el rango una vez. Eliges el marcador al añadir un valor.",
"editTitle": "Editar biomarcador",
"edit": "Editar",
"delete": "Eliminar",
"deletedToast": "Biomarcador eliminado",
"deleteError": "No se pudo eliminar el biomarcador",
"deleteConfirmTitle": "¿Eliminar biomarcador?",
"deleteConfirmDescription": "El biomarcador y todos sus valores registrados se eliminan de forma permanente. Esta acción no se puede deshacer.",
"emptyTitle": "Aún no hay biomarcadores",
"emptyDescription": "Define marcadores como LDL o HbA1c para registrar valores.",
"loadError": "No se pudieron cargar los biomarcadores",
"noRange": "Sin rango de referencia",
"form": {
"seedLabel": "Partir de un marcador común",
"seedPlaceholder": "Elige un marcador (opcional)",
"seedHint": "Al elegir uno se rellenan los campos: ajusta el rango a tu laboratorio.",
"name": "Nombre",
"namePlaceholder": "p. ej. Colesterol LDL",
"unit": "Unidad",
"unitPlaceholder": "p. ej. mg/dL",
"panel": "Panel",
"panelPlaceholder": "p. ej. Lípidos",
"lowerBound": "Referencia mínima",
"upperBound": "Referencia máxima",
"lowerPlaceholder": "Límite inferior",
"upperPlaceholder": "Límite superior",
"context": "Contexto",
"contextPlaceholder": "Nota opcional sobre este marcador",
"rangeHint": "Ambos límites son opcionales: deja uno en blanco para un rango abierto (p. ej. LDL < 116).",
"requiredError": "El nombre y la unidad son obligatorios.",
"rangeOrderError": "El límite inferior no debe superar al superior.",
"save": "Guardar biomarcador",
"savedToast": "Biomarcador guardado",
"updatedToast": "Biomarcador actualizado",
"saveError": "No se pudo guardar el biomarcador"
},
"hide": "Ocultar",
"unhide": "Restaurar",
"hiddenToast": "Biomarcador ocultado",
"unhiddenToast": "Biomarcador restaurado",
"hideError": "No se pudo actualizar el biomarcador",
"allHidden": "Todos los biomarcadores están ocultos.",
"hiddenSection": "Ocultos",
"targetRange": {
"title": "Ajustar el rango objetivo",
"description": "Define la referencia mínima y máxima de este marcador. Deja un campo vacío para un límite abierto.",
"save": "Guardar rango",
"savedToast": "Rango objetivo actualizado",
"saveError": "No se pudo actualizar el rango objetivo"
}
},
"catalog": {
"total-cholesterol": "Colesterol total",
"ldl": "Colesterol LDL",
"hdl": "Colesterol HDL",
"triglycerides": "Triglicéridos",
"fasting-glucose": "Glucosa en ayunas",
"hba1c": "HbA1c",
"tsh": "TSH",
"ft3": "T3 libre",
"ft4": "T4 libre",
"ferritin": "Ferritina",
"transferrin-saturation": "Saturación de transferrina",
"vitamin-d": "Vitamina D (25-OH)",
"vitamin-b12": "Vitamina B12",
"folate": "Folato",
"hs-crp": "PCR ultrasensible",
"creatinine": "Creatinina",
"egfr": "TFGe",
"alt": "ALT",
"ast": "AST",
"ggt": "GGT",
"sodium": "Sodio",
"potassium": "Potasio",
"hemoglobin": "Hemoglobina",
"hematocrit": "Hematocrito",
"wbc": "Leucocitos",
"platelets": "Plaquetas",
"panel": {
"lipids": "Lípidos",
"glucose": "Metabolismo de la glucosa",
"thyroid": "Tiroides",
"iron": "Hierro",
"vitamins": "Vitaminas",
"inflammation": "Inflamación",
"renal": "Riñón",
"liver": "Hígado",
"electrolytes": "Electrolitos",
"bloodCount": "Hemograma"
},
"desc": {
"total-cholesterol": "Cantidad total de colesterol transportado en la sangre, suma de las fracciones LDL, HDL y otras lipoproteínas.",
"ldl": "Colesterol transportado por lipoproteínas de baja densidad, la fracción que se deposita en las paredes arteriales.",
"hdl": "Colesterol transportado por lipoproteínas de alta densidad, que lo devuelven al hígado.",
"triglycerides": "La principal grasa que circula en la sangre, procedente de la dieta y producida por el hígado.",
"fasting-glucose": "Azúcar en sangre medido en ayunas, refleja la regulación basal de la glucosa.",
"hba1c": "Proporción de hemoglobina unida a glucosa, refleja el azúcar en sangre de los últimos dos o tres meses.",
"tsh": "Hormona hipofisaria que regula la tiroides; la prueba principal de la función tiroidea.",
"ft3": "La forma libre y activa de la triyodotironina, la hormona tiroidea más potente.",
"ft4": "La forma libre de la tiroxina, la principal hormona que la tiroides libera a la sangre.",
"ferritin": "La principal proteína de almacenamiento de hierro del cuerpo, refleja las reservas de hierro.",
"transferrin-saturation": "Proporción de la proteína transportadora transferrina que lleva hierro en ese momento.",
"vitamin-d": "25-hidroxivitamina D circulante, el marcador estándar del estado de vitamina D.",
"vitamin-b12": "Vitamina esencial para la formación de glóbulos rojos y la función nerviosa.",
"folate": "Vitamina B necesaria para la formación de glóbulos rojos y la síntesis de ADN.",
"hs-crp": "Una proteína hepática que aumenta con la inflamación, medida con alta sensibilidad.",
"creatinine": "Producto de desecho muscular eliminado por los riñones, usado para evaluar la función renal.",
"egfr": "Tasa estimada de filtración de los riñones, calculada a partir de la creatinina.",
"alt": "Enzima hepática liberada a la sangre cuando se dañan las células del hígado.",
"ast": "Enzima del hígado y el músculo que aumenta cuando esos tejidos se lesionan.",
"ggt": "Enzima del hígado y las vías biliares que aumenta con la obstrucción biliar o el alcohol.",
"sodium": "Principal electrolito que regula el equilibrio de líquidos y el volumen sanguíneo.",
"potassium": "Electrolito esencial para la transmisión nerviosa y la función del músculo cardíaco.",
"hemoglobin": "La proteína de los glóbulos rojos que transporta el oxígeno.",
"hematocrit": "La fracción del volumen sanguíneo formada por glóbulos rojos.",
"wbc": "Recuento total de glóbulos blancos, la defensa circulante del sistema inmunitario.",
"platelets": "Fragmentos celulares que se agregan para formar coágulos sanguíneos.",
"apob": "Cuenta directamente las partículas aterogénicas; a menudo mejor marcador de riesgo que el LDL-C cuando discrepan.",
"lp-a": "Factor de riesgo en gran parte hereditario y de por vida — suele medirse una vez. Informa en unidades molares (nmol/L).",
"fasting-insulin": "Se combina con la glucosa en ayunas para estimar la resistencia a la insulina (HOMA-IR).",
"omega-3-index": "Proporción de EPA+DHA en glóbulos rojos; 8–12 % es el rango cardioprotector citado habitualmente."
},
"apob": "Apolipoproteína B (ApoB)",
"lp-a": "Lipoproteína(a)",
"fasting-insulin": "Insulina en ayunas",
"omega-3-index": "Índice omega-3"
},
"noteLoadFailed": "No se pudo cargar la nota; se mantendrá sin cambios al guardar.",
"showingLatestOf": "Mostrando los {shown} resultados más recientes de {total}",
"ocr": {
"scanButton": "Escanear un informe",
"addScan": "Escanear un documento",
"addManual": "Añadir un valor manualmente",
"uploadHint": "Sube una foto o un PDF de un informe de laboratorio",
"acceptWithPdf": "JPEG, PNG, WebP o PDF",
"acceptImageOnly": "JPEG, PNG o WebP",
"extracting": "Leyendo tu informe…",
"readingOnDevice": "Leyendo en tu dispositivo…",
"localModeHint": "Se lee en tu dispositivo y se envía como texto. Menos preciso: revisa cada valor.",
"rangeFromScan": "Intervalo de referencia tomado del escaneo",
"rangeVerify": "Verifica el intervalo de referencia",
"reviewTitle": "Revisar antes de guardar",
"reviewHint": "Revisa cada valor y guarda los que quieras conservar.",
"foundCount": "{count} valores encontrados",
"confirmRow": "Incluir este valor",
"analyteLabel": "Nombre de la prueba",
"resultLabel": "Resultado",
"valueLabel": "Valor",
"unitLabel": "Unidad",
"dateLabel": "Fecha",
"refLowLabel": "Referencia inferior",
"refHighLabel": "Referencia superior",
"newBiomarker": "Nuevo biomarcador — se creará",
"linksExisting": "Se vincula a {name} existente",
"duplicateWarning": "Ya existe un valor coincidente",
"lowConfidence": "Verifica este valor",
"lowConfidenceBadge": "Confianza baja",
"valueUnreadable": "Valor ilegible — introdúcelo manualmente",
"saveSelected": "Guardar {count} seleccionados",
"discardAll": "Descartar todo",
"savedToast": "{count} resultados de laboratorio guardados",
"noRows": "No se encontraron valores en este informe.",
"nothingToSave": "Selecciona al menos un valor para guardar.",
"saveFailed": "No se pudieron guardar los valores. Inténtalo de nuevo.",
"providerUnsupported": "Tu proveedor de IA no puede leer imágenes. Configura un modelo con visión.",
"consentRequired": "Se requiere consentimiento de procesamiento de IA para escanear un informe.",
"rateLimited": "Demasiados escaneos. Inténtalo más tarde.",
"budgetExceeded": "Has alcanzado tu presupuesto de uso de IA de hoy.",
"fileTooLarge": "El archivo es demasiado grande (máx. 12 MB).",
"fileType": "Sube un JPEG, PNG, WebP o PDF.",
"extractFailed": "No se pudo leer el informe. Prueba con una foto más nítida.",
"pdfNeedsAnthropic": "El escaneo de PDF necesita un proveedor de visión de Claude; sube una foto en su lugar."
},
"loadMoreReadings": "Cargar más mediciones"
},
"modules": {
"cycle": {
"label": "Ciclo",
"description": "Registra periodo, fases y predicciones."
},
"mood": {
"label": "Estado de ánimo",
"description": "Registra el ánimo diario y etiquetas."
},
"sleep": {
"label": "Sueño",
"description": "Duración, fases y cronología del sueño."
},
"glucose": {
"label": "Glucosa",
"description": "Lecturas de glucosa y tendencias."
},
"workouts": {
"label": "Entrenamientos",
"description": "Sesiones de entrenamiento y actividad."
},
"recovery": {
"label": "Recuperación",
"description": "Métricas de recuperación y carga de tus dispositivos."
},
"labs": {
"label": "Resultados de laboratorio",
"description": "Registra resultados de laboratorio y su historial."
},
"achievements": {
"label": "Logros",
"description": "Insignias y rachas para tu rutina."
},
"coach": {
"label": "Coach",
"description": "Chat de IA basado en tus propios datos."
},
"insights": {
"label": "Insights",
"description": "Análisis de IA, resumen y correlaciones."
},
"doctorReport": {
"label": "Informe médico",
"description": "Exportación PDF y FHIR para tu consulta."
},
"medications": {
"label": "Medicamentos",
"description": "Pautas, tomas y cumplimiento."
},
"illness": {
"label": "Diario de enfermedad",
"description": "Registra episodios de enfermedad y dolencias con un historial diario de síntomas."
},
"mcp": {
"label": "Acceso de asistente externo (MCP)",
"description": "Permite que un asistente compatible con MCP lea tus datos de salud mediante un token con alcance limitado. Desactivado de forma predeterminada."
},
"environment": {
"label": "Entorno",
"description": "Incorpora el tiempo y las horas de luz diarias de tu ubicación para correlacionarlos con el ánimo, el sueño y las constantes. Desactivado por defecto."
},
"inboundDocuments": {
"label": "Documentos entrantes",
"description": "Sube un informe médico o un alta; revisa los datos extraídos antes de guardarlos. Desactivado de forma predeterminada."
}
},
"illness": {
"title": "Diario de enfermedad",
"subtitle": "Un registro retrospectivo de tus episodios de enfermedad y dolencias.",
"settings": {
"viewDescription": "Elige si los episodios se muestran como tarjetas o como lista compacta.",
"orderDescription": "Arrastra tus episodios al orden en que quieres verlos."
},
"customize": "Personalizar diario de enfermedad",
"newEpisode": "Nuevo episodio",
"logDay": "Registrar un día",
"markRecovered": "Marcar como recuperado",
"deletedToast": "Episodio eliminado",
"restoreError": "No se pudo restaurar el episodio",
"onsetOn": "Comenzó el {date}",
"recoveredOn": "recuperado {date}",
"status": {
"active": "Activo",
"ongoing": "En curso",
"recovered": "Recuperado"
},
"empty": {
"title": "Aún no hay episodios",
"body": "Inicia un episodio para llevar un historial diario de síntomas y revisar cómo evolucionó."
},
"type": {
"INFECTION": "Infección",
"ALLERGY": "Alergia",
"INJURY": "Lesión",
"MENTAL_HEALTH": "Salud mental",
"AUTOIMMUNE": "Autoinmune",
"CHRONIC": "Crónica",
"OTHER": "Otro"
},
"lifecycle": {
"ACUTE": "Aguda",
"CHRONIC_ONGOING": "Crónica / en curso",
"RECURRING": "Recurrente",
"FLARE": "Brote"
},
"new": {
"title": "Nuevo episodio",
"description": "Registra una enfermedad o dolencia. Luego podrás anotar síntomas diarios.",
"label": "Nombre",
"labelPlaceholder": "p. ej. Resfriado común",
"type": "Tipo",
"lifecycle": "Curso",
"onset": "Comenzó el",
"note": "Nota",
"notePlaceholder": "Algo que valga la pena recordar (cifrado).",
"saveError": "No se pudo guardar el episodio. Inténtalo de nuevo.",
"parent": "Parte de",
"parentNone": "Sin vincular"
},
"sheet": {
"title": "Registrar {date}",
"description": "Anota los síntomas de hoy, cómo funcionas y la fiebre, si la hay.",
"symptoms": "Síntomas",
"functionalImpact": "Cómo funcionas",
"fever": "Temperatura",
"note": "Nota",
"noteSet": "Definida",
"notePlaceholder": "Cómo te sentiste hoy (cifrado).",
"severityFor": "Gravedad de {symptom}",
"saveError": "No se pudo guardar el día. Inténtalo de nuevo.",
"day": "Day"
},
"impact": {
"0": "Plenamente funcional",
"1": "Algo limitado",
"2": "Mayormente en reposo",
"3": "En cama"
},
"symptom": {
"runnyNose": "Goteo nasal",
"stuffyNose": "Congestión nasal",
"sneezing": "Estornudos",
"soreThroat": "Dolor de garganta",
"cough": "Tos",
"headache": "Dolor de cabeza",
"bodyAches": "Dolores musculares",
"fatigue": "Fatiga"
},
"correlation": {
"title": "Cómo se desarrolló",
"learning": "Aún aprendiendo: registra unos días más para ver patrones aquí.",
"preOnsetTitle": "Cómo se anunció",
"preOnsetBody": "Señales que se alejaron de tu base antes de marcar el inicio.",
"nadirTitle": "Qué cambió",
"nadirBody": "Cuánto se alejó cada señal registrada de tu rango habitual.",
"recoveryGapTitle": "Brecha de recuperación",
"recoveryGapLag": "Tus valores se estabilizaron {days} días después de sentirte mejor.",
"recoveryGapLead": "Tus valores se estabilizaron {days} días antes de marcar la recuperación.",
"recoveryGapLagSymptom": "Te sentiste mejor {days} días antes de que cedieran tus síntomas registrados.",
"recoveryGapLeadSymptom": "Tus síntomas registrados cedieron {days} días antes de marcar la recuperación.",
"recoveryGapSame": "Tus valores se estabilizaron el mismo día en que te sentiste mejor.",
"sleepContextMore": "Durante este episodio dormiste notablemente más de lo habitual (unas {hours} h/noche).",
"sleepContextLess": "Durante este episodio dormiste notablemente menos de lo habitual (unas {hours} h/noche).",
"redFlagTitle": "Conviene revisarlo",
"redFlagSpo2": "Tu saturación de oxígeno se mantuvo baja varios días. Si se repite, busca atención médica.",
"redFlagFever": "Tuviste fiebre sostenida. Si se repite, busca atención médica.",
"direction": {
"above": "por encima de lo habitual",
"below": "por debajo de lo habitual"
}
},
"insights": {
"title": "Tu historial de enfermedades",
"countOne": "Registraste 1 episodio en este período.",
"countOther": "Registraste {count} episodios en este período.",
"typicalGap": "Brecha de recuperación típica: {days} días entre sentirte mejor y la estabilización de tus valores.",
"typicalGapWithDriver": "Brecha de recuperación típica: {days} días: sueles sentirte mejor antes de que {vital} se estabilice.",
"typicalGapLearning": "Con unos pocos episodios resueltos más aparecerá aquí una brecha de recuperación típica.",
"none": "Sin episodios registrados en este período.",
"analyze": "Analizar la brecha de recuperación"
},
"section": {
"active": "Activos",
"resolved": "Resueltos"
},
"flares": {
"countOne": "1 brote",
"countOther": "{count} brotes"
},
"timeline": {
"title": "Cronología del día",
"error": "No se pudo cargar la cronología.",
"severity": "Intensidad {severity}",
"noSymptoms": "Sin síntomas registrados.",
"impact": "Cómo funcionaste: {impact}",
"fever": "Temperatura: {value} °C",
"empty": "Todavía no hay días registrados."
},
"loadError": "No se pudo cargar este episodio.",
"backToList": "Volver al diario",
"detail": {
"note": "Note"
},
"edit": {
"title": "Editar episodio",
"description": "Actualiza los detalles de este episodio."
},
"menu": {
"label": "Acciones del episodio"
},
"deleteConfirm": {
"title": "¿Eliminar este episodio?",
"body": "«{label}» y todos sus registros diarios se eliminarán. Esta acción no se puede deshacer."
},
"vital": {
"RESTING_HEART_RATE": "Frecuencia cardíaca en reposo",
"HEART_RATE_VARIABILITY": "Variabilidad de la frecuencia cardíaca",
"RECOVERY_SCORE": "Recovery",
"OXYGEN_SATURATION": "Saturación de oxígeno",
"BODY_TEMPERATURE": "Temperatura corporal",
"SKIN_TEMPERATURE": "Temperatura de la piel",
"RESPIRATORY_RATE": "Frecuencia respiratoria",
"BLOOD_PRESSURE_SYS": "Presión arterial sistólica",
"BLOOD_PRESSURE_DIA": "Presión arterial diastólica",
"PULSE": "Pulse",
"WEIGHT": "Weight"
},
"listLoadError": "No se pudieron cargar tus episodios."
},
"coach": {
"reminderSuggestion": {
"title": "¿Crear un recordatorio?",
"accept": "Crear recordatorio",
"dismiss": "Ahora no",
"stop": "Ya mido suficiente",
"accepted": "Recordatorio creado",
"dismissed": "De acuerdo, no lo volveré a sugerir",
"stopped": "Entendido, dejaré de sugerir recordatorios",
"failed": "No se pudo crear, inténtalo de nuevo",
"cadence": {
"weightDaily": "Pésate a diario, más o menos a la misma hora",
"bp722": "Mide tu tensión dos veces al día durante una semana",
"glucoseStructured": "Mide tu glucosa con un horario diario estructurado"
}
},
"suggestedAction": {
"apply": "Añadir",
"dismiss": "Ahora no",
"applied": "Añadido",
"dismissed": "Descartado",
"failed": "No se pudo añadir — inténtalo de nuevo",
"checkup": {
"title": "¿Añadir un recordatorio de revisión?"
},
"note": {
"title": "¿Guardar un recordatorio?"
},
"interval": {
"yearly": "Cada año",
"halfYearly": "Cada seis meses",
"quarterly": "Cada tres meses",
"monthly": "Cada mes"
}
},
"settings": {
"reminderSuggestionsLabel": "Sugerencias de frecuencia",
"reminderSuggestionsDescription": "Permite que el Coach ofrezca de vez en cuando un recordatorio basado en evidencia para medir una métrica con más regularidad."
}
},
"safety": {
"floor": {
"bpHighTitle": "Presión arterial muy alta",
"bpHighDoctor": "Dos lecturas recientes fueron de {systolic}/{diastolic} mmHg o más. Descansa, vuelve a medir en unos minutos y contacta a tu médico cuanto antes si sigue así de alta.",
"bpHighEmergency": "Dos lecturas recientes fueron de {systolic}/{diastolic} mmHg o más e indicaste síntomas. Si tienes dolor en el pecho, falta de aire, debilidad o cambios en la visión o el habla, llama a emergencias ya.",
"bpLowTitle": "Presión arterial baja",
"bpLowDoctor": "Dos lecturas recientes tuvieron una sistólica por debajo de {systolic} mmHg. Si te mareas o te sientes débil, siéntate o recuéstate y contacta a tu médico si continúa.",
"bpLowEmergency": "Dos lecturas recientes tuvieron una sistólica por debajo de {systolic} mmHg e indicaste síntomas. Si te sientes a punto de desmayar, confuso o con piel fría y húmeda, llama a emergencias ya.",
"glucoseLowTitle": "Glucosa baja",
"glucoseLowDoctor": "Dos lecturas recientes estuvieron por debajo de 70 mg/dL ({value} mg/dL). Toma carbohidratos de acción rápida, vuelve a medir en 15 minutos y contacta a tu médico si los bajones continúan.",
"glucoseLowEmergency": "Dos lecturas recientes estuvieron por debajo de 70 mg/dL ({value} mg/dL) e indicaste síntomas. Trátalo ahora con azúcar rápida; si no puedes o te sientes muy mal, llama a emergencias.",
"glucoseLowSevereTitle": "Glucosa muy baja",
"glucoseLowSevereDoctor": "Dos lecturas recientes estuvieron por debajo de 54 mg/dL ({value} mg/dL). Trátalo de inmediato con carbohidratos de acción rápida, vuelve a medir en 15 minutos y contacta a tu médico.",
"glucoseLowSevereEmergency": "Dos lecturas recientes estuvieron por debajo de 54 mg/dL ({value} mg/dL) e indicaste síntomas. Trátalo ahora; si no retienes alimentos o te sientes muy mal, llama a emergencias.",
"glucoseHighTitle": "Glucosa muy alta",
"glucoseHighDoctor": "Dos lecturas recientes fueron de {value} mg/dL o más. Vuelve a medir, hidrátate y contacta a tu médico cuanto antes si sigue así de alta.",
"glucoseHighEmergency": "Dos lecturas recientes fueron de {value} mg/dL o más e indicaste síntomas. Si tienes vómitos, respiración rápida o confusión, llama a emergencias ya."
}
},
"version": {
"updateAvailable": {
"title": "Hay una nueva versión disponible",
"reload": "Recargar",
"dismiss": "Descartar"
}
},
"mentalHealth": {
"pageTitle": "Revisión de bienestar mental",
"pageDescription": "Dos autoevaluaciones validadas y opcionales — PHQ-9 (estado de ánimo) y GAD-7 (preocupación) — junto a tu registro de ánimo. Lo valioso es la tendencia en el tiempo, no un único número.",
"disclaimer": "Esto es una autoevaluación de cribado, no un diagnóstico. Una puntuación alta o baja no significa que tengas o no una afección. Solo un profesional de salud cualificado puede diagnosticar. Si tienes dudas, habla con tu médico.",
"optInNote": "Opcional y privado: tus respuestas individuales están cifradas, se mantienen fuera del Coach de IA y de las exportaciones, y nunca se comparten.",
"attributionLabel": "Fuente",
"choosePrompt": "Elige una revisión",
"start": "Empezar",
"back": "Atrás",
"stem": "Durante las últimas 2 semanas, ¿con qué frecuencia te han molestado los siguientes problemas?",
"submit": "Ver mi resultado",
"submitting": "Guardando…",
"saved": "Guardado",
"error": "Algo salió mal. Inténtalo de nuevo.",
"considerProfessional": "Tu puntuación está en un rango en el que hablar con un profesional de salud puede ayudar. Es una sugerencia amable, no un diagnóstico.",
"instrument": {
"phq9": "PHQ-9 — ánimo",
"gad7": "GAD-7 — preocupación"
},
"instrumentSub": {
"phq9": "Cribado de depresión, 9 preguntas",
"gad7": "Cribado de ansiedad, 7 preguntas"
},
"options": {
"0": "Nunca",
"1": "Varios días",
"2": "Más de la mitad de los días",
"3": "Casi todos los días"
},
"functionalTitle": "Si marcaste algún problema, ¿cuánta dificultad te han causado para trabajar, ocuparte de la casa o relacionarte con otras personas?",
"functional": {
"0": "Ninguna dificultad",
"1": "Algo de dificultad",
"2": "Mucha dificultad",
"3": "Dificultad extrema"
},
"result": {
"title": "Tu resultado",
"totalLabel": "Puntuación total",
"bandLabel": "Rango para este cribado",
"takeAnother": "Hacer otra revisión"
},
"band": {
"PHQ9": {
"minimal": "Ninguna / mínima",
"mild": "Leve",
"moderate": "Moderada",
"modSevere": "Moderadamente grave",
"severe": "Grave"
},
"GAD7": {
"minimal": "Ninguna / mínima",
"mild": "Leve",
"moderate": "Moderada",
"severe": "Grave"
}
},
"history": {
"title": "Tu historial",
"empty": "Aún no hay revisiones. Tu tendencia aparecerá aquí cuando completes una."
},
"crisis": {
"title": "No tienes que afrontar esto a solas",
"intro": "Indicaste pensamientos de estar mejor muerto o de hacerte daño. Hay apoyo disponible ahora mismo, y pedir ayuda es una señal de fortaleza.",
"ifDanger": "Si estás en peligro inmediato, llama ahora al {emergency}.",
"resourcesTitle": "Personas que pueden ayudar"
},
"items": {
"phq9": {
"1": "Little interest or pleasure in doing things",
"2": "Feeling down, depressed, or hopeless",
"3": "Trouble falling or staying asleep, or sleeping too much",
"4": "Feeling tired or having little energy",
"5": "Poor appetite or overeating",
"6": "Feeling bad about yourself — or that you are a failure or have let yourself or your family down",
"7": "Trouble concentrating on things, such as reading the newspaper or watching television",
"8": "Moving or speaking so slowly that other people could have noticed. Or the opposite — being so fidgety or restless that you have been moving around a lot more than usual",
"9": "Thoughts that you would be better off dead, or of hurting yourself in some way"
},
"gad7": {
"1": "Feeling nervous, anxious, or on edge",
"2": "Not being able to stop or control worrying",
"3": "Worrying too much about different things",
"4": "Trouble relaxing",
"5": "Being so restless that it is hard to sit still",
"6": "Becoming easily annoyed or irritable",
"7": "Feeling afraid as if something awful might happen"
}
},
"crisisResource": {
"telefonSeelsorge": {
"name": "TelefonSeelsorge (24/7, free, confidential)"
},
"nummerGegenKummer": {
"name": "Nummer gegen Kummer (for young people)"
},
"krisenchat": {
"name": "krisenchat (24/7 chat, young people)"
},
"findahelpline": {
"name": "Find a helpline (worldwide directory)"
},
"euEmotionalSupport": {
"name": "Emotional-support helpline"
},
"lifeline988": {
"name": "988 Suicide & Crisis Lifeline"
},
"crisisTextLine": {
"name": "Crisis Text Line"
}
}
},
"records": {
"disclaimer": "Son tus propios registros, no un diagnóstico médico. HealthLog no diagnostica, no trata ni los interpreta.",
"allergies": {
"cardTitle": "Alergias e intolerancias",
"cardDescription": "Sustancias a las que reaccionas, con la reacción y su gravedad.",
"description": "Registrar una alergia o intolerancia.",
"add": "Añadir alergia",
"addFirst": "Añade tu primera alergia",
"addTitle": "Añadir alergia",
"editTitle": "Editar alergia",
"formDescription": "La sustancia se guarda como texto; la reacción y la nota se cifran.",
"emptyTitle": "No hay alergias registradas",
"emptyDescription": "Añade sustancias a las que reaccionas y sus reacciones.",
"loadError": "No se han podido cargar tus alergias.",
"deletedToast": "Alergia eliminada",
"deleteError": "No se ha podido eliminar la alergia.",
"deleteConfirmTitle": "¿Eliminar esta alergia?",
"deleteConfirmDescription": "Esto elimina el registro. No se puede deshacer.",
"category": {
"FOOD": "Alimento",
"MEDICATION": "Medicamento",
"ENVIRONMENT": "Ambiental",
"BIOLOGIC": "Biológico",
"OTHER": "Otro"
},
"type": {
"ALLERGY": "Alergia",
"INTOLERANCE": "Intolerancia"
},
"severity": {
"NONE": "Sin evaluar",
"MILD": "Leve",
"MODERATE": "Moderada",
"SEVERE": "Grave"
},
"status": {
"ACTIVE": "Activa",
"INACTIVE": "Inactiva",
"RESOLVED": "Resuelta"
},
"form": {
"substance": "Sustancia",
"substancePlaceholder": "p. ej. Penicilina, Cacahuetes",
"category": "Categoría",
"type": "Tipo",
"severity": "Gravedad",
"status": "Estado",
"onset": "Primera vez observada",
"reaction": "Reacción",
"reactionPlaceholder": "p. ej. urticaria, hinchazón, anafilaxia",
"note": "Nota",
"notePlaceholder": "Cualquier otra cosa que merezca recordar",
"requiredError": "Introduce la sustancia.",
"savedToast": "Alergia guardada",
"updatedToast": "Alergia actualizada",
"saveError": "No se ha podido guardar la alergia."
}
},
"family": {
"cardTitle": "Antecedentes familiares",
"cardDescription": "Enfermedades de tus familiares, una entrada por enfermedad.",
"description": "Registrar una enfermedad de un familiar.",
"add": "Añadir entrada",
"addFirst": "Añade tu primera entrada",
"addTitle": "Añadir antecedente familiar",
"editTitle": "Editar antecedente familiar",
"formDescription": "El parentesco y la enfermedad se guardan como texto; la nota se cifra.",
"emptyTitle": "No hay antecedentes familiares",
"emptyDescription": "Añade enfermedades que aparecen en tu familia.",
"loadError": "No se han podido cargar tus antecedentes familiares.",
"deletedToast": "Entrada eliminada",
"deleteError": "No se ha podido eliminar la entrada.",
"deleteConfirmTitle": "¿Eliminar esta entrada?",
"deleteConfirmDescription": "Esto elimina el registro. No se puede deshacer.",
"ageAtOnsetShort": "Edad {age}",
"relationship": {
"MOTHER": "Madre",
"FATHER": "Padre",
"SISTER": "Hermana",
"BROTHER": "Hermano",
"DAUGHTER": "Hija",
"SON": "Hijo",
"GRANDMOTHER_MATERNAL": "Abuela (materna)",
"GRANDFATHER_MATERNAL": "Abuelo (materno)",
"GRANDMOTHER_PATERNAL": "Abuela (paterna)",
"GRANDFATHER_PATERNAL": "Abuelo (paterno)",
"AUNT": "Tía",
"UNCLE": "Tío",
"COUSIN": "Primo/a",
"HALF_SIBLING": "Medio hermano/a",
"OTHER": "Otro familiar"
},
"form": {
"relationship": "Familiar",
"condition": "Enfermedad",
"conditionPlaceholder": "p. ej. Diabetes tipo 2, Cáncer de mama",
"ageAtOnset": "Edad de inicio",
"ageAtOnsetPlaceholder": "p. ej. 55",
"note": "Nota",
"notePlaceholder": "Cualquier otra cosa que merezca recordar",
"requiredError": "Introduce la enfermedad.",
"ageError": "Introduce una edad entre 0 y 120.",
"savedToast": "Entrada guardada",
"updatedToast": "Entrada actualizada",
"saveError": "No se ha podido guardar la entrada."
}
}
},
"environment": {
"fields": {
"tempMean": "Temperatura diaria",
"tempMin": "Mínima nocturna",
"sunshine": "Sol",
"daylight": "Luz diurna",
"precip": "Precipitación",
"pressureMean": "Presión atmosférica",
"pressureDelta": "Variación de presión"
}
},
"documents": {
"title": "Documentos entrantes",
"subtitle": "Sube un documento clínico y revisa los datos que hemos leído.",
"disclaimer": {
"title": "Leemos, no interpretamos",
"body": "Solo transcribimos lo que indica tu documento — valores, códigos y fechas — y nunca diagnosticamos, interpretamos ni marcamos nada. No se guarda nada hasta que lo revises y lo apruebes. Solo tu profesional sanitario puede interpretar estos resultados."
},
"upload": {
"label": "Subir un documento",
"kindLabel": "Tipo de documento",
"button": "Subir",
"uploading": "Leyendo…",
"fileLabel": "Archivo del documento"
},
"kind": {
"DOCTOR_REPORT": "Informe médico",
"DISCHARGE_LETTER": "Alta hospitalaria",
"OTHER": "Otro"
},
"list": {
"empty": "Aún no hay documentos."
},
"status": {
"EXTRACTING": "Leyendo",
"EXTRACTED": "Listo para revisar",
"FAILED": "No se pudo leer",
"CONFIRMED": "Revisado",
"DISCARDED": "Descartado"
},
"review": {
"title": "Revisar datos extraídos",
"discard": "Descartar",
"confirm": "Guardar datos aprobados",
"confirming": "Guardando…",
"needsReview": "Requiere revisión",
"approve": "Aprobar",
"reject": "Rechazar",
"edit": "Editar",
"cancel": "Cancelar",
"save": "Guardar"
},
"empty": {
"noFacts": "Nada más que revisar."
},
"factType": {
"CONDITION": "Diagnóstico",
"OBSERVATION": "Valor",
"MEDICATION_STATEMENT": "Medicación"
},
"fields": {
"label": "Nombre",
"value": "Valor",
"unit": "Unidad",
"date": "Fecha",
"dose": "Dosis"
},
"toast": {
"uploaded": "Documento leído. Revisa los datos a continuación.",
"uploadFailed": "No se pudo leer el documento.",
"confirmed": "Datos aprobados guardados.",
"confirmFailed": "No se pudieron guardar tus decisiones.",
"saved": "Dato actualizado.",
"discarded": "Documento descartado."
}
},
"selfDescription": {
"intendedPurpose": "HealthLog es una herramienta personal de registro de salud y bienestar. Te ayuda a registrar, visualizar y exportar tus propios datos de salud. No diagnostica, trata, cura ni previene ninguna enfermedad, y no es un producto sanitario.",
"coach": "El Coach trabaja con tus propios datos registrados. No es un médico y no da consejo médico: para un diagnóstico o tratamiento, consulta a un profesional sanitario.",
"insights": "Son patrones descriptivos calculados a partir de tus propios datos registrados, no una evaluación clínica ni un diagnóstico.",
"labs": "Son tus propios registros, no un diagnóstico médico. Los rangos de referencia varían según el laboratorio y la persona: solo tu médico puede interpretarlos por ti.",
"medications": "Esto registra los medicamentos que anotas y tu propia adherencia. No evalúa dosis ni interacciones y no es consejo médico: confírmalo con tu farmacéutico o médico.",
"emergency": "Si esto pudiera ser una emergencia, llama ahora a tu número de emergencias local o a un profesional sanitario. HealthLog no puede ayudar en una emergencia.",
"dataPosture": "HealthLog es autoalojado: tus datos de salud permanecen en tu propia instancia, cifrados en reposo. Las funciones de IA usan una clave de proveedor que tú aportas o un modelo local, así que nada sale de tu instancia más allá del proveedor que configures, y no hay analítica de terceros sobre tus datos de salud."
}
}