Files
HealthLog/messages/es.json
T
Marc-André Bombeck 107a111545 fix(insights): polish range pills, zero-delta caption, scrollbar gutter, mood tiles
- Range pills: make the radiogroup a single tab stop with roving tabindex and
  Arrow / Home / End key handling, matching the WAI-ARIA radiogroup pattern.
  Previously every pill was its own tab stop and the arrow keys were dead.
- Range delta caption: render a neutral dash + "no change" for a perfectly
  stable metric instead of a down-arrow with "−0%". Adds the `noChange`
  string across all six locales.
- Scrollbar gutter: scope the document-level `scrollbar-gutter: stable` to the
  body-scrolled shells (login / register / onboarding / legal) via a
  `data-scroll` attribute the shell sets, so the height-locked authenticated
  branch no longer reserves a second, never-painted gutter on classic
  scrollbar platforms.
- Mood tiles: a lone in-target / stability tile now spans full width instead
  of leaving a half-width orphan beside it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit 12b434a0c262e29ced1ac0aaf631db6678c3ad05)
2026-06-02 17:34:52 +02:00

4201 lines
190 KiB
JSON
Raw Permalink 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",
"edit": "Editar",
"moreOptions": "Más opciones",
"create": "Crear",
"close": "Cerrar",
"loading": "Cargando…...",
"loadFailed": "Could not load",
"error": "Error",
"saved": "Guardado",
"no": "No",
"noData": "Sin datos disponibles",
"optional": "Opcional",
"active": "Activo",
"inactive": "Inactivo",
"enabled": "Activado",
"disabled": "Desactivado",
"networkError": "Error de red",
"unknownError": "Error desconocido",
"copied": "¡Copiado!",
"or": "o",
"unknown": "Desconocido",
"add": "Añadir",
"import": "Importar",
"test": "Probar",
"reset": "Restablecer",
"copy": "Copiar",
"copyDetails": "Copiar detalles",
"retry": "Reintentar",
"reportIssue": "Reportar problema",
"showPassword": "Mostrar contraseña",
"hidePassword": "Ocultar contraseña"
},
"doctorReport": {
"title": "Informe de salud",
"subtitle": "HealthLog — Informe personal de salud",
"patient": "Paciente",
"dateOfBirth": "Fecha de nacimiento",
"gender": "Sexo",
"genderMale": "Hombre",
"genderFemale": "Mujer",
"genderOther": "No binario",
"height": "Altura",
"period": "Período del informe",
"createdOn": "Creado el",
"vitalsTitle": "Signos vitales — Resumen",
"colParameter": "Parámetro",
"colCurrent": "Actual",
"colAvgPeriod": "Med. periodo",
"colMin": "Mín",
"colMax": "Máx",
"colN": "n",
"bpClassificationTitle": "Tensión arterial — Clasificación ESH (2023)",
"avgBp": "Tensión arterial media",
"classification": "Clasificación",
"bmiTitle": "Índice de masa corporal (IMC)",
"bmiRow": "IMC:{bmi} kg/m² — Classification: {class} (WHO)",
"complianceTitle": "Cumplimiento de medicación",
"glp1Title": "Terapia GLP-1",
"glp1WeightSummary": "Peso en el periodo del informe: {start} kg → {end} kg ({delta} kg)",
"glp1CurrentDose": "Dosis actual:{value} {unit} (since {since})",
"glp1Compliance": "Cumplimiento:{taken} / {total} ({rate}%)",
"glp1SideEffectsTitle": "Efectos secundarios registrados",
"colGlp1Date": "Fecha",
"colGlp1Dose": "Dosis",
"colGlp1Note": "Nota",
"colGlp1SideEffect": "Efecto secundario",
"colMedication": "Medicamento",
"colTaken": "Tomada",
"colSkipped": "Omitida",
"colMissed": "Perdida",
"colTotal": "Total",
"colComplianceRate": "Tasa de cumplimiento",
"moodTitle": "Evolución del estado de ánimo",
"moodSummary": "Promedio:{avg} / 5.0 · Entries: {count} · Range: {min}–{max}",
"colMood": "Estado de ánimo",
"colCount": "Cantidad",
"colShare": "Porcentaje",
"footerDisclaimer1": "Este informe se generó automáticamente a partir de datos autorregistrados y está destinado a apoyar",
"footerDisclaimer2": "la conversación entre médico y paciente. No sustituye un diagnóstico médico. Las correlaciones no implican causalidad.",
"footerSource": "Fuente: HealthLog | Zona horaria: Europe/Berlin | Creado: {timestamp}",
"typeWeight": "Peso corporal",
"typeBpSys": "Tensión arterial sistólica",
"typeBpDia": "Tensión arterial diastólica",
"typePulse": "Pulso en reposo",
"typeBodyFat": "Grasa corporal",
"typeSleep": "Duración del sueño",
"typeSteps": "Actividad (pasos)",
"typeTotalBodyWater": "Agua corporal total",
"typeBoneMass": "Masa ósea",
"typeOxygenSaturation": "Saturación de oxígeno",
"unitSteps": "Pasos",
"bmiUnderweight": "Peso insuficiente",
"bmiNormal": "Peso normal",
"bmiOverweight": "Sobrepeso (preobesidad)",
"bmiObeseGrade1": "Obesidad grado I",
"bmiObeseGrade2": "Obesidad grado II",
"bmiObeseGrade3": "Obesidad grado III",
"bpOptimal": "Óptima",
"bpNormal": "Normal",
"bpHighNormal": "Normal-alta",
"bpHypertensionGrade1": "Hipertensión grado 1",
"bpHypertensionGrade2": "Hipertensión grado 2",
"bpHypertensionGrade3": "Hipertensión grado 3",
"moodAwful": "Muy mal",
"moodBad": "Mal",
"moodNeutral": "Neutral",
"moodGood": "Bien",
"moodGreat": "Muy bien",
"typeGlucoseFasting": "Glucosa (en ayunas)",
"typeGlucosePostprandial": "Glucosa (posprandial)",
"typeGlucoseRandom": "Glucosa (aleatoria)",
"typeGlucoseBedtime": "Glucosa (antes de dormir)",
"glucoseClassificationTitle": "Glucemia — Rangos de referencia (ADA 2024 / DDG)",
"glucoseRow": "{label}: med. {avg} {unit} (objetivo {rangeMin}–{rangeMax}) — {class}",
"glucoseInTarget": "en objetivo",
"glucoseBelowTarget": "por debajo del objetivo",
"glucoseAboveTarget": "por encima del objetivo",
"practiceLabel": "Consulta",
"dialog": {
"title": "Informe médico (PDF)",
"description": "Define el periodo de análisis y (opcional) el nombre de la consulta — ambos aparecen en la portada.",
"startLabel": "Desde",
"endLabel": "Hasta",
"practiceLabel": "Consulta / clínica (opcional)",
"practicePlaceholder": "p. ej. Dr. Müller — Medicina familiar",
"preset90d": "Últimos 90 días",
"preset180d": "Últimos 6 meses",
"preset365d": "Últimos 12 meses",
"submit": "Generar PDF",
"cancel": "Cancelar",
"errorEndBeforeStart": "La fecha final no puede ser anterior a la inicial.",
"errorRangeTooLong": "El periodo de análisis no puede superar los 2 años.",
"errorInvalidDate": "Selecciona una fecha de inicio y fin válida."
},
"sections": {
"title": "Seleccionar contenido",
"bp": "Presión arterial",
"weight": "Peso",
"pulse": "Pulso en reposo",
"bmi": "Índice de masa corporal (IMC)",
"mood": "Estado de ánimo",
"moodSensitive": "Sensible — desactivado por defecto.",
"compliance": "Cumplimiento de medicación",
"sleep": "Duración del sueño",
"empty": "No hay datos para el periodo seleccionado. El informe se generará con la portada.",
"unavailableHint": "Sin datos en este periodo"
},
"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."
},
"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."
},
"nav": {
"dashboard": "Panel",
"measurements": "Mediciones",
"medications": "Medicamentos",
"insights": "Insights",
"targets": "Objetivos",
"achievements": "Logros",
"settings": "Ajustes",
"bugreport": "Reporte de bug",
"admin": "Consola de administración",
"logout": "Cerrar sesión",
"login": "Iniciar sesión",
"about": "Acerca de HealthLog",
"notifications": "Centro de notificaciones",
"theme": "Apariencia",
"themeSystem": "Sistema",
"themeDark": "Oscuro",
"themeLight": "Claro",
"collapseSidebar": "Contraer",
"userMenu": "Menú de usuario",
"mood": "Estado de ánimo",
"skipToContent": "Saltar al contenido",
"sidebar": "Barra lateral",
"mainNavigation": "Navegación principal",
"mobileNavigation": "Navegación móvil",
"breadcrumb": "Ruta de navegación",
"loadingScreen": "Cargando…",
"more": "Más",
"moreSheetTitle": "Más",
"moreSheetDescription": "Páginas que no caben en la barra inferior."
},
"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",
"createAccount": "Crear cuenta",
"newAccount": "Crear cuenta nueva",
"backToPasskey": "Volver a passkey",
"passkeySetupLater": "Puedes configurar passkeys más tarde en los ajustes.",
"passwordMinLength": "Mín. 12 caracteres",
"passwordTooShort": "La contraseña debe tener al menos {minLength} caracteres.",
"privacyPolicy": "Política de privacidad"
},
"dashboard": {
"title": "Panel",
"greeting": {
"morning": "Buenos días",
"day": "Hola",
"evening": "Buenas tardes"
},
"welcomeBack": "{greeting}, te damos la bienvenida de nuevo.",
"welcomeBackWithName": "{greeting} {name}, te damos la bienvenida de nuevo.",
"greetingSalutation": "Hola, {name}",
"streakLabel": "días seguidos",
"weight": "Peso",
"bloodPressure": "Presión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"sleep": "Sueño",
"steps": "Pasos",
"vo2Max": "VO₂ máx",
"vo2MaxUnit": "mL/(kg·min)",
"bpInTarget": "TA en rango objetivo",
"weightShort": "Peso",
"bloodPressureSysShort": "PA (Sys)",
"bloodPressureDiaShort": "PA (Dia)",
"pulseShort": "Pulso",
"bodyFatShort": "GC",
"moodShort": "Humor",
"sleepShort": "Sueño",
"stepsShort": "Pasos",
"vo2MaxShort": "VO₂ máx",
"bpInTargetShort": "PA-objetivo",
"medications": "Medicamentos",
"quickAddMeasurement": "Registrar medición",
"quickAddMood": "Registrar estado de ánimo",
"quickAddMedicationIntake": "Registrar toma",
"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": "Por ahora se registra la dosis estándar. Las dosis variables llegarán en una próxima versión.",
"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"
},
"compliance7d": "Cumplimiento (7 días)",
"mood": "Estado de ánimo",
"customizeTitle": "Diseño del panel",
"layoutReset": "Restablecer valores por defecto",
"layoutSaveSuccess": "Diseño del panel guardado",
"layoutSaveError": "No se ha podido guardar el diseño",
"layoutResetSuccess": "Restablecido al diseño por defecto",
"layoutUsingDefaults": "Diseño por defecto activo",
"layoutCustomized": "Diseño personalizado activo",
"moveUp": "Subir",
"moveDown": "Bajar",
"layoutTileColumn": "Tarjeta",
"layoutChartColumn": "Gráfico",
"dragHandle": "Arrastra para reordenar",
"dragHandleHint": "Arrastra el manejador para reordenar este widget. También puedes usar los botones de flecha Arriba y Abajo, o enfocar el manejador y pulsar Espacio más las flechas.",
"emptyTitle": "Tu panel está vacío",
"emptyDescription": "Registra tu primera medición o estado de ánimo. Las tarjetas y gráficas aparecerán automáticamente en cuanto haya datos.",
"emptyAddMeasurement": "Registrar la primera medición",
"staleHint": "Último valor hace {count} d",
"staleHintWeeksOne": "Último valor hace 1 semana",
"staleHintWeeksOther": "Último valor hace {count} semanas",
"staleHintMonthsOne": "Último valor hace 1 mes",
"staleHintMonthsOther": "Último valor hace {count} meses",
"coachCta": "Pregunta al coach",
"recentWorkouts": {
"title": "Entrenamientos recientes",
"viewAll": "Ver todos",
"loading": "Cargando entrenamientos…",
"empty": {
"title": "Aún no hay entrenamientos",
"cta": "Abre la app Apple Salud en el iPhone para sincronizar los entrenamientos."
}
},
"metric": {
"title": {
"weight": "Peso",
"bloodPressure": "Presión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"glucose": "Glucemia",
"sleep": "Sueño",
"steps": "Pasos",
"totalBodyWater": "Agua corporal total",
"boneMass": "Masa ósea",
"oxygenSaturation": "Saturación de oxígeno"
},
"unit": {
"weight": "kg",
"bloodPressure": "mmHg",
"pulse": "bpm",
"bodyFat": "%",
"glucose": "mg/dL",
"sleep": "h",
"steps": "pasos",
"totalBodyWater": "kg",
"boneMass": "kg",
"oxygenSaturation": "%"
}
}
},
"measurements": {
"title": "Mediciones",
"subtitle": "Peso, tensión arterial, pulso y más",
"addMeasurement": "Añadir",
"editMeasurement": "Editar medición",
"type": "Tipo",
"value": "Valor",
"date": "Fecha",
"source": "Fuente",
"notes": "Notas",
"typeWeight": "Peso",
"typeBloodPressure": "Presión arterial",
"typeBpSys": "Sis",
"typeBpDia": "Dia",
"typePulse": "Pulso",
"typeBodyFat": "Grasa corporal",
"typeSleep": "Sueño",
"typeSteps": "Pasos",
"typeBloodGlucose": "Glucemia",
"typeTotalBodyWater": "Agua corporal total",
"typeBoneMass": "Masa ósea",
"typeOxygenSaturation": "Saturación de oxígeno",
"typeHeartRateVariability": "Variabilidad de la frecuencia cardiaca",
"typeRestingHeartRate": "Frecuencia cardíaca en reposo",
"typeActiveEnergyBurned": "Energía activa",
"typeFlightsClimbed": "Escaleras",
"typeWalkingRunningDistance": "Distancia a pie y corriendo",
"typeVo2Max": "VO₂ máx",
"typeBodyTemperature": "Temperatura corporal",
"typeFatFreeMass": "Masa libre de grasa",
"typeFatMass": "Masa grasa",
"typeMuscleMass": "Masa muscular",
"typeSkinTemperature": "Temperatura de la piel",
"typePulseWaveVelocity": "Velocidad de la onda de pulso",
"typeVascularAge": "Edad vascular",
"typeVisceralFat": "Grasa visceral",
"typeAudioExposureEnv": "Exposición al ruido (ambiente)",
"typeAudioExposureHeadphone": "Exposición al ruido (auriculares)",
"typeTimeInDaylight": "Tiempo a la luz del día",
"typeWalkingSteadiness": "Estabilidad al caminar",
"typeAudioExposureEvent": "Evento de escucha alta",
"typeRespiratoryRate": "Frecuencia respiratoria",
"typeBodyMassIndex": "Índice de masa corporal",
"typeLeanBodyMass": "Masa magra",
"typeWalkingHeartRateAverage": "Frecuencia cardíaca al caminar (media)",
"typeWalkingAsymmetry": "Asimetría al caminar",
"typeWalkingDoubleSupport": "Doble apoyo al caminar",
"typeWalkingStepLength": "Longitud de zancada",
"typeWalkingSpeed": "Velocidad al caminar",
"glucoseContext": "Contexto",
"glucoseContextFasting": "En ayunas (≥8 h sin comer)",
"glucoseContextPostprandial": "Posprandial (2 h tras comer)",
"glucoseContextRandom": "Cualquiera / sin contexto",
"glucoseContextBedtime": "Antes de acostarse",
"unitHours": "Horas",
"unitSteps": "Pasos",
"sourceManual": "Manual",
"sourceWithings": "Withings",
"sourceImport": "Importar",
"sourceAppleHealth": "Apple Health",
"systolicLabel": "Sistólica (mmHg)",
"diastolicLabel": "Diastólica (mmHg)",
"pulseLabel": "Pulso (lpm)",
"valueWithUnit": "Valor ({unit})",
"timestamp": "Hora",
"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",
"invalidValue": "Introduce un valor válido.",
"invalidTimestamp": "Selecciona una fecha y hora válidas.",
"loginRequired": "Inicia sesión para ver las mediciones.",
"allTypes": "Todos los tipos",
"filterByType": "Filtrar por tipo",
"measurementCount": "{count} mediciones",
"emptyTitle": "Aún no hay mediciones",
"emptyDescription": "Registra peso, tensión arterial, pulso u otros valores para detectar tendencias.",
"emptyFilteredTitle": "Ninguna medición coincide con el filtro",
"emptyFilteredDescription": "Elige otro tipo o quita el filtro para ver todas las mediciones.",
"emptyAddFirst": "Registrar la primera medición",
"emptyResetFilter": "Mostrar todos los tipos",
"comment": "Comentario",
"actions": "Acciones",
"deleteConfirmTitle": "¿Eliminar medición?",
"deleteConfirmDescription": "Esta medición se eliminará de forma permanente.",
"pageInfo": "Página {page} de {total}",
"previousPage": "Página anterior",
"nextPage": "Página siguiente",
"dailyTotalCaption": "({count} muestras)",
"expandDay": "Mostrar las muestras de este día",
"collapseDay": "Ocultar las muestras de este día",
"loadError": "No se pudieron cargar las mediciones."
},
"mood": {
"title": "Estado de ánimo",
"subtitle": "Tendencia y registros de estado de ánimo",
"addEntry": "Añadir",
"editEntry": "Editar entrada",
"moodLevel": "Estado de ánimo",
"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",
"saveError": "Error al guardar",
"deleteError": "Error al eliminar",
"invalidTimestamp": "Selecciona una fecha y hora válidas.",
"deleteConfirmTitle": "¿Eliminar entrada?",
"deleteConfirmDescription": "Esta entrada de estado de ánimo se eliminará de forma permanente.",
"pageInfo": "Página {page} de {total}",
"loginRequired": "Inicia sesión para ver tus estados de ánimo.",
"note": "Nota",
"notePlaceholder": "Añade una nota sobre cómo te sientes…",
"tagPicker": "Etiquetas",
"tagCategory": {
"feelings": "Sentimientos",
"sleep": "Sueño",
"health": "Salud",
"social": "Social",
"work": "Trabajo"
},
"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"
}
},
"medications": {
"title": "Medicamentos",
"subtitle": "Medicación, horarios y tomas",
"loginRequired": "Inicia sesión para gestionar medicamentos.",
"addMedication": "Añadir",
"editMedication": "Editar medicamento",
"newMedication": "Nuevo medicamento",
"firstMedication": "Añadir el primer medicamento",
"emptyTitle": "Aún no hay medicamentos",
"emptyDescription": "Crea medicamentos, dosis y franjas horarias para registrar el cumplimiento.",
"loadFailed": "No se han podido cargar los medicamentos",
"retryLoad": "Reintentar",
"name": "Nombre",
"dose": "Dosis",
"scheduleFrom": "Desde",
"scheduleTo": "Hasta",
"scheduleLabel": "Etiqueta",
"scheduleDays": "Días",
"scheduleDaily": "A diario",
"inactive": "En pausa",
"intakeHistory": "Historial de tomas",
"openDetailPage": "Open medication detail page",
"deleteConfirm": "¿Eliminar medicamento?",
"compliance": "Cumplimiento",
"importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file",
"importPaste": "Paste JSON here...",
"importSelected": "Selected: {name}",
"importFileLoaded": "File \"{name}\" loaded",
"importInvalidJson": "File does not contain valid JSON",
"importNoArray": "No array found",
"importResult": "{imported} intakes imported",
"importDuplicatesSkipped": "{count} duplicates skipped",
"importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format",
"apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active",
"apiEndpointActivated": "API endpoint activated",
"apiEndpointDeactivated": "API endpoint deactivated",
"apiTokenCount": "Active ({count} tokens)",
"apiToken": "API Token",
"apiTokenActiveHint": "Endpoint is active. Existing tokens remain valid but cannot be shown in plain text again.",
"apiTokenActivateHint": "Activate the endpoint to create a new token.",
"apiTokenOnceHint": "The token is only shown in plain text once at creation.",
"requestExample": "Request example",
"statusLoadFailed": "Could not load status",
"changeFailed": "Change failed",
"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": "Antibiotic",
"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",
"withoutNotification": "Sin notificación",
"pausedSince": "En pausa desde",
"takeNow": "Tomar ahora",
"overdue": "Vencida",
"veryOverdue": "Muy vencida",
"compliance7d": "Cumplimiento 7 días",
"compliance30d": "Cumplimiento 30 días",
"complianceWindow": "Cumplimiento {days} días",
"lastIntake": "Última toma:",
"nextIntake": "Próxima toma:",
"dayStreak": "días de racha",
"taken": "Tomada",
"skipped": "Omitida",
"intakeToastTaken": "{name} registrada como tomada",
"intakeToastSkipped": "{name} omitida",
"weekdaySunday": "Domingo",
"weekdayMonday": "Lunes",
"weekdayTuesday": "Martes",
"weekdayWednesday": "Miércoles",
"weekdayThursday": "Jueves",
"weekdayFriday": "Viernes",
"weekdaySaturday": "Sábado",
"weekdaySundayPlural": "Domingos",
"weekdayMondayPlural": "Lunes",
"weekdayTuesdayPlural": "Martes",
"weekdayWednesdayPlural": "Miércoles",
"weekdayThursdayPlural": "Jueves",
"weekdayFridayPlural": "Viernes",
"weekdaySaturdayPlural": "Sábados",
"formType": "Tipo",
"formDose": "Dosis",
"formUnit": "Unidad",
"formSchedule": "Franja horaria",
"formTreatmentClass": "Clase de tratamiento",
"formTreatmentClassHelp": "Selecciona \"Inyección GLP-1\" para inyecciones semanales como Mounjaro, Ozempic, Wegovy, Zepbound. Activa la tarjeta corporal y el registro GLP-1.",
"treatmentClassGeneric": "Medicamento estándar",
"treatmentClassGlp1": "Inyección GLP-1",
"glp1WeeklyPresetTitle": "Una vez por semana, en…",
"glp1WeeklyPresetHelp": "La mayoría de los agonistas del receptor GLP-1 se inyectan una vez por semana. Toca un día para fijar el ritmo.",
"glp1WeeklyPresetSuggest": "Reutilizar el último día elegido",
"glp1DosesPerUnit": "Dosis por pluma / vial",
"glp1DosesPerUnitPlaceholder": "p. ej. 4 para una pluma Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Opcional — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy pluma de un solo uso = 1. Déjalo vacío si no quieres llevar el conteo de dosis por pluma.",
"glp1LastInjection": "Última cita: {label}",
"glp1LastInjectionWithSite": "Última cita: {label} · {site}",
"glp1NextInjectionDays": "Siguiente: {label} (en {days} días)",
"glp1NextInjectionToday": "Próxima cita: hoy",
"glp1NextInjectionTomorrow": "Próxima cita: mañana",
"glp1RotationLast": "Último sitio: {site}",
"glp1RotationSuggested": "Sugerido: {site}",
"glp1LogSideEffect": "Registrar efecto secundario",
"sideEffects": {
"section": "Efectos secundarios",
"addCta": "Registrar",
"sheetTitle": "Registrar un efecto secundario",
"categoryLabel": "Categoría",
"entryLabel": "Síntoma",
"severityLabel": "Gravedad",
"severity": {
"mild": "Leve",
"moderate": "Moderado",
"significant": "Notable",
"severe": "Grave",
"verySevere": "Muy grave"
},
"notesLabel": "Notas (opcional)",
"notesPlaceholder": "Lo que merezca la pena anotar, máx. 280 caracteres",
"submitCta": "Guardar",
"cancelCta": "Cancelar",
"emptyState": "Aún no hay efectos secundarios registrados. Hacer seguimiento puede ayudar a tu médico y revelar patrones a lo largo del tiempo.",
"recentTitle": "Últimos 30 días",
"loading": "Cargando…",
"deleteCta": "Eliminar",
"deleteConfirm": "¿Eliminar esta entrada?",
"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áusea",
"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": "Cadence",
"label": "How often",
"kind": {
"daily": "Every day",
"weekdays": "Certain days of the week",
"everyNWeeks": "Every N weeks on certain days",
"monthly": "Monthly on a specific day",
"everyNMonths": "Every N months on a specific day",
"yearly": "Once a year",
"rolling": "Every N days from when I last took it (flexible)",
"rollingExplainer": "Counts from your last logged intake — pauses if you skip a dose.",
"oneShot": "One-time dose"
},
"weekdays": {
"label": "Days of the week",
"short": {
"mo": "Mo",
"tu": "Tu",
"we": "We",
"th": "Th",
"fr": "Fr",
"sa": "Sa",
"su": "Su"
},
"long": {
"mo": "Monday",
"tu": "Tuesday",
"we": "Wednesday",
"th": "Thursday",
"fr": "Friday",
"sa": "Saturday",
"su": "Sunday"
}
},
"intervalWeeks": {
"suffix": "weeks"
},
"dayOfMonth": {
"label": "Day"
},
"intervalMonths": {
"suffix": "months",
"dayOnLabel": "on day"
},
"yearly": {
"date": {
"label": "Date"
}
},
"rollingDays": {
"suffix": "days"
}
},
"timesOfDay": {
"section": "Times of day",
"label": "Times of day",
"empty": {
"cta": "Add the first time."
},
"add": "Add time",
"remove": "Remove",
"presets": {
"morning": "Morning",
"noon": "Noon",
"evening": "Evening",
"night": "Night"
},
"max": {
"reached": "Maximum reached — remove a time before adding another."
}
},
"courseWindow": {
"section": "Course window",
"startsOn": {
"label": "Starts on"
},
"endsOn": {
"label": "Ends on"
},
"noEndDate": "No end date",
"oneShotCaption": "(one-time dose)",
"invalidRange": "End date must be on or after the start date."
}
},
"wizard": {
"header": {
"stepOf": "Step {current} of {total}",
"createTitle": "New medication",
"editTitle": "Edit {name}"
},
"nav": {
"back": "Back",
"next": "Next",
"save": "Save",
"saveEdit": "Save changes",
"nextHint": "Siguiente: {step}",
"reviewHint": "Siguiente: Guardar",
"jumpFirst": "Ir al primer paso",
"jumpLast": "Ir a revisar y guardar"
},
"nl": {
"button": "Describe"
},
"steps": {
"step1": {
"title": "What's the medication called?",
"subline": "Exactly as it appears on the box.",
"label": "Name",
"placeholder": "e.g. Ramipril",
"short": "Nombre"
},
"step2": {
"title": "What kind of medication is it?",
"subline": "We use this for the right templates and analytics.",
"short": "Tipo"
},
"step3": {
"title": "What's the dose?",
"subline": "A tablet, a puff, a drop — depending on the form.",
"amountLabel": "Amount",
"amountPlaceholder": "e.g. 5",
"unitLabel": "Unit",
"unit": {
"mg": "mg",
"ml": "ml",
"iu": "IU",
"mcg": "µg",
"g": "g",
"tablets": "tablet(s)",
"capsules": "capsule(s)",
"drops": "drops",
"puffs": "puff",
"sprays": "spray",
"pieces": "pieces",
"other": "other"
},
"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"
},
"step4": {
"title": "Over what period are you taking it?",
"subline": "A start date is enough for today. You can add an end date later.",
"short": "Cuándo"
},
"step5": {
"title": "How often do you take it?",
"subline": "Pick the cadence — the details follow on the next step.",
"short": "Frecuencia"
},
"step6": {
"title": "What does that look like in detail?",
"subline": "Set weekdays, intervals, or the day of the month.",
"intervalWeeks": {
"label": "Every",
"suffix": "weeks"
},
"dayOfMonth": {
"label": "On",
"suffix": "day of the month"
},
"rollingDays": {
"label": "Every",
"suffix": "days from the last intake"
},
"short": "Detalle"
},
"step7": {
"title": "When do you take it?",
"subline": "One or more times of day — reminders follow this list.",
"presetsLabel": "Time-of-day presets",
"presets": {
"morning": "Morning",
"noon": "Noon",
"evening": "Evening",
"night": "Night"
},
"short": "Horas"
},
"step8": {
"title": "All done — should HealthLog remind you?",
"subline": "Review everything below before you save.",
"remindersLabel": "Reminders on",
"remindersDescription": "Push, Telegram or ntfy — based on your settings.",
"multiScheduleNote": "This medication has multiple schedules. The detailed editor returns in a later release.",
"short": "Listo"
}
},
"classRow": {
"bloodPressure": "Blood pressure",
"diabetes": "Diabetes",
"hormone": "Hormones",
"glp1": "GLP-1 injection",
"painRelief": "Pain",
"allergy": "Allergy",
"vitamin": "Vitamins",
"supplement": "Supplement",
"antibiotic": "Antibiotic",
"other": "Other"
},
"cadence": {
"daily": {
"label": "Daily",
"description": "Every day at the same time."
},
"weekdays": {
"label": "Specific weekdays",
"description": "E.g. Monday, Wednesday, Friday."
},
"everyNWeeks": {
"label": "Every few weeks",
"description": "E.g. every 2 weeks on Thursdays (GLP-1, biologics)."
},
"monthly": {
"label": "Monthly",
"description": "On a fixed day each month (e.g. always the 1st)."
},
"rolling": {
"label": "Flexible from last dose",
"description": "Leave the next dose open. When you tap 'taken', the counter starts again from that moment."
},
"oneShot": {
"label": "Single dose",
"description": "One administration, e.g. a vaccine or an antibiotic course."
}
},
"summary": {
"title": "Summary",
"cadence": {
"daily": "Every day",
"weekdays": "On selected days of the week",
"biweekly": "Every two weeks",
"monthly": "Monthly",
"quarterly": "Every three months",
"yearly": "Once a year",
"rolling": "Every {n} days from your last intake",
"oneShot": "A single dose",
"everyNWeeks": "Every {n} weeks",
"everyNMonths": "Every {n} months"
},
"weekdaysDetail": ", on {days}",
"dayOfMonthDetail": ", on day {day}.",
"times": "at {times}",
"startsOn": "Starts: {date}",
"endsOn": "Ends: {date}",
"noEndDate": "No end date"
},
"compose": {
"scheduleIndex": "Schedule {n} of {total}",
"list": {
"add": "Add another schedule",
"edit": "Edit",
"remove": "Remove",
"removeDisabled": "At least one schedule is required.",
"empty": "No schedule yet."
}
},
"errors": {
"submitFailed": "Could not save the medication — please retry."
}
},
"doseStrength": {
"title": "Dosis a lo largo del tiempo",
"axisLabel": "Dosis registrada ({unit})",
"tooltipLabel": "Dosis",
"currentDose": "Dosis actual: {dose} {unit}",
"noCurrentDose": "Aún no hay dosis registrada.",
"empty": "Aún no hay historial de titulación. Registra un cambio de dosis para ver la curva de dosis."
},
"injectionSiteBodyOutlineAriaLabel": "Silueta del cuerpo",
"injectionSitePickerAriaLabel": "Selector de sitio de inyección",
"injectionSiteRecommendedAriaLabel": "{site}: sitio siguiente recomendado",
"siteAbdomenLeft": "Abdomen, inferior izquierdo",
"siteAbdomenRight": "Abdomen, inferior derecho",
"siteAbdomenUpperLeft": "Abdomen, superior izquierdo",
"siteAbdomenUpperRight": "Abdomen, superior derecho",
"siteThighLeft": "Muslo izquierdo",
"siteThighRight": "Muslo derecho",
"siteUpperArmLeft": "Brazo superior izquierdo",
"siteUpperArmRight": "Brazo superior derecho",
"sideEffectTagsHelp": "Toca un chip para añadirlo a las etiquetas de estado de ánimo.",
"sideEffectTagNausea": "Náuseas",
"sideEffectTagConstipation": "Estreñimiento",
"sideEffectTagDiarrhea": "Diarrea",
"sideEffectTagFatigue": "Fatiga",
"sideEffectTagAppetiteLoss": "Pérdida de apetito",
"sideEffectTagHeartburn": "Ardor de estómago",
"sideEffectTagHeadache": "Dolor de cabeza",
"newSchedule": "Nueva franja horaria",
"removeSchedule": "Quitar franja horaria",
"advancedEditing": "Edición avanzada",
"advancedEditingHide": "Ocultar edición avanzada",
"scheduleInterval": "Intervalo",
"scheduleEveryWeek": "cada semana",
"scheduleEveryNWeeks": "cada {n} semanas",
"scheduleIntervalPrefix": "Intervalo:",
"nextSchedulePrefix": "Próxima franja:",
"nextScheduleDaily": "a diario",
"importIntakesAction": "Importar tomas",
"apiEndpointAction": "Endpoint de API",
"pause": "Pausar",
"activate": "Activar",
"disableNotifications": "Desactivar notificaciones",
"enableNotifications": "Activar notificaciones",
"purgeRecords": "Eliminar registros",
"formReset": "Restablecer formulario",
"createMedication": "Crear medicamento",
"deleteConfirmDescription": "Este medicamento y todas sus tomas se eliminarán de forma permanente.",
"purgeConfirmTitle": "¿Eliminar todas las tomas?",
"purgeConfirmDescription": "Se eliminarán de forma permanente todas las tomas registradas para este medicamento.",
"saveError": "Error al guardar",
"deleteError": "Error al eliminar",
"purgeError": "Error al limpiar los registros",
"invalidTimestamp": "Selecciona una fecha y hora válidas.",
"noIntakesYet": "Aún no hay tomas registradas.",
"actions": "Acciones",
"pageInfo": "Página {page} de {total}",
"previousPage": "Página anterior",
"nextPage": "Página siguiente",
"loginRequiredIntakes": "Inicia sesión para ver el historial de tomas.",
"phaseConfig": "Fases de recordatorio",
"phaseConfigDescription": "Configura los momentos de los recordatorios.",
"phaseGreen": "Verde",
"phaseYellow": "Amarillo",
"phaseOrange": "Naranja",
"phaseRed": "Rojo",
"phaseMinutes": "Mín",
"phasePercent": "%",
"phaseBeforeEnd": "antes del final",
"phaseAfterEnd": "después del final",
"phaseResetDefaults": "Restablecer valores por defecto",
"phaseSaved": "Fases de recordatorio guardadas",
"phaseReset": "Restablecidas a valores por defecto",
"sourceWeb": "Web",
"sourceApi": "App de iOS",
"sourceReminder": "Recordatorio",
"sourceImport": "Importación",
"intakeSourceVia": "vía {origin}",
"intakeHistoryEmptyTitle": "Aún no hay tomas",
"intakeHistoryEmptyDescription": "En cuanto registres una toma, aparecerá aquí con la hora y la fuente.",
"intakeHistoryEmptyAction": "Registrar toma",
"intakeHistoryColTaken": "Tomada",
"intakeHistoryColScheduled": "Programada",
"intakeHistoryColStatus": "Estado",
"intakeHistoryColSource": "Fuente",
"intakeHistoryStatusTaken": "Tomada",
"intakeHistoryStatusSkipped": "Omitida",
"intakeHistorySortByTaken": "Ordenar por hora de toma",
"intakeHistorySortByScheduled": "Ordenar por hora programada",
"intakeHistoryPageInfo": "Página {page} de {total} · {count} entradas",
"intakeHistoryPrev": "Anterior",
"intakeHistoryNext": "Siguiente",
"unitDrops": "gotas",
"unitTablets": "comprimidos",
"unitCapsules": "cápsulas",
"unitPieces": "unidades",
"namePlaceholder": "p. ej. Ramipril",
"dosePlaceholder": "p. ej. 5 mg",
"labelPlaceholder": "p. ej. Por la mañana",
"defaultDose": "Dosis estándar",
"dayDeactivate": "Desactivar {day}",
"dayActivate": "Activar {day}",
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatida"
},
"semaglutide": {
"name": "Semaglutida"
},
"liraglutide": {
"name": "Liraglutida"
},
"dulaglutide": {
"name": "Dulaglutida"
},
"exenatide": {
"name": "Exenatida"
}
}
},
"researchMode": {
"dialog": {
"title": "Activar el modo Investigación",
"intro": "El modo Investigación añade un gráfico estimado del nivel de fármaco a tu página de GLP-1. Lee el límite a continuación antes de activarlo: el gráfico es una ayuda de aprendizaje, nunca una medición, nunca un consejo médico.",
"whatItIsHeader": "Qué es esto",
"whatItIs": "Una curva en diente de sierra que simula la superposición de tus dosis registradas a lo largo del tiempo, usando el modelo de Bateman de un compartimento con los parámetros de absorción y semivida publicados en el EPAR de la EMA de cada agonista GLP-1 aprobado. El eje vertical es adimensional y sin etiquetas. La forma, no el número, es lo que muestra el gráfico.",
"whatItIsntHeader": "Qué no es",
"whatItIsnt": "No es un nivel en sangre. No es una medición. No es una predicción de cómo responde realmente tu cuerpo. No es base para ninguna decisión de dosis, tiempo o escalado. Para cualquier cosa que afecte cómo tomas tu medicación, habla con tu médico prescriptor.",
"whyEstimateHeader": "Por qué es una estimación",
"whyEstimate": "La farmacocinética poblacional describe al paciente típico. La variación individual es grande: el modelo Schneck/Urva 2024 de tirzepatida reporta aproximadamente un 22 % de variabilidad interindividual en la absorción y aproximadamente un 49 % en el volumen de distribución. Una curva de manual no puede capturar tu peso, tu función renal, tu técnica de inyección ni la precisión de tus horarios. Lee la curva como el ritmo de tu dosificación, no como tu nivel.",
"mdrBoundaryHeader": "Límite regulatorio",
"mdrBoundary": "HealthLog muestra datos regulatorios públicos y tus propios registros. La aplicación no predice, no diagnostica, no trata y no recomienda ninguna terapia. El Reglamento UE 2017/745 (Medical Device Regulation, MDR) y el documento de orientación MDCG 2021-24 trazan la línea con el software que interpreta datos con fines médicos: este gráfico se queda decididamente del lado educativo de esa línea. Si en algún momento sientes que te empuja hacia una decisión clínica, ciérralo.",
"citationsHeader": "Fuentes",
"citations": "European Public Assessment Reports de la EMA para Mounjaro, Ozempic, Wegovy, Saxenda, Trulicity, Byetta y Bydureon (Sección 5.2). Schneck K, Urva S. Population pharmacokinetics of the GIP/GLP receptor agonist tirzepatide. CPT Pharmacometrics Syst Pharmacol 2024;13(3):494-503 (DOI 10.1002/psp4.13099).",
"versionLine": "Versión del disclaimer: {version}",
"acknowledgeCta": "Entiendo — activar",
"cancelCta": "Cancelar",
"successToast": "Modo Investigación activado. La curva de nivel de fármaco es ahora visible en tu página de GLP-1.",
"errorToast": "No se pudo activar el modo Investigación. Inténtalo de nuevo.",
"staleVersionToast": "El disclaimer se actualizó desde que cargó esta página. Recarga para leer la versión actual."
},
"chart": {
"title": "Nivel de fármaco estimado",
"axisLabel": "Nivel estimado (relativo)",
"emptyState": "Sin tomas registradas todavía.",
"emptyStateCta": "Registra una dosis para ver la curva estimada cobrar forma.",
"estimateNote": "Estimación educativa a partir de la farmacocinética poblacional publicada por la EMA. No es una medición.",
"unknownDrug": "{name} no está en el catálogo de GLP-1 aprobado por la EMA, por lo que HealthLog no puede trazar una curva de farmacocinética poblacional."
}
},
"detail": {
"status": {
"active": "Active",
"paused": "Paused",
"ended": "Ended"
},
"today": {
"groupLabel": "Today's dose",
"taken": "Taken",
"skipped": "Skipped",
"toastTaken": "Today's dose logged",
"toastSkipped": "Today's dose skipped",
"recordedTaken": "Taken today at {time}",
"recordedSkipped": "Skipped today at {time}",
"recordedOneShot": "One-shot dose taken at {time}",
"noneScheduled": "No dose scheduled for today.",
"pausedHint": "Paused — no reminder today.",
"error": "Could not log the dose."
},
"cadence": {
"oneShotOn": "One-time dose on {date}.",
"oneShotPending": "One-time dose pending."
},
"intake": {
"title": "Intake history",
"importButton": "Import",
"rowActions": {
"openMenu": "Open row actions",
"edit": "Edit",
"delete": "Delete"
},
"selection": {
"rowToggleLabel": "Select row"
},
"bulkDelete": {
"selectionCount": "{count} entries selected",
"deleteButton": "Delete selection",
"cancelButton": "Cancel",
"confirmTitle": "Delete the selected entries?",
"confirmBody": "{count} entries will be removed permanently. The medication itself stays.",
"confirmAction": "Delete",
"toast": "Selection deleted",
"failed": "Could not delete the selection."
},
"edit": {
"dialogTitle": "Edit intake",
"takenAtLabel": "Taken at",
"skippedLabel": "Skipped",
"noteLabel": "Note",
"save": "Save",
"cancel": "Cancel",
"savedToast": "Intake updated",
"failed": "Could not update the intake."
},
"deleteRow": {
"confirmTitle": "Delete this intake?",
"confirmBody": "The entry is removed permanently.",
"confirmAction": "Delete",
"toast": "Intake deleted",
"failed": "Could not delete the intake."
}
},
"notifications": {
"title": "Notifications",
"switchLabel": "Send a reminder when this dose is due",
"helperOn": "Reminders are on.",
"helperOff": "Reminders are off.",
"enabledToast": "Reminders on",
"disabledToast": "Reminders off",
"toggleFailed": "Could not change the reminder setting.",
"clientManagedChip": "Your iPhone manages reminders for this medication."
},
"settings": {
"title": "Settings",
"phases": {
"openButton": "Configure phases",
"requiresCourseWindow": "Phases are available once a course window is set."
},
"grace": {
"label": "Reminder window — applies to your primary schedule",
"primaryScheduleNote": "Multi-schedule medications keep their other schedules' default window.",
"unit": "minutes",
"saved": "Reminder window saved",
"failed": "Could not save the reminder window."
},
"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": "Manage & danger zone",
"pause": {
"title": "Pause",
"helper": "Pause reminders until you turn them back on. History stays intact.",
"pausedToast": "Reminders paused",
"resumedToast": "Reminders resumed",
"failed": "Could not change the paused state."
},
"end": {
"title": "End medication",
"helper": "Stop reminders and mark the medication as ended. History stays visible.",
"button": "End",
"dialogTitle": "End {name} — stop reminders, history stays visible",
"dialogBody": "No more reminders. Old entries remain in the timeline.",
"toast": "Medication ended",
"failed": "Could not end the medication."
},
"purge": {
"title": "Delete history",
"helper": "{count} intake events are stored for this medication.",
"button": "Delete history",
"dialogTitle": "Really delete the history?",
"dialogBody": "The {count} intake events will be removed permanently. The medication itself stays.",
"toast": "History deleted",
"failed": "Could not delete the history."
},
"delete": {
"title": "Delete medication",
"helper": "Removes the medication and every related record.",
"button": "Delete",
"dialogTitle": "Delete {name}?",
"dialogBody": "The medication, its schedules, intake history, API tokens, phase config and reminders will be removed permanently.",
"toast": "Medication deleted",
"failed": "Could not delete the medication."
}
},
"phases": {
"modeLabel": "{phase} mode",
"saveFailed": "Could not save the reminder phases."
},
"api": {
"caption": "Endpoint for \"{name}\"",
"copyUrl": "Copy URL",
"urlCopied": "URL copied",
"mintToken": "Mint token",
"mintAnotherToken": "Mint another token",
"mintFailed": "Could not mint a token.",
"copyFailed": "Could not copy.",
"tokenCopied": "Token copied",
"copyToken": "Copy token",
"mintedHint": "Copy this token now — it is shown only once."
},
"edit": {
"planOption": "Editar plan",
"advancedOption": "Ajustes avanzados"
},
"advanced": {
"title": "Ajustes avanzados",
"group": {
"data": "Datos",
"reminders": "Recordatorios",
"lifecycle": "Ciclo de vida",
"externalApi": "API externa"
},
"dataPortability": {
"import": {
"title": "Importar tomas",
"helper": "Carga tomas anteriores desde un archivo JSON o JSON pegado.",
"button": "Importar JSON"
},
"export": {
"title": "Exportar medicamento",
"helper": "Descarga este medicamento como archivo CSV.",
"includeIntake": "Incluir historial de tomas",
"button": "Exportar CSV"
}
}
},
"header": {
"historyLabel": "Ver historial de tomas",
"advancedLabel": "Configuración avanzada"
},
"history": {
"back": "Volver al medicamento",
"subtitle": "Historial completo de tomas",
"plannedSuffix": "planificado"
}
},
"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.",
"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."
},
"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.",
"personalBaseline": "Tu media",
"deltaVsBaseline": "{delta} vs. tu media",
"deltaUnchanged": "coincide con tu media",
"deltaVsTarget": "{delta} vs. objetivo",
"weekdaysFull": {
"mon": "Lunes",
"tue": "Martes",
"wed": "Miércoles",
"thu": "Jueves",
"fri": "Viernes",
"sat": "Sábado",
"sun": "Domingo"
},
"rangeBand": "Rango"
},
"chart": {
"overlay": {
"controls": {
"title": "Capas de la gráfica",
"trendIndicator": "Tendencia 7 días",
"trendArrow": "Flecha de tendencia",
"targetRange": "Rango objetivo",
"comparisonBaseline": "Comparación",
"comparisonUnavailable": "Sin periodo anterior disponible",
"tooltip": {
"openSettings": "Ajustes de capas de gráfica"
}
}
}
},
"comparison": {
"toggleLabel": "Comparar con",
"toggleHint": "Compara el periodo actual con el mismo periodo del año anterior.",
"baseline": {
"none": "Desactivado",
"lastMonth": "Mes anterior",
"lastYear": "Año anterior"
},
"captionLastMonth": "vs. mes anterior",
"captionLastYear": "vs. año anterior",
"deltaVs": {
"lastMonth": "{delta} vs. mes anterior",
"lastYear": "{delta} vs. año anterior"
},
"tooltipPrior": "Periodo anterior",
"unavailable": {
"lastMonth": "Comparación no disponible — sin datos del mes anterior",
"lastYear": "Comparación no disponible — sin datos del año anterior"
},
"notAvailableForCompliance": "Comparación no disponible para el cumplimiento"
},
"insights": {
"noAnalysisYet": "Aún no hay análisis.",
"assessmentPreparing": "Preparando tu evaluació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",
"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": "Análisis no disponible.",
"startAnalysis": "Iniciar análisis",
"refreshAnalysis": "Actualizar análisis",
"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",
"confidence": "Confianza",
"confidenceAria": "Confianza: {value} de 100",
"confidenceHigh": "Confianza alta",
"confidenceMedium": "Confianza media",
"confidenceLow": "Confianza baja — pocos datos",
"confidenceDraft": "Borrador"
},
"dataFoundation": "Base de datos",
"dataGaps": "Vacíos de datos:",
"lastUpdated": "Última actualización",
"confidenceHoch": "Alta",
"confidenceMittel": "Media",
"confidenceGering": "Baja",
"loadError": "No se han podido cargar los análisis",
"heroGenerated": "Generado {time}",
"heroPersonalBaseline": "Basado en tus últimos 90 días",
"heroRegenerate": "Regenerar",
"heroRegenerating": "Generando",
"regenerateAnalysis": "Volver a iniciar el análisis",
"regenerateSuccess": "Análisis regenerado",
"warmAssessments": "Preparar evaluaciones",
"warmStarted": "Las evaluaciones se están preparando en segundo plano",
"heroFallbackSubtitle": "Una mirada diaria a tus tendencias — directamente de los datos que registras.",
"heroGreetingMorning": "Buenos días",
"heroGreetingAfternoon": "Buenas tardes",
"heroGreetingEvening": "Buenas noches",
"heroComingSoonTooltip": "Próximamente",
"heroActionAskCoach": "Preguntar al coach",
"healthScore": {
"label": "Puntuación de salud",
"progressAria": "Progreso de la puntuación de salud",
"deltaVsLastWeek": "{delta} respecto a la semana anterior",
"deltaUnavailable": "Aún no hay historial — vuelve la semana que viene.",
"componentBp": "PA",
"componentWeight": "Peso",
"componentMood": "Estado de ánimo",
"componentCompliance": "Cumplimiento",
"disclaimer": "Orientación — no es valoración médica.",
"deltaExplainer": {
"trigger": "¿Qué significa este cambio?",
"title": "Cómo se calcula el cambio",
"description": "Cambio respecto a la semana pasada: {delta}",
"body": "La puntuación combina PA, peso, ánimo y adherencia. Comparamos la puntuación de hoy con la del mismo momento de la semana anterior. Registra una medición nueva o una nota de ánimo para empujarla hacia arriba."
},
"provenance": {
"toggle": "Compuesto por",
"weightLabel": "peso",
"mixedBanner": "Algunos componentes combinan varias fuentes. El desglose muestra el valor más reciente por componente.",
"footnote": "Los pesos se reescalan según los datos realmente disponibles.",
"asOfLabel": "a fecha de {date}",
"provisional": "Provisional — sólo {count} de {total} entradas disponibles",
"provisionalBadge": "Provisional",
"sourceAria": "Fuente: {source}",
"sources": {
"manual": "Manual",
"withings": "Withings",
"appleHealth": "Apple Health",
"mixed": "Mixto",
"none": "Sin datos"
}
}
},
"suggestedPrompts": {
"label": "Pregúntame",
"whyMonday": "¿Por qué fue más alta mi tensión el lunes?",
"weightVsPulse": "¿Cómo ha afectado la pérdida de peso a mi pulso?",
"weekVsMonth": "Compara esta semana con el mes pasado",
"tellMyDoctor": "¿Qué debería contarle a mi médico?",
"medicationWorking": "¿Está funcionando mi medicamento?"
},
"dailyBriefing": {
"title": "Resumen del día",
"keyFindingsTitle": "Hallazgos clave",
"emptyTitle": "Aún no hay resumen",
"emptyDescription": "Genera el resumen de hoy para tener una vista rápida de tus tendencias.",
"emptyAction": "Generar resumen",
"loadingLabel": "Preparando el resumen"
},
"therapyTimeline": {
"title": "Historial de terapia GLP-1",
"description": "Lista cronológica: cambios de dosis, inyecciones, existencias y días con efectos secundarios.",
"empty": "Sin eventos GLP-1 en los últimos 90 días.",
"doseTo": "Dosis a",
"pens": "Plumas",
"sideEffects": "Efectos secundarios"
},
"trendsRow": {
"title": "Tendencias",
"subtitle": "Los últimos 30 días de un vistazo",
"caption": {
"bp": "Valores sistólicos y diastólicos de los últimos 30 días.",
"weight": "Evolución del peso corporal de los últimos 30 días.",
"pulse": "Pulso en reposo de los últimos 30 días.",
"mood": "Puntuación diaria del estado de ánimo de los últimos 30 días.",
"sleep": "Duración del sueño nocturno de los últimos 30 días.",
"steps": "Recuento diario de pasos de los últimos 30 días.",
"hrv": "Variabilidad de la frecuencia cardíaca de los últimos 30 días.",
"resting_hr": "Frecuencia cardíaca en reposo de los últimos 30 días.",
"active_energy": "Energía activa quemada en los últimos 30 días.",
"flights": "Pisos subidos en los últimos 30 días.",
"distance": "Distancia caminando y corriendo de los últimos 30 días.",
"vo2_max": "VO₂ máx de los últimos 30 días.",
"body_temp": "Temperatura corporal de los últimos 30 días."
}
},
"vo2Max": {
"statLatest": "Actual",
"statMin": "Mín",
"statMax": "Máx",
"empty": "Aún no hay datos de VO₂ máx — sincroniza Apple Health para llenar esta vista."
},
"trendAnnotation": {
"emptyBp": "Necesitamos más datos para comentar esta tendencia.",
"emptyWeight": "Necesitamos más datos para comentar esta tendencia.",
"emptyMood": "Necesitamos más datos para comentar esta tendencia.",
"confidenceHigh": "Confianza alta",
"confidenceModerate": "Confianza media",
"confidenceLow": "Confianza baja",
"pendingLabel": "Generando comentario de tendencia"
},
"range": {
"label": "Período",
"noPriorData": "sin datos del período anterior",
"option": {
"7d": "7d",
"30d": "30d",
"90d": "90d",
"1y": "1a"
},
"priorLabel": {
"7d": "vs 7d anteriores",
"30d": "vs 30d anteriores",
"90d": "vs 90d anteriores",
"1y": "vs año anterior"
},
"noChange": "sin cambios"
},
"correlationRow": {
"title": "Correlaciones",
"subtitle": "Hipótesis predefinidas, con umbral n ≥ 14 y p < 0,05",
"disclaimer": "Las correlaciones son observacionales, no causales — habla con tu médico si tu tensión es alta.",
"experimentCta": "Iniciar experimento de 7 días",
"experimentTooltip": "Próximamente",
"emptyTitle": "Necesitamos más datos para mostrar esta correlación",
"sourceChip": "basado en {n} mediciones pareadas · {window}",
"sourceWindowLast30": "Últimos 30 días",
"confidenceHigh": "Confianza alta",
"confidenceModerate": "Confianza media",
"confidenceLow": "Confianza baja",
"card": {
"bpComplianceTitle": "TA × cumplimiento medicación",
"bpComplianceSubtitle": "Sistólica diaria frente al % de cumplimiento",
"moodPulseTitle": "Ánimo × pulso en reposo",
"moodPulseSubtitle": "Estado de ánimo y pulso en reposo el mismo día",
"weightWeekdayTitle": "Peso × día de la semana",
"weightWeekdaySubtitle": "Peso agrupado por día de la semana"
}
},
"coach": {
"refusalOutOfScope": "Solo puedo ayudarte con los datos de salud de tu registro — mediciones, medicamentos, estado de ánimo, tendencias. Preguntas fuera de ese ámbito no las respondo.",
"refusalInjection": "Tu mensaje contiene instrucciones que pretenden sobrescribir mis indicaciones. Soy el coach de HealthLog y solo resumo tus propios datos de salud — reformula tu pregunta dentro de ese marco.",
"errorBudget": "Has alcanzado el límite diario del coach. El cupo se reinicia a medianoche (UTC).",
"errorProvider": "El coach no ha podido contactar con un proveedor de análisis ahora mismo. Inténtalo en un momento.",
"errorNetwork": "Sin conexión a Internet — inténtalo de nuevo cuando vuelvas a estar en línea.",
"tagline": "Coach personal de salud, apoyado en tus datos.",
"newChat": "Nueva conversación",
"send": "Enviar",
"thinking": "Pensando…",
"composerPlaceholder": "Pregúntame sobre tus datos…",
"composerHint": "Intro para enviar, Mayús+Intro para una nueva línea.",
"composerDisclaimer": "Las respuestas son generadas. Las decisiones clínicas las toma tu médico.",
"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",
"settingsExcludeLabel": "Excluir métricas",
"settingsExcludeHint": "El coach no verá los datos de las métricas seleccionadas.",
"settingsEvidenceLabel": "Mostrar evidencia por defecto",
"settingsEvidenceHint": "Abre automáticamente el cuadro de evidencias bajo cada respuesta.",
"settingsDefaultWindowLabel": "Periodo de análisis por defecto",
"settingsDefaultWindowHint": "El coach lee este periodo por chat, salvo que elijas otro en la cabecera del cajón.",
"settingsSave": "Guardar",
"settingsSaved": "Guardado.",
"settingsCancel": "Cancelar",
"feedbackHelpful": "Útil",
"feedbackUnhelpful": "Poco útil",
"feedbackThanks": "Gracias por la indicación.",
"dailyLimitTitle": "Límite diario alcanzado",
"dailyLimitBody": "Límite diario alcanzado; reinicio a las 00:00 UTC.",
"providerRateLimitTitle": "Proveedor con límite de tasa",
"providerRateLimitBody": "El proveedor está temporalmente saturado; reinicio en ~5 min.",
"settingsContextLabel": "Enviar contexto",
"settingsContextHint": "Bloques opcionales en los que el coach puede apoyarse. Si desactivas alguno, se omitirá en cada respuesta.",
"cluster": {
"cardio": {
"label": "Cardiovascular",
"hint": "Presión · pulso · VFC · FC en reposo y al caminar"
},
"body": {
"label": "Composición corporal",
"hint": "Peso · grasa · músculo · IMC"
},
"activity": {
"label": "Actividad",
"hint": "Pasos · energía · distancia · VO₂ máx"
},
"workouts": {
"label": "Entrenamientos",
"hint": "Carreras · paseos · sesiones"
},
"sleep": {
"label": "Sueño",
"hint": "Duración · fases"
},
"mood": {
"label": "Estado de ánimo",
"hint": "Registros diarios de ánimo"
},
"glucose": {
"label": "Glucosa",
"hint": "Lecturas en ayunas y posprandiales"
},
"medication": {
"label": "Medicación",
"hint": "Adherencia · contexto GLP-1"
},
"mobility": {
"label": "Movilidad y marcha",
"hint": "Estabilidad · asimetría · marcha"
},
"environment": {
"label": "Entorno",
"hint": "Ruido · luz del día · temp. piel"
}
},
"settingsClustersLabel": "Datos que ve el Coach",
"settingsClustersHint": "Elige qué grupos de datos puede leer el Coach. Más datos significan respuestas más ricas y un prompt mayor.",
"settingsClusterNoData": "Aún no hay datos",
"sourcesMemberCount": "{count} métricas"
},
"relativeJustNow": "ahora mismo",
"relativeMinutesAgoOne": "hace {count} minuto",
"relativeMinutesAgoOther": "hace {count} minutos",
"relativeHoursAgoOne": "hace {count} hora",
"relativeHoursAgoOther": "hace {count} horas",
"relativeDaysAgoOne": "hace {count} día",
"relativeDaysAgoOther": "hace {count} días",
"navOverview": "Resumen",
"navBloodPressure": "Presión arterial",
"navWeight": "Peso",
"navPulse": "Pulso",
"navMood": "Estado de ánimo",
"navMedication": "Medicamento",
"navBmi": "IMC",
"navSleep": "Sueño",
"navHrv": "VFC",
"navRestingHr": "FC reposo",
"navOxygenSaturation": "Oxígeno",
"navBodyTemperature": "Temperatura",
"navActiveEnergy": "Energía activa",
"navAriaLabel": "Saltar a sección",
"tabStrip": {
"vitalsParent": {
"label": "Vitales",
"header": "Constantes vitales"
},
"bodyParent": {
"label": "Cuerpo",
"header": "Composición corporal"
},
"activityParent": {
"label": "Actividad",
"header": "Actividad y movilidad"
},
"cardiovascularParent": {
"label": "Cardiovascular",
"header": "Marcadores cardiovasculares"
},
"hearingParent": {
"label": "Audición",
"header": "Audición y exposición sonora"
},
"environmentParent": {
"label": "Entorno",
"header": "Entorno"
},
"metabolicParent": {
"label": "Metabólico",
"header": "Metabólico"
}
},
"hrv": {
"title": "VFC",
"description": "Variabilidad de la frecuencia cardíaca a lo largo del tiempo — señal de recuperación del sistema nervioso, captada por la noche por Apple Watch y otros wearables compatibles.",
"chartTitle": "Variabilidad de la frecuencia cardíaca",
"emptyState": {
"title": "Aún no hay valores de VFC",
"description": "Los valores de VFC aparecerán aquí en cuanto Apple Watch (o un dispositivo Withings compatible) sincronice las mediciones nocturnas."
}
},
"restingHr": {
"title": "FC en reposo",
"description": "El nivel basal diario del corazón — distinto del pulso puntual de la página de pulso. Apple Salud aporta un valor al día.",
"chartTitle": "Frecuencia cardíaca en reposo",
"emptyState": {
"title": "Aún no hay FC en reposo",
"description": "La FC en reposo aparece cuando Apple Watch o un Withings compatible ha llevado puesto un día tranquilo."
}
},
"oxygenSaturation": {
"title": "Saturación de oxígeno",
"description": "Oxígeno en sangre (SpO₂) — rango clínico normal 95–100 %, con zonas objetivo sombreadas en el gráfico.",
"chartTitle": "Saturación de oxígeno",
"emptyState": {
"title": "Aún no hay muestras de SpO₂",
"description": "Las muestras de SpO₂ llegan aquí en cuanto un wearable compatible (Apple Watch, Withings ScanWatch) capture una lectura."
}
},
"bodyTemperature": {
"title": "Temperatura corporal",
"description": "Tendencia de temperatura corporal central en grados Celsius. La temperatura cutánea de Withings vive en una métrica distinta.",
"chartTitle": "Temperatura corporal",
"emptyState": {
"title": "Aún no hay temperatura corporal",
"description": "Registra una lectura o deja que tu wearable sincronice una — la tendencia aparecerá aquí.",
"cta": "Registrar temperatura corporal"
}
},
"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": {
"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",
"therapyTimelineDescription": "Protocolo cronológico de terapia GLP-1 — cambios de dosis, inyecciones, existencias, efectos secundarios.",
"bmiDescription": "IMC derivado de tu peso y altura, con valoración.",
"target": {
"range": "Objetivo: {min}–{max} {unit}",
"bpRange": "Objetivo: {sysMin}–{sysMax} / {diaMin}–{diaMax} {unit}",
"inTargetShare": "{pct}% de los días registrados dentro del objetivo",
"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."
},
"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"
},
"sleep": {
"title": "Sueño",
"description": "Desglose por fases y duración nocturna, tomados de Apple Health.",
"headlineTitle": "Media por noche",
"headlineCaption": "Promediado sobre {count} noches — {suffix}",
"headlineCaptionSuffix": "por noche",
"compositionTitle": "Distribución de fases",
"compositionSubtitle": "Últimas {nights} noches",
"compositionAriaLabel": "Distribución de fases del sueño en {nights} noches",
"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"
}
},
"correlations": "Correlaciones",
"medicationCompliance": "Cumplimiento de medicación",
"dayStreak": "{count} días 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",
"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",
"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",
"emptyState": {
"title": "Aún no hay datos de glucosa",
"description": "Las lecturas de glucosa aparecen aquí cuando registras una o un dispositivo sincroniza."
}
},
"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)"
},
"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"
}
}
},
"thresholds": {
"defaultLabel": "Por defecto",
"autoModeLabel": "Auto",
"overrideModeLabel": "Personalizado",
"overrideToggleLabel": "Valores propios",
"resetAction": "Restablecer valor por defecto",
"resetAllAction": "Restablecer todos los valores",
"minLabel": "Mín",
"maxLabel": "Máx",
"unitSuffix": "({unit})",
"outOfBoundsHint": "Rango permitido: {min}–{max} {unit}",
"overrideWarning": "Los valores fuera de las guías clínicas pueden dar objetivos poco saludables. Personaliza solo tras consultar con tu médico.",
"saveSuccess": "Objetivos actualizados",
"saveError": "No se han podido guardar los objetivos",
"resetSuccess": "Restablecido al valor por defecto",
"sourceOverride": "Valor propio",
"metricWeight": "Peso",
"metricBpSys": "Tensión arterial (sistólica)",
"metricBpDia": "Tensión arterial (diastólica)",
"metricPulse": "Pulso en reposo",
"metricBodyFat": "Grasa corporal",
"metricSleep": "Duración del sueño",
"metricSteps": "Pasos/día",
"metricGlucoseFasting": "Glucemia — en ayunas",
"metricGlucosePostprandial": "Glucemia — posprandial",
"metricGlucoseRandom": "Glucemia — cualquiera",
"metricGlucoseBedtime": "Glucemia — antes de dormir",
"metricBodyWater": "Agua corporal",
"metricBoneMass": "Masa ósea",
"metricOxygenSaturation": "Saturación de oxígeno (SpO₂)",
"unsetExplanation": "Sin valor propio — se aplica el valor por defecto calculado."
},
"onboarding": {
"errorGeneric": "Algo ha salido mal al finalizar la configuración. Inténtalo de nuevo.",
"tour": {
"stepOf": "Paso {current} de {total}",
"next": "Siguiente",
"back": "Atrás",
"skip": "Saltar tour",
"done": "Entendido",
"restart": "Reiniciar tour",
"restartHint": "Vuelve a mostrar el tour del panel la próxima vez.",
"restartConfirmation": "El tour se reiniciará en tu próxima visita al panel.",
"steps": {
"tileStrip": {
"title": "Tus valores del día",
"body": "La fila de tarjetas muestra el último valor y la tendencia de 7 días de cada métrica — peso, tensión arterial, pulso, ánimo. Oculta lo que no necesites en Ajustes → Panel."
},
"quickAdd": {
"title": "Registrado en dos toques",
"body": "Con el botón Añadir puedes registrar mediciones o entradas de ánimo sin salir del panel. El formulario recuerda tu último contexto y etiquetas."
},
"insights": {
"title": "Insights automáticos",
"body": "Insights convierte tus valores en un resumen claro de salud, con interpretación de tensión arterial, peso y ánimo. Clave propia o por defecto — tú eliges."
},
"integrations": {
"title": "Conectar dispositivos",
"body": "En Ajustes conectas Withings (sincronización automática de peso, tensión y pulso), moodLog o tu proveedor de análisis. Todo es opcional y queda cifrado."
},
"achievements": {
"title": "Acumula rachas e insignias",
"body": "La página de Logros lleva la cuenta de rachas de registro diario, hitos de tensión arterial e insignias de constancia. Un pequeño empujón para no abandonar."
}
}
},
"shell": {
"back": "Atrás",
"skip": "Omitir",
"next": "Continuar",
"step1of4": "Paso 1 de 4",
"step2of4": "Paso 2 de 4",
"step3of4": "Paso 3 de 4",
"step4of4": "Paso 4 de 4"
},
"goals": {
"title": "¿Qué te gustaría registrar?",
"body": "Elige las áreas que te interesan. El panel y los recordatorios se ajustarán a tu elecció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, tú decides.",
"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"
},
"appleHealth": {
"title": "Apple Health",
"body": "Los datos del iPhone y el Apple Watch llegan a través de la app de HealthLog para iOS.",
"badge": "Con la v1.5 (iOS)",
"disabledHint": "Disponible cuando se publique la app de iOS."
}
},
"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"
},
"welcomeBack": {
"title": "Bienvenido de nuevo",
"body": "Ya completaste la configuración inicial. Para cambiar algo, abre Ajustes — todo lo que configuraste se puede editar desde ahí.",
"cta": "Abrir el panel"
},
"welcome": {
"title": "Bienvenido a HealthLog",
"carouselLabel": "Carrusel de bienvenida",
"slideOf": "Diapositiva {current} de {total}",
"prevSlide": "Diapositiva anterior",
"nextSlide": "Diapositiva siguiente",
"gotoSlide": "Ir a la diapositiva {index}",
"cta": "Empezar",
"slide1": {
"title": "Registra cada señal",
"body": "Peso, presión, glucosa, sueño, ánimo — todo en un único registro que es tuyo."
},
"slide2": {
"title": "Conecta tus fuentes",
"body": "Sincroniza con Apple Health y Withings o añade datos a mano. Tus datos se quedan en tu servidor."
},
"slide3": {
"title": "Descubre los patrones",
"body": "Resúmenes diarios, gráficas de tendencias y un coach que destaca lo que cambió — todo en tu propio dispositivo."
}
}
},
"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",
"withingsTitle": "Conectar Withings (opcional)",
"withingsDescription": "Sincroniza peso, tensión arterial y pulso automáticamente desde tus dispositivos Withings.",
"withingsCta": "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": "Settings sections"
},
"sections": {
"account": {
"title": "Cuenta",
"description": "Profile, password, passkeys, and your onboarding tour."
},
"integrations": {
"title": "Integraciones",
"description": "Withings, moodLog, and other connected services."
},
"notifications": {
"title": "Notificaciones",
"description": "Live overview of every configured channel."
},
"dashboard": {
"title": "Panel",
"description": "Tile layout and order."
},
"thresholds": {
"title": "Objetivos",
"description": "Por métrica: tu propio rango objetivo de valores saludables."
},
"sources": {
"title": "Fuentes",
"description": "Elige qué fuente prevalece cuando varias registran la misma métrica el mismo día.",
"cardTitle": "Prioridad de fuentes por métrica",
"help": "Cuando más de una fuente entrega el mismo valor el mismo día (p. ej. Withings y Apple Health informan ambos 1200 pasos), la fuente superior cuenta como la lectura canónica. Las demás fuentes 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."
},
"sourceLabels": {
"WITHINGS": "Withings",
"APPLE_HEALTH": "Apple Health",
"MANUAL": "Entrada manual",
"IMPORT": "Importar"
},
"deviceLabels": {
"watch": "Reloj",
"band": "Pulsera",
"ring": "Anillo",
"phone": "Teléfono",
"scale": "Báscula",
"other": "Otro",
"unknown": "Desconocido"
}
},
"ai": {
"title": "AI Insights",
"description": "Provider, model, key."
},
"api": {
"title": "API & Tokens",
"description": "Bearer tokens for your own scripts and apps — log measurements or medication intake from anywhere."
},
"advanced": {
"title": "Avanzado",
"description": "Activador opt-in del modo Investigación y zona de peligro para borrar irrevocablemente todos los registros de salud."
},
"export": {
"title": "Exportar",
"description": "Download your health data as PDF, CSV, or a full JSON backup.",
"otherOptionsHeading": "Otras opciones de exportación",
"hero": {
"eyebrow": "Cita médica",
"valueStatement": "Un informe PDF imprimible para tu cita médica — constantes, IMC, clasificación de la tensión, cumplimiento de la medicación y (opcionalmente) el estado de ánimo, en pocas páginas.",
"cta": "Configurar y generar informe",
"formatHint": "PDF · listo para imprimir"
},
"actions": {
"download": "Download"
},
"filters": {
"since": "Desde",
"until": "Until"
},
"cards": {
"doctorReport": {
"title": "Doctor Report",
"description": "Printable PDF for the doctor's appointment — vitals, BMI, BP classification, medication compliance, mood."
},
"measurementsCsv": {
"title": "Measurements",
"description": "Weight, blood pressure, pulse, glucose, and every other measurement as comma-separated values."
},
"medicationsCsv": {
"title": "Medicamentos",
"description": "Your medication list with dosage, schedules, and (optionally) the full intake history.",
"includeIntake": "Include intake history"
},
"moodCsv": {
"title": "Estado de ánimo",
"description": "Daily mood entries with score, tags, and timestamps."
},
"fullBackup": {
"title": "Full backup",
"description": "Single JSON file with everything — same shape as the weekly auto-backup. Useful for self-restore via admin upload."
}
}
},
"about": {
"title": "About",
"description": "Version, license, links."
}
},
"profile": "Perfil",
"language": "Idioma",
"languageDescription": "Choose the display language of the application.",
"username": "Nombre de usuario",
"height": "Height (cm)",
"dateOfBirth": "Fecha de nacimiento",
"dateOfBirthHint": "Used for automatic blood pressure target calculations.",
"gender": "Sexo",
"genderNone": "Not specified",
"genderMale": "Hombre",
"genderFemale": "Mujer",
"genderHint": "Used for gender-specific target values.",
"timezone": "Zona horaria",
"timezoneHint": "Used for chart axis labels, reminder times, export timestamps, and Coach context. Stored data is unchanged.",
"timezoneInvalid": "Not a valid IANA timezone.",
"profileSaved": "Profile saved",
"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": "Change password",
"changePasswordDescription": "Replace your current password with a new one.",
"passwordReset": "Password reset",
"currentPassword": "Current password",
"newPassword": "New password",
"confirmNewPassword": "Confirm new password",
"passwordMismatch": "New passwords do not match",
"passwordUpdated": "Password updated successfully",
"passkeys": "Passkeys",
"registeredPasskeys": "Registered Passkeys",
"passkeysDescription": "Passkeys allow secure login without a password.",
"passkeyName": "Nombre",
"passkeyDevice": "Device",
"passkeyBackup": "Backup",
"passkeyCreated": "Created",
"passkeyActions": "Acciones",
"noPasskeys": "No passkeys registered.",
"addPasskey": "Add passkey",
"passkeyAdded": "Passkey added successfully!",
"passkeyOptionsError": "Could not load passkey options",
"passkeyRegistrationFailed": "Passkey registration failed",
"passkeyRegistrationCancelled": "Passkey registration cancelled",
"passkeyNotSupported": "Your browser or device doesn't support passkeys yet. Try a different browser or device.",
"passkeyAlreadyRegistered": "This device is already registered as a passkey for your account.",
"passkeySecurityBlocked": "Your browser blocked the passkey request for security reasons. Make sure you're on a trusted HTTPS origin and try again.",
"passkeyTimeout": "The passkey prompt timed out. Please try again.",
"passkeyUnknownError": "Passkey registration failed: {message}",
"deletePasskey": "Delete passkey?",
"deletePasskeyDescription": "The passkey will be permanently deleted.",
"singleDevice": "Single device",
"multiDevice": "Multi-device",
"backedUp": "backed up",
"telegram": "Telegram Notifications",
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
"telegramSaved": "Telegram settings saved",
"botToken": "Bot Token",
"chatId": "Chat ID",
"enableNotifications": "Enable notifications",
"testMessage": "Test message",
"testSent": "Test message sent!",
"telegramStep1": "1. Create a bot via @BotFather in Telegram and copy the token.",
"telegramStep2": "2. Send /start to your bot to activate the chat.",
"telegramStep3": "3. Find your Chat ID via @userinfobot or the Bot API.",
"ntfy": "ntfy",
"ntfyDescription": "Notifications via ntfy (self-hosted or ntfy.sh).",
"ntfyEnable": "Enable ntfy",
"ntfyServer": "Server URL",
"ntfyTopic": "Topic",
"ntfyAuthToken": "Auth Token (optional)",
"ntfyAuthTokenHint": "Only needed for private topics with access control.",
"webPush": "Browser Push",
"webPushDescription": "Receive notifications directly in your browser, even when HealthLog is not open.",
"webPushNotSupported": "Your browser does not support push notifications.",
"webPushDenied": "Push notifications are blocked. Allow them in your browser settings.",
"webPushNotConfigured": "Web Push is not configured on the server.",
"webPushSubscribe": "Enable push",
"webPushUnsubscribe": "Disable push",
"webPushSubscribed": "Push notifications enabled!",
"webPushUnsubscribed": "Push notifications disabled.",
"webPushSubscribeFailed": "Activation failed",
"webPushActive": "Activo",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic evaluations in Insights.",
"codexConnected": "ChatGPT connected successfully! Insights are now active.",
"codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
"rawData": "Send raw data",
"rawDataOnDescription": "Aggregated metrics plus anonymized raw points from the last 30 days are sent. This includes per-metric measurements (for example weight, blood pressure, pulse) with time context so the provider can detect patterns, outliers, and correlations more reliably. Name, email, and direct account identifiers are not transmitted.",
"rawDataOffDescription": "Only summarized metrics are sent (for example averages, trends, minimum/maximum). No individual points and no exact time context. This is more privacy-preserving, but the provider can be less precise for short-term patterns and fluctuations.",
"rawDataWarning": "Raw mode enabled: the provider receives additional anonymized points from the last 30 days for higher analysis accuracy.",
"regenerateInsights": "Regenerate reports",
"regenerateSuccess": "Reports regenerated successfully",
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated",
"ai": {
"chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin provider active",
"connectionExpiredBadge": "Connection expired",
"connectedSince": "Connected since {when}.",
"deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:",
"deviceCodeStep3": "Approve the connection — this page updates automatically.",
"deviceCodeCopy": "Copiar",
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Cancelar",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
"modelLabel": "Model",
"modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name",
"anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})",
"savedShort": "(saved)",
"saveCta": "Guardar",
"saved": "Guardado",
"saveFailed": "Save failed",
"errorGeneric": "Error",
"providerChain": {
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)",
"anthropic": "Anthropic (Claude)",
"local": "Local model",
"admin-openai": "Admin OpenAI"
},
"title": "Fallback chain",
"description": "If the primary provider fails, HealthLog walks the chain in order. Drag the rows to reorder, toggle the switch to disable a provider without removing it.",
"moveUp": "Move up",
"moveDown": "Move down",
"removeFromChain": "Remove from chain",
"addProvider": "Add provider",
"addNoneAvailable": "All providers already in chain",
"saveOrder": "Save chain order",
"saved": "Chain saved",
"saveFailed": "Saving the chain failed",
"resetDefaults": "Reset to defaults",
"resetConfirmTitle": "Reset chain to defaults?",
"resetConfirmBody": "The chain reverts to Codex → OpenAI → Anthropic → Local → Admin OpenAI. Your saved credentials are not touched."
},
"activeProviderHeading": "Active provider",
"activeProviderBody": "Pick the provider you want to use first. The form below configures only the selected provider; the fallback chain at the bottom decides what happens if it fails.",
"activeProviderLabel": "Primary provider",
"providerConfigTitle": "Provider configuration",
"providerSelect": {
"codex": "ChatGPT account (Codex)",
"openai": "OpenAI (your API key)",
"anthropic": "Anthropic (Claude)",
"local": "Local model (OpenAI-compatible)",
"admin-openai": "Admin-provided OpenAI"
},
"openai": {
"modelSelect": "Model",
"modelOptionCustom": "Custom slug…",
"modelCustomLabel": "Custom model slug",
"modelCustomPlaceholder": "gpt-5",
"baseUrlLabel": "Base URL (advanced)",
"baseUrlPlaceholder": "https://api.openai.com/v1",
"baseUrlHelp": "Override only when using an OpenAI-compatible gateway. Leave blank for OpenAI itself.",
"showAdvanced": "Show advanced",
"hideAdvanced": "Hide advanced",
"apiKey": "API key",
"apiKeyPlaceholder": "sk-…"
},
"codex": {
"statusConnected": "Connected",
"statusDisconnected": "Not connected",
"statusExpired": "Connection expired",
"connectButton": "Connect with ChatGPT",
"disconnectButton": "Disconnect",
"modelSlugLabel": "Model slug",
"modelSlugBody": "Codex uses the model your ChatGPT subscription routes to. The CODEX_MODEL environment variable lets ops override this on the instance.",
"lastInsight": "Last insight: {when}"
},
"adminOpenai": {
"title": "Admin OpenAI",
"body": "Operator-provided OpenAI key. Used as a last-ditch fallback when no personal provider is configured. There is nothing to configure on this row — visibility means the operator has set it up.",
"notConfigured": "The operator has not configured a shared OpenAI key on this instance."
},
"testProvider": "Test active provider",
"testSuccess": "OK — {provider} ({model})",
"testFailedShort": "Test failed: {message}",
"disableCoach": {
"title": "Ocultar el Coach",
"description": "Oculta el botón del Coach y el panel en todas las páginas.",
"toggleAria": "Ocultar el botón del Coach y el panel",
"savedHidden": "Coach oculto.",
"savedShown": "Coach visible.",
"saveError": "No se pudo guardar el cambio. Inténtalo de nuevo."
}
},
"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": "Connect your Withings scale and blood pressure monitors.",
"withingsCredentials": "API Credentials",
"withingsClientId": "Client ID",
"withingsClientSecret": "Client Secret",
"withingsCredentialsSaved": "Credentials saved",
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials",
"configured": "Configured",
"withingsSync": "Sync now",
"withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?",
"withingsFullSyncDescription": "All available Withings data will be fully synchronized. This may take some time depending on your history.",
"withingsSyncResult": "{count} measurements synchronized",
"withingsFullSyncResult": "{count} measurements fully synchronized",
"withingsSyncFailed": "Sync failed",
"withingsSynchronize": "Synchronize",
"withingsDisconnect": "Disconnect",
"withingsDisconnectTitle": "Disconnect Withings?",
"withingsDisconnectDescription": "The connection to Withings will be disconnected. Previously synced data will be preserved.",
"withingsConnect": "Connect with Withings",
"withingsNoCredentials": "Please enter your API credentials above to connect Withings.",
"integrations": {
"withings": {
"reconnect": {
"banner": {
"title": "Activity sync available",
"body": "Your Withings connection was authorised before activity sync was added. Reconnect once to enable steps, active energy, walking + running distance, and floors-climbed ingest from your Withings devices.",
"action": "Reconnect Withings"
}
}
}
},
"integrationPill": {
"connected": "Conectado",
"errorReconnect": "Error — reconectar",
"warningServerError": "Conectado, error del servidor",
"parkedReconnect": "Pausado — reconectar manualmente",
"notConnected": "No conectado",
"justNow": "just now",
"minutesAgo": "{count} min ago",
"hoursAgo": "{count} h ago",
"daysAgo": "{count} d ago",
"ariaLabel": "Integration status",
"resumeCta": "Reconectar",
"resumeSuccess": "Integración reanudada",
"resumeError": "Reconexión fallida"
},
"apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
"tokenRevokeDescription": "The token will be permanently deactivated. Applications using it will lose access.",
"tokenRevoked": "Revoked",
"tokenExpired": "Expired",
"tokenActive": "Activo",
"activeTokensTitle": "Active tokens",
"revokedTokensTitle": "Revoked tokens ({count})",
"tokenTableName": "Nombre",
"tokenTablePermissions": "Permissions",
"tokenTableStatus": "Estado",
"tokenTableCreated": "Created",
"tokenTableLastUsed": "Last used",
"tokenTableActions": "Acciones",
"noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never",
"apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method",
"apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example",
"collapse": "Collapse",
"expand": "Expand",
"dangerZone": "Delete All Data",
"dangerZoneTitle": "Danger zone",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?",
"dangerZoneConfirmDescription": "This will permanently delete all your health data and integrations. Your user account will be preserved.",
"dangerZoneSuccess": "All personal data has been deleted",
"dangerZoneDeleteFailed": "Deletion failed",
"finalDelete": "Delete permanently",
"deleteAccountCardTitle": "Delete account entirely",
"deleteAccountCardDescription": "Deletes your account along with passkeys, audit log, and sessions. This cannot be undone.",
"deleteAccountCta": "Delete account",
"deleteAccountConfirmTitle": "Delete account permanently?",
"deleteAccountConfirmDescription": "Your account, all health data, passkeys, sessions, and audit entries will be permanently deleted. You will be signed out immediately after.",
"deleteAccountSuccess": "Account deleted — signing you out.",
"deleteAccountFailed": "Account could not be deleted",
"deleteAccountFinal": "Delete permanently",
"saved": "Guardado",
"savingError": "Error saving",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL",
"moodLogUrlPlaceholder": "https://mood.example.com",
"moodLogApiKey": "API Key",
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Webhook Secret",
"moodLogWebhookSecretHelp": "Enter this secret in moodLog as webhook secret",
"moodLogSync": "Start sync",
"moodLogFullSync": "Full sync",
"moodLogFullSyncConfirm": "Synchronize fully",
"moodLogFullSyncTitle": "Full sync?",
"moodLogFullSyncDescription": "All available mood data will be fully synchronized.",
"moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
"moodLogSaved": "moodLog connection saved",
"moodLogDisconnected": "moodLog disconnected",
"about": {
"version": "App version",
"gitSha": "Build",
"builtAt": "Built {time}",
"builtAtLabel": "Built",
"license": "License",
"repository": "Source code",
"changelog": "Changelog",
"docs": "Documentation",
"linksHeading": "Fuentes y documentación",
"newerAvailable": "Nueva versión: {tag}",
"tourReplay": "Volver a ver el recorrido",
"tourReplayHint": "Mira el recorrido del panel — útil si lo saltaste en la primera visita."
},
"testConnection": {
"test": "Test connection",
"testing": "Testing…",
"ok": "Connected (latency {latency} ms)",
"errors": {
"credentials_rejected": "Credentials rejected — check your token",
"rate_limited": "Rate-limited by the upstream",
"timeout": "Request timed out",
"upstream_error": "Upstream returned an error",
"connection_failed": "Connection failed",
"not_configured": "Not configured",
"url_not_public": "URL is not a public endpoint",
"url_invalid": "URL is invalid",
"redirected": "Endpoint redirects — check the URL",
"endpoint_not_found": "Endpoint not found at the URL",
"credentials_unreadable": "Credentials cannot be decrypted",
"upstream_invalid_json": "Upstream sent invalid JSON",
"vapid_not_configured": "Web Push not configured (VAPID keys missing)",
"rate_limited_self": "Too many test requests",
"generic": "Test failed"
}
},
"notificationStatus": {
"title": "Channel reliability",
"description": "Live status of every notification channel — Auto-disabled means HealthLog stopped retrying after a permanent error.",
"emptyDescription": "No channels configured yet. Add a channel below to start tracking its delivery health.",
"stateActive": "Activo",
"stateAutoDisabled": "Auto-disabled",
"stateSendingPaused": "Sending paused",
"stateManuallyDisabled": "Desactivado",
"lastSuccess": "Last successful send",
"lastFailure": "Last failure",
"consecutiveFailures": "Consecutive failures",
"disabledReason": "Reason",
"nextRetry": "Next retry",
"reEnable": "Re-enable",
"sendTest": "Send test"
},
"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})."
},
"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."
},
"admin": {
"title": "Administration",
"subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings",
"systemStatus": "System Status",
"database": "Database",
"databaseConnected": "Connected",
"databaseError": "Error",
"startedAt": "Started",
"users": "Users",
"measurementsCount": "Measurements",
"activeTokens": "Active API Tokens",
"activeSessions": "Active Sessions",
"loadingStatus": "Loading status...",
"systemStatusLoadError": "Failed to load system status.",
"systemStatusRetry": "Reintentar",
"adminSettingsLoadError": "Failed to load admin settings. Toggles below may not reflect the live state — refresh the page.",
"hostMetrics": {
"title": "Host load",
"load1": "Load (1m)",
"memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O",
"last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page."
},
"aiQuality": {
"title": "Insights Quality",
"loading": "Loading feedback summary...",
"loadError": "Failed to load Insights quality summary. Try refreshing the page.",
"empty": "No feedback yet. The aggregator runs daily at 04:00 — once users start rating recommendations, helpful-rate bands appear here.",
"windowLabel": "Last {days} days",
"generatedAtLabel": "Generated",
"colSeverity": "Severity",
"colMetric": "Metric",
"colProvider": "Provider",
"colPromptVersion": "Prompt",
"colHelpful": "Helpful",
"colNotHelpful": "Not helpful",
"colHelpfulRate": "Helpful rate"
},
"coachFeedback": {
"title": "Coach Feedback",
"loading": "Loading Coach feedback summary...",
"loadError": "Failed to load Coach feedback summary. Try refreshing the page.",
"empty": "No Coach feedback yet. The aggregator runs daily at 04:00 — once users rate Coach replies, helpful-rate bands appear here.",
"windowLabel": "Last {days} days",
"generatedAtLabel": "Generated",
"colPromptVersion": "Prompt version",
"colTone": "Tone",
"colVerbosity": "Verbosity",
"colHelpful": "Helpful",
"colNotHelpful": "Not helpful",
"colN": "n",
"colHelpfulRate": "Helpful rate"
},
"workerStatus": "Job Worker",
"workerRunning": "Running",
"workerStopped": "Stopped",
"lastReminderCheck": "Last Reminder Check",
"appSettings": "Application Settings",
"registrationEnabled": "Allow registration",
"registrationEnabledDescription": "When disabled, new users cannot register.",
"defaultLanguage": "Default language",
"defaultLanguageDescription": "Used for new users and as fallback.",
"defaultUserTimezone": "Default timezone for new accounts",
"defaultUserTimezoneDescription": "Used for new accounts that don't carry a browser-detected zone. Does not affect existing users.",
"defaultUserTimezoneFallback": "Europe/Berlin (default)",
"servicesGlobal": "Services (global)",
"servicesGlobalDescription": "Disabled services are not available to any user.",
"telegramGlobal": "Allow Telegram notifications.",
"ntfyGlobal": "Allow ntfy notifications.",
"webPushGlobal": "Allow browser push notifications.",
"moodLogGlobal": "Allow mood-log reminders.",
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report",
"offlineGeoLabel": "Datos geográficos",
"offlineGeoEnabled": "Sin conexión (GeoLite2)",
"offlineGeoFallback": "Respaldo (ipwho.is) — configura MAXMIND_LICENSE_KEY en CI",
"apiGlobal": "Allow API endpoints and API tokens.",
"umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
"umamiWebsiteId": "Umami website ID",
"umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"glitchtipEnabled": "Enable GlitchTip error tracking.",
"glitchtipDsn": "GlitchTip DSN",
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
"webPushVapidPrivateKey": "VAPID private key",
"webPushVapidPrivateKeyPlaceholder": "Optional: enter a new private key",
"webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured",
"monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed",
"bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled",
"bugReportEnabledDescription": "When off, the in-app report button hides — token and repository stay configured.",
"assistant": {
"title": "Superficies del asistente",
"description": "Cada conmutador oculta una superficie impulsada por el modelo en toda la aplicación sin retirar la configuración del proveedor. El interruptor maestro fuerza cada opción secundaria a off.",
"master": {
"title": "Asistente activado",
"description": "Interruptor maestro para cada superficie impulsada por el modelo. Cuando está desactivado, todas las opciones secundarias se fuerzan a off."
},
"coach": {
"title": "Coach",
"description": "Drawer de chat, botón de lanzamiento y FAB móvil en cada página de Insights."
},
"briefing": {
"title": "Briefing diario",
"description": "Tarjeta de briefing, narración del hero strip, cuadrícula de recomendaciones y la acción Regenerar."
},
"insightStatus": {
"title": "Tarjetas de estado",
"description": "Tarjetas de estado por métrica en cada sub-página /insights."
},
"correlations": {
"title": "Correlaciones",
"description": "Narración de la tarjeta de correlación en la vista general de Insights."
},
"healthScoreExplainer": {
"title": "Explicador de Health-Score",
"description": "El icono ? junto a la línea de delta del Health-Score. El dígito del delta permanece visible siempre."
}
},
"bugReportRepo": "Repository",
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"userManagement": "User Management",
"userName": "Nombre",
"userEmail": "Correo electrónico",
"userRole": "Role",
"userPasskeys": "Passkeys",
"userCreated": "Created",
"userActions": "Acciones",
"editUser": "Edit user",
"editUserTitle": "Edit user: {name}",
"demoteToUser": "Demote to user",
"promoteToAdmin": "Promote to admin",
"toUser": "Make user",
"toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role",
"resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password",
"newPasswordPlaceholder": "At least 12 characters",
"passwordReset": "Password has been reset",
"reset": "Restablecer",
"loadingUsers": "Loading users...",
"apiTokens": "API Tokens",
"tokenUser": "User",
"tokenName": "Nombre",
"tokenPermissions": "Permissions",
"tokenPermissionAll": "Todo",
"tokenPermissionAllTooltip": "Wildcard permission — this token can call every API route.",
"tokenStatus": "Estado",
"tokenLastUsed": "Last used",
"tokenCreated": "Created",
"tokenNeverUsed": "Never",
"tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview",
"allAuthEvents": "All auth events",
"failedOnly": "Failed only",
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
"loginEmptyFailedTitle": "No failed sign-in attempts",
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
"loginEmptyResetFilter": "Show all events",
"showingEntries": "Mostrando {count} de {total} entradas de autenticación",
"status": "Estado",
"action": "Action",
"ip": "IP",
"location": "Location",
"timestamp": "Hora",
"provider": "Provider",
"providerPassword": "Contraseña",
"providerPasskey": "Passkey",
"providerApiToken": "API token",
"providerWithings": "Withings",
"providerUnknown": "Desconocido",
"outcome": "Outcome",
"outcomeSuccess": "Éxito",
"outcomeFailed": "Failed",
"auditDetails": "Details",
"deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?",
"deleteAllConfirmDescription": "This will permanently delete all measurements, medications, intake events, API tokens, Withings connections, open authentication challenges, notification channels (Telegram, ntfy, Web Push), push subscriptions, and queued Telegram message deletions for all users. User accounts, the audit log, and submitted feedback are preserved so the wipe itself remains traceable and bug reports stay triageable.",
"deleteButton": "Delete all data",
"finalDelete": "Delete permanently",
"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": "Registration",
"authLogin": "Iniciar sesión",
"authLoginPasskey": "Passkey login",
"authLoginPassword": "Password login",
"authLoginFailed": "Failed",
"authLogout": "Cerrar sesión",
"authPasskeyRegister": "Passkey added",
"authPasskeyDelete": "Passkey deleted",
"authTokenAutoissueNative": "Native client token issued",
"authTokenRefresh": "Token refreshed",
"authTokenRevoke": "Token revoked",
"medicationReminders": "Medication Reminders",
"medicationRemindersDescription": "Thresholds for reminder badge color transitions on medication cards.",
"reminderLateMinutes": "Late threshold (minutes)",
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
"reminderMissedMinutes": "Missed threshold (minutes)",
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
"notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification",
"reminderCheckRun": "Run reminder check",
"reminderCheckSuccess": "Reminder check completed",
"reminderCheckFailed": "Failed to run reminder check",
"reminderCheckResults": "Results",
"reminderCheckNotifOn": "Notifications on",
"reminderCheckNotifOff": "Notifications off",
"reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent",
"feedback": {
"tabOpen": "Open",
"tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved",
"tabArchived": "Archived",
"subject": "Subject",
"category": "Category",
"user": "User",
"createdAt": "Submitted",
"actions": "Acciones",
"details": "Details",
"emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...",
"anonymous": "anonymous",
"categoryBug": "Bug",
"categoryFeature": "Feature",
"categoryQuestion": "Question",
"categoryOther": "Other",
"metadataHeading": "Metadata",
"metaUrl": "URL",
"metaLocale": "Locale",
"metaUserAgent": "User agent",
"metaAppVersion": "App version",
"screenshotHeading": "Screenshot",
"adminNote": "Admin note",
"adminNotePlaceholder": "Internal note (not visible to user)",
"saveNote": "Save note",
"noteSaved": "Note saved",
"actionAcknowledge": "Acknowledge",
"actionResolve": "Resolve",
"actionArchive": "Archive",
"actionPublishGithub": "Publish to GitHub",
"publishedToGithub": "Published to GitHub",
"viewIssue": "View issue",
"publishSuccess": "Issue created",
"publishFailed": "GitHub publish failed",
"updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by"
},
"shell": {
"overview": "Resumen",
"sectionsNav": "Admin sections"
},
"overview": {
"welcomeTitle": "Bienvenido,{name}",
"welcomeSubtitle": "You are signed in as administrator. Pick a section to manage HealthLog.",
"snapshotTitle": "System snapshot",
"snapshotVersion": "Version",
"snapshotDatabase": "Database",
"snapshotWorker": "Worker",
"snapshotStarted": "Started",
"snapshotBuildSha": "Build SHA",
"snapshotBuiltAt": "Built at",
"snapshotOfflineGeo": "Datos geográficos",
"snapshotOfflineGeoOn": "Sin conexión (GeoLite2)",
"snapshotOfflineGeoOff": "Respaldo (ipwho.is)",
"snapshotLoadError": "Failed to load system snapshot.",
"snapshotLoading": "Loading snapshot...",
"auditTitle": "Recent activity",
"auditEmpty": "No recent audit entries.",
"auditLoadError": "Failed to load recent activity.",
"auditLoading": "Loading activity...",
"auditViewAll": "View all"
},
"section": {
"system-status": {
"title": "System Status",
"subtitle": "Worker, database, and integration health at a glance."
},
"general": {
"title": "General",
"subtitle": "Registration, default language, and other app-wide toggles."
},
"services": {
"title": "Services",
"subtitle": "Enable or disable notification channels and integrations system-wide."
},
"integrations": {
"title": "Integraciones",
"subtitle": "Configure Umami, GlitchTip, Web Push, and bug reports."
},
"ai-quality": {
"title": "Insights Quality",
"subtitle": "Helpfulness scores grouped by severity and provider, from the last 30 days of user feedback."
},
"assistant": {
"title": "Superficies del asistente",
"subtitle": "Activa o desactiva cada superficie impulsada por el modelo sin retirar la configuración del proveedor."
},
"coach-feedback": {
"title": "Coach Feedback",
"subtitle": "Helpful-rate per Coach prompt version, tone, and verbosity from the last 30 days."
},
"feedback": {
"title": "Feedback",
"subtitle": "Triage user feedback, bug reports, and feature requests."
},
"reminders": {
"title": "Reminders",
"subtitle": "Tune medication reminder thresholds and run a manual check."
},
"users": {
"title": "Users",
"subtitle": "Manage user accounts, roles, and active sessions.",
"filter": {
"all": "Todo",
"admin": "Admins",
"user": "Users"
},
"forceLogout": "Force logout",
"forceLogoutConfirmTitle": "Force logout {name}?",
"forceLogoutConfirmBody": "All active sessions for this user will be revoked. They will need to sign in again on every device.",
"forceLogoutSuccess": "Logged {name} out of {count} session(s)",
"forceLogoutFailed": "Failed to force logout",
"cannotLogoutSelf": "Cannot force-logout yourself",
"emptyTitle": "No users in this view",
"emptyDescription": "There are no users matching the current filter.",
"emptyResetFilter": "Show all users"
},
"api-tokens": {
"title": "API Tokens",
"subtitle": "Active bearer tokens issued to native clients and integrations."
},
"login-overview": {
"title": "Login Overview",
"subtitle": "Audit trail of authentication and admin events."
},
"auditLog": {
"filterActor": "Actor (user id or username)",
"filterAction": "Action",
"filterActionAll": "All actions",
"filterTarget": "Target (id or path)",
"filterDate": "Date range",
"range24h": "Last 24 hours",
"range7d": "Últimos 7 días",
"range30d": "Últimos 30 días",
"rangeAll": "Todo el tiempo",
"perPage": "Per page",
"prev": "Previous",
"next": "Siguiente",
"pageOf": "Página {page} de {total}",
"export": "Export CSV",
"empty": "No audit entries match the current filters."
},
"app-logs": {
"title": "App Logs",
"subtitle": "Tail the most recent structured wide-events emitted by this process.",
"processNote": "Showing app-process logs only — worker-process logs go to Loki when that integration is configured. Buffer is volatile and capped at 500 entries.",
"filterTraceId": "Trace ID",
"filterAction": "Action contains…",
"filterLevel": "Level",
"levelAll": "All levels",
"filterRange": "Time window",
"range15m": "Last 15 minutes",
"range1h": "Last hour",
"range6h": "Last 6 hours",
"rangeAll": "Whole buffer",
"colLevel": "Level",
"colTimestamp": "Timestamp",
"colAction": "Action",
"colDuration": "Duration",
"colTraceId": "Trace",
"showing": "Showing {count} of up to {bufferMax} buffered events",
"empty": "Buffer is empty",
"emptyDescription": "No events match the current filters yet. Hit refresh after triggering some traffic.",
"refresh": "Refresh",
"eventDetails": "Event details",
"closeDetails": "Close details"
},
"backups": {
"title": "Backups",
"subtitle": "Weekly per-user data snapshots stored in PostgreSQL.",
"description": "Each user gets one rolling snapshot per backup type. Sizes show the encrypted blob — payloads are not downloadable from this page.",
"runNow": "Backup now",
"runEnqueued": "Backup job enqueued",
"runFailed": "Failed to enqueue backup",
"loading": "Loading backups...",
"loadError": "Failed to load backups.",
"emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User",
"colType": "Tipo",
"typeWeeklyAuto": "Weekly (auto)",
"typeManual": "Manual",
"colSize": "Size",
"colCreatedAt": "Last snapshot",
"colActions": "Acciones",
"retentionLabel": "Retention: {days} days",
"download": "Download",
"downloadAria": "Download backup for {username}",
"downloadFailed": "Download failed",
"downloadStarted": "Download started",
"uploadTitle": "Upload backup",
"uploadDescription": "Validate a backup file and store it as a manual snapshot. Restoring is a separate step.",
"uploadButton": "Upload file",
"uploadHelp": "JSON file matching the current backup schema. Max 10 MB.",
"uploadSuccess": "Backup uploaded ({count} records)",
"uploadFailed": "Upload failed",
"restore": "Restore",
"restoreAria": "Restore from backup for {username}",
"restoreTitle": "Restore from backup",
"restoreDescription": "This will replace ALL current data for {username} with the snapshot from {when}. Existing measurements, medications, intake events, mood entries, notification channels, push subscriptions and queued Telegram deletions will be deleted.",
"restorePromptLabel": "Type RESTORE to continue",
"restoreConfirm": "Restore now",
"restoreInProgress": "Restoring...",
"restoreSuccess": "Restore complete",
"restoreFailed": "Restore failed",
"docsLink": "Documentation"
},
"danger-zone": {
"title": "Danger Zone",
"subtitle": "Destructive system-wide operations."
},
"about": {
"title": "About",
"subtitle": "Version, license, source, and update check."
}
},
"carrier": "Operador",
"carrierUnknown": "Operador desconocido",
"carrierUnavailableGeoFallback": "{location} — carrier unavailable"
},
"achievements": {
"title": "Achievements",
"subtitle": "Earn achievements by tracking your health and taking your meds on time.",
"loginRequired": "Please sign in to view achievements.",
"points": "Points",
"unlocked": "Unlocked",
"nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!",
"completed": "Completed",
"goalReached": "Goal reached",
"remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points",
"metricCount": "{count}",
"metricDays": "{count} days",
"metricPercent": "{count}%",
"badges": {
"intakeTotal1": {
"title": "First intake",
"description": "Record your first taken medication event."
},
"intakeTotal10": {
"title": "Intake starter",
"description": "Record 10 taken medication events."
},
"intakeTotal50": {
"title": "Intake routine",
"description": "Record 50 taken medication events."
},
"intakeTotal150": {
"title": "Intake expert",
"description": "Record 150 taken medication events."
},
"intakeTotal300": {
"title": "Intake legend",
"description": "Record 300 taken medication events."
},
"overIntake1": {
"title": "Double take",
"description": "Take medication at least once more than planned."
},
"skippedIntake1": {
"title": "Stepped back",
"description": "Skip at least one planned intake."
},
"passkeyCreated1": {
"title": "Passkey set up",
"description": "Create your first passkey."
},
"passkeyLogin1": {
"title": "Passkey login",
"description": "Sign in at least once with a passkey."
},
"passwordLogin1": {
"title": "Old school",
"description": "Sign in at least once with username and password."
},
"bugReport1": {
"title": "Bug hunter",
"description": "Submit a bug report."
},
"loginStreak7": {
"title": "Login streak 7d",
"description": "Sign in on 7 consecutive days."
},
"loginStreak30": {
"title": "Login streak 30d",
"description": "Sign in on 30 consecutive days."
},
"onTimePerfect1": {
"title": "On-time 1d",
"description": "Take all medications on time for 1 day."
},
"compliance801": {
"title": "80% adherence · 1d",
"description": "Reach at least 80% 30-day adherence for 1 day."
},
"bmiGreen1": {
"title": "BMI green · 1d",
"description": "Keep your BMI in the normal range for 1 day."
},
"bpGreen1": {
"title": "BP green · 1d",
"description": "Keep your blood pressure in the normal range for 1 day."
},
"pulseGreen1": {
"title": "Pulse green · 1d",
"description": "Keep your resting pulse in the normal range for 1 day."
},
"onTimePerfect7": {
"title": "On-time 7d",
"description": "Take all medications on time for 7 consecutive days."
},
"compliance807": {
"title": "80% adherence · 7d",
"description": "Reach at least 80% 30-day adherence for 7 consecutive days."
},
"bmiGreen7": {
"title": "BMI green · 7d",
"description": "Keep your BMI in the normal range for 7 consecutive days."
},
"bpGreen7": {
"title": "BP green · 7d",
"description": "Keep your blood pressure in the normal range for 7 consecutive days."
},
"pulseGreen7": {
"title": "Pulse green · 7d",
"description": "Keep your resting pulse in the normal range for 7 consecutive days."
},
"onTimePerfect30": {
"title": "On-time 30d",
"description": "Take all medications on time for 30 consecutive days."
},
"compliance8030": {
"title": "80% adherence · 30d",
"description": "Reach at least 80% 30-day adherence for 30 consecutive days."
},
"bmiGreen30": {
"title": "BMI green · 30d",
"description": "Keep your BMI in the normal range for 30 consecutive days."
},
"bpGreen30": {
"title": "BP green · 30d",
"description": "Keep your blood pressure in the normal range for 30 consecutive days."
},
"pulseGreen30": {
"title": "Pulse green · 30d",
"description": "Keep your resting pulse in the normal range for 30 consecutive days."
},
"onTimePerfect180": {
"title": "On-time 180d",
"description": "Take all medications on time for 180 consecutive days."
},
"compliance80180": {
"title": "80% adherence · 180d",
"description": "Reach at least 80% 30-day adherence for 180 consecutive days."
},
"bmiGreen180": {
"title": "BMI green · 180d",
"description": "Keep your BMI in the normal range for 180 consecutive days."
},
"bpGreen180": {
"title": "BP green · 180d",
"description": "Keep your blood pressure in the normal range for 180 consecutive days."
},
"pulseGreen180": {
"title": "Pulse green · 180d",
"description": "Keep your resting pulse in the normal range for 180 consecutive days."
},
"onTimePerfect360": {
"title": "On-time 360d",
"description": "Take all medications on time for 360 consecutive days."
},
"compliance80360": {
"title": "80% adherence · 360d",
"description": "Reach at least 80% 30-day adherence for 360 consecutive days."
},
"bmiGreen360": {
"title": "BMI green · 360d",
"description": "Keep your BMI in the normal range for 360 consecutive days."
},
"bpGreen360": {
"title": "BP green · 360d",
"description": "Keep your blood pressure in the normal range for 360 consecutive days."
},
"pulseGreen360": {
"title": "Pulse green · 360d",
"description": "Keep your resting pulse in the normal range for 360 consecutive days."
},
"moodFirst": {
"title": "First mood",
"description": "Log your first mood entry."
},
"moodStreak7": {
"title": "Mood diarist 7d",
"description": "Log a mood entry on 7 consecutive days."
},
"moodStreak30": {
"title": "Mood diarist 30d",
"description": "Log a mood entry on 30 consecutive days."
},
"moodUp7": {
"title": "Brighter week",
"description": "Your 7-day mood average improved by at least 1.0 point compared to the previous week."
},
"weightFirst": {
"title": "First weigh-in",
"description": "Record your first weight measurement."
},
"weight50": {
"title": "Fifty weigh-ins",
"description": "Record 50 weight measurements."
},
"weight200": {
"title": "200 weigh-ins",
"description": "Record 200 weight measurements."
},
"bpFirst": {
"title": "First reading",
"description": "Record your first blood-pressure measurement."
},
"bp50": {
"title": "Fifty BP readings",
"description": "Record 50 blood-pressure measurements."
},
"bp200": {
"title": "200 BP readings",
"description": "Record 200 blood-pressure measurements."
},
"pulseFirst": {
"title": "First pulse",
"description": "Record your first pulse measurement."
},
"consistentMonth": {
"title": "Consistent month",
"description": "Log entries on at least 25 distinct days within a single calendar month."
},
"entryStreak7": {
"title": "Tracker streak 7d",
"description": "Log at least one entry on 7 consecutive days."
},
"entryStreak30": {
"title": "Tracker streak 30d",
"description": "Log at least one entry on 30 consecutive days."
},
"weekendWarrior": {
"title": "Weekend tracker",
"description": "Log entries on 4 consecutive Saturday + Sunday weekend pairs."
},
"hiddenNightOwl": {
"title": "Night owl",
"description": "Logged an entry between 02:00 and 04:00 in the morning."
},
"hiddenEarlyBird": {
"title": "Early bird",
"description": "Logged an entry between 04:00 and 06:00 in the morning."
},
"hiddenLeapDay": {
"title": "Leap-day legend",
"description": "Logged an entry on February 29."
},
"hiddenDoctorPdf": {
"title": "House call",
"description": "Exported your first doctor-report PDF."
},
"hiddenLocaleFlip": {
"title": "Polyglot",
"description": "Switched the app language at least once."
},
"hiddenBugBuddy": {
"title": "Bug buddy",
"description": "Submitted at least 5 bug reports — the project loves you."
}
},
"nextProgressLabel": "Progress to unlock",
"completedOn": "Completed on {date}",
"locked": "Locked",
"criterionHint": "{current} / {target}",
"progressPercent": "{percent}%",
"categories": {
"medication": "Medicamento",
"vitals": "Vitals",
"mood": "Estado de ánimo",
"security": "Account & security",
"engagement": "Engagement",
"hidden": "Hidden"
},
"hiddenCard": {
"title": "Hidden achievement",
"description": "Keep tracking — you might just stumble across it.",
"ariaLabel": "Hidden locked achievement"
},
"hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!"
},
"dashboardCard": {
"title": "Recent unlocks",
"viewAll": "View all",
"empty": "No achievements yet — keep logging to unlock your first."
}
},
"bugreport": {
"title": "Reporte de bug",
"subtitle": "Envía un fallo, una sugerencia o una pregunta. El administrador del servidor verá tu envío.",
"loginRequired": "Inicia sesión para reportar un bug.",
"bugTitle": "Título",
"description": "Descripción",
"submit": "Enviar",
"success": "¡Gracias! Tu reporte se ha enviado correctamente.",
"errorCreating": "Error al crear",
"category": "Tipo",
"categoryBug": "Fallo",
"categoryFeature": "Sugerencia",
"categoryQuestion": "Pregunta",
"categoryOther": "Otro feedback",
"bugTitlePlaceholder": "Resumen breve (opcional)",
"githubEscalationNote": "Tu feedback se guarda localmente. Si el administrador activa la integración con GitHub, puede publicarse como issue público a petición.",
"internalOnlyNote": "Tu feedback se guarda localmente y solo es visible para el administrador de este servidor.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Centro de notificaciones",
"breadcrumbInbox": "Centro de notificaciones",
"breadcrumbChannels": "Canales de notificación",
"breadcrumbSettings": "Ajustes",
"eventColumn": "Evento",
"subtitle": "Elige qué notificaciones recibes y por qué canal.",
"loadError": "No se han podido cargar los ajustes de notificación.",
"noChannels": "Configura primero un canal de notificación en los ajustes.",
"goToSettings": "Ir a los ajustes del canal",
"channelDisabled": "Desactivado",
"admin": {
"deployFailedTitle": "Despliegue fallido: {application}",
"deployFailedBody": "Se produjo un error al desplegar {application} (#{deployment}): {error}. Ver registros: {logsUrl}",
"testNotificationTitle": "HealthLog notificación de prueba",
"testNotificationBody": "Esta notificación de prueba se activó desde el panel de administración. Si la ves, el canal funciona.",
"reminderCheckMissedTitle": "Recordatorio perdido: {medication}",
"reminderCheckMissedBody": "{medication} ({dose}) no se registró en la ventana {window}.",
"reminderCheckOverdueTitle": "Dosis atrasada: {medication}",
"reminderCheckOverdueBody": "{medication} ({dose}) en la ventana {window} lleva {minutes} minutos de retraso.",
"offlineGeoUnavailableTitle": "Bases de datos de geolocalización sin conexión no cargadas",
"offlineGeoUnavailableBody": "HealthLog está resolviendo las ubicaciones de inicio de sesión mediante el respaldo en línea ipwho.is. Para habilitar las bases sin conexión GeoLite2-City y GeoLite2-ASN, configura MAXMIND_LICENSE_KEY en los secrets de GitHub Actions en {secretsUrl} y vuelve a desplegar. Hasta entonces, la columna de operador en el resumen de inicios de sesión permanece vacía."
},
"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."
},
"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."
},
"i18n": {
"maintainershipBanner": {
"notice": "Este idioma está traducido automáticamente, incluidas las instrucciones críticas para la seguridad del Coach. Un control de deriva automático se ejecuta en CI; informe de cualquier regresión del Coach en GitHub.",
"cta": "Informar en GitHub",
"dismiss": "Cerrar"
}
},
"targets": {
"bmi": "IMC",
"average30d": "Media 30 días:",
"consistency": {
"ariaLabel": "Últimos 7 días, estado dentro/fuera del rango por día",
"daysInRange": "{count} de {total} en rango",
"daysLogged": "{count} de {total} registrados",
"dotInRange": "en rango",
"dotNearRange": "cerca del rango",
"dotOutOfRange": "fuera",
"dotNotLogged": "no registrado",
"insufficientData": "Aún hay pocos datos — sigue registrando.",
"relativeDay": {
"today": "Hoy",
"yesterday": "Ayer",
"twoDaysAgo": "hace 2 días",
"threeDaysAgo": "hace 3 días",
"fourDaysAgo": "hace 4 días",
"fiveDaysAgo": "hace 5 días",
"sixDaysAgo": "hace 6 días"
}
},
"relativeDay": {
"today": "Hoy",
"yesterday": "Ayer",
"daysAgo": "hace {count} días"
},
"edit": {
"openLabel": "Editar el rango objetivo de {metric}",
"title": "Editar rango objetivo — {metric}",
"description": "Ajusta el rango objetivo usado en gráficas, insights y el informe médico. Valores en {unit}.",
"derivedHint": "Esta tarjeta se calcula a partir de otras métricas. Edita en su lugar los objetivos subyacentes (p. ej. tensión arterial o peso).",
"minLabel": "Mín",
"maxLabel": "Máx",
"systolicMin": "Sistólica mín",
"systolicMax": "Sistólica máx",
"diastolicMin": "Diastólica mín",
"diastolicMax": "Diastólica máx",
"boundsHint": "Rango permitido: {min}–{max} {unit}",
"resetToDefault": "Restablecer por defecto",
"saveSuccess": "Rango objetivo actualizado",
"saveError": "No se ha podido guardar el rango objetivo",
"resetSuccess": "Rango objetivo restablecido por defecto"
},
"mood": {
"stability": {
"stable": "estable",
"variable": "variable",
"highlyVariable": "muy variable"
}
},
"currentValue": "Actual: {value} {unit}",
"targetRangeValue": "Rango objetivo: {min}–{max} {unit}",
"sourceLabel": "Fuente: {source}",
"inTarget": "En rango objetivo",
"aboveTarget": "{delta} {unit} por encima del rango",
"belowTarget": "{delta} {unit} por debajo del rango",
"diastolic": "Diastólica",
"glucoseFasting": "Glucemia — en ayunas",
"glucosePostprandial": "Glucemia — posprandial",
"glucoseRandom": "Glucemia — cualquiera",
"glucoseBedtime": "Glucemia — antes de dormir",
"status": {
"underweight": "Peso insuficiente",
"normal": "Normal",
"overweight": "Sobrepeso",
"obesityGrade1": "Obesidad grado I",
"obesityGrade2": "Obesidad grado II",
"obesityGrade3": "Obesidad grado III",
"optimal": "Óptima",
"highNormal": "Normal-alta",
"hypertensionGrade1": "Hipertensión grado 1",
"hypertensionGrade2": "Hipertensión grado 2",
"hypertensionGrade3": "Hipertensión grado 3",
"bradycardia": "Bradicardia",
"elevated": "Elevado",
"tachycardia": "Taquicardia",
"significantlyLow": "Significativamente bajo",
"slightlyLow": "Ligeramente bajo",
"onTarget": "En rango objetivo",
"slightlyElevated": "Ligeramente elevado",
"significantlyElevated": "Significativamente elevado",
"farTooShort": "Muy corto",
"tooShort": "Corto",
"slightlyLong": "Ligeramente largo",
"farTooLong": "Muy largo",
"belowEssential": "Por debajo de lo esencial",
"essential": "Esencial",
"athletic": "Atlético",
"fitness": "Fitness",
"acceptable": "Aceptable",
"obese": "Obeso",
"veryLow": "Muy bajo",
"lowActive": "Poco activo",
"moderatelyActive": "Moderadamente activo",
"active": "Activo",
"veryActive": "Muy activo",
"good": "Bueno",
"moderate": "Moderado",
"low": "Bajo",
"high": "Alto",
"veryGood": "Muy bueno",
"veryStable": "Muy estable",
"stable": "Estable",
"fluctuating": "Variable"
}
},
"passwordStrength": {
"veryWeak": "Muy débil",
"weak": "Débil",
"acceptable": "Aceptable",
"strong": "Fuerte",
"veryStrong": "Muy fuerte",
"tooShort": "Demasiado corta",
"characters": "caracteres",
"minLength": "Se requieren al menos {count} caracteres."
},
"telegram": {
"errorInvalidAction": "Acción no válida.",
"errorMedicationNotFound": "Medicamento no encontrado.",
"errorMedicationInactive": "Medicamento no encontrado o inactivo.",
"errorUnknownAction": "Acción desconocida.",
"snoozeOneHour": "1 hora",
"snoozeThreeHours": "3 horas",
"snoozedFor": "{name} pospuesto durante {duration}.",
"skipped": "{name} omitido.",
"alreadyRecorded": "{name} ya estaba registrado.",
"recordedAsTaken": "{name} registrado como tomado.",
"confirmed": "{name} confirmado.",
"genericConfirmed": "Confirmado.",
"cancelled": "Cancelado.",
"noActiveMedications": "No se han encontrado medicamentos activos.",
"whichMedication": "<b>¿Qué medicamento has tomado?</b>",
"cancelButton": "Cancelar",
"askMedicationName": "Indica el medicamento, p. ej. <b>tomado Ramipril</b>.",
"medicationNotFoundExact": "Medicamento no encontrado. Envía el nombre exactamente como aparece en HealthLog.",
"helpHeader": "<b>Available commands:</b>",
"helpBody": "/help — show this help\n/add — record an intake\n/start — start the bot\n\n<b>Text commands:</b>\ntaken &lt;name&gt; — confirm an intake\n\n<b>Buttons in reminders:</b>\n• Taken — confirm intake\n• 🕐 1h / 🕐 3h — postpone reminder\n• ⏭ Skip — skip intake\n• ✓ Confirm — confirm a missed intake"
},
"medicationReminders": {
"phaseGreenTitle": "🟢 Reminder: {medName}",
"phaseGreenMessage": "🟢 Reminder:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nWindow closes in {minutes} Mín.",
"phaseYellowTitle": "🟡 Due soon: {medName}",
"phaseYellowMessage": "🟡 Due soon:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\n{minutes} min left.",
"phaseOrangeTitle": "🟠 Overdue: {medName}",
"phaseOrangeMessage": "🟠 Overdue:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nOverdue by {minutes} Mín.",
"phaseRedTitle": "🔴 Missed: {medName}",
"phaseRedMessage": "🔴 Missed:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nMarked as missed.",
"buttonTaken": "Tomado",
"buttonConfirm": "✓ Confirmar",
"buttonSnoozeOneHour": "🕐 1h",
"buttonSnoozeThreeHours": "🕐 3h",
"buttonSkip": "⏭ Omitir"
},
"moodReminders": {
"dailyTitle": "Registrar el ánimo",
"dailyBody": "¿Cómo te sientes hoy?"
}
}