Files
HealthLog/messages/en.json
T
Marc-André Bombeck 73041b10cd docs(insights): note the Enright 40-80 cohort in the six-minute-walk caveat
The Enright & Sherrill 1998 predicted-distance equation was established on a
40-80 reference cohort; the metric accepts adult ages 18-120, so the
prediction extrapolates outside that range. State it in the user-facing
caveat (all locales) and the norms doc so a younger or older user reads
their percent-of-predicted with that honesty.
2026-06-03 21:33:06 +02:00

4514 lines
199 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"common": {
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"moreOptions": "More options",
"create": "Create",
"close": "Close",
"loading": "Loading...",
"loadFailed": "Could not load",
"error": "Error",
"saved": "Saved",
"no": "No",
"noData": "No data available",
"optional": "Optional",
"active": "Active",
"inactive": "Inactive",
"enabled": "Enabled",
"disabled": "Disabled",
"networkError": "Network error",
"unknownError": "Unknown error",
"copied": "Copied!",
"or": "or",
"unknown": "Unknown",
"add": "Add",
"import": "Import",
"test": "Test",
"reset": "Reset",
"copy": "Copy",
"copyDetails": "Copy details",
"retry": "Retry",
"reportIssue": "Report issue",
"showPassword": "Show password",
"hidePassword": "Hide password"
},
"doctorReport": {
"title": "Health Report",
"subtitle": "HealthLog — Personal Health Report",
"patient": "Patient",
"dateOfBirth": "Date of birth",
"gender": "Gender",
"genderMale": "Male",
"genderFemale": "Female",
"genderOther": "Non-binary",
"height": "Height",
"period": "Reporting period",
"createdOn": "Created on",
"vitalsTitle": "Vital signs — Summary",
"colParameter": "Parameter",
"colCurrent": "Current",
"colAvgPeriod": "Avg. period",
"colMin": "Min",
"colMax": "Max",
"colN": "n",
"bpClassificationTitle": "Blood pressure — ESH classification (2023)",
"avgBp": "Average blood pressure",
"classification": "Classification",
"bmiTitle": "Body Mass Index (BMI)",
"bmiRow": "BMI: {bmi} kg/m² — Classification: {class} (WHO)",
"complianceTitle": "Medication compliance",
"glp1Title": "GLP-1 therapy",
"glp1WeightSummary": "Weight over report period: {start} kg → {end} kg ({delta} kg)",
"glp1CurrentDose": "Current dose: {value} {unit} (since {since})",
"glp1Compliance": "Compliance: {taken} / {total} ({rate}%)",
"glp1SideEffectsTitle": "Side effects logged",
"colGlp1Date": "Date",
"colGlp1Dose": "Dose",
"colGlp1Note": "Note",
"colGlp1SideEffect": "Side effect",
"colMedication": "Medication",
"colTaken": "Taken",
"colSkipped": "Skipped",
"colMissed": "Missed",
"colTotal": "Total",
"colComplianceRate": "Compliance rate",
"moodTitle": "Mood trajectory",
"moodSummary": "Average: {avg} / 5.0 · Entries: {count} · Range: {min}–{max}",
"colMood": "Mood",
"colCount": "Count",
"colShare": "Share",
"footerDisclaimer1": "This report was generated automatically from self-tracked data and is intended to support",
"footerDisclaimer2": "the doctor–patient conversation. It does not replace a medical diagnosis. Correlations do not imply causation.",
"footerSource": "Source: HealthLog | Timezone: Europe/Berlin | Created: {timestamp}",
"typeWeight": "Body weight",
"typeBpSys": "Systolic blood pressure",
"typeBpDia": "Diastolic blood pressure",
"typePulse": "Resting pulse",
"typeBodyFat": "Body fat",
"typeSleep": "Sleep duration",
"typeSteps": "Activity (steps)",
"typeTotalBodyWater": "Total body water",
"typeBoneMass": "Bone mass",
"typeOxygenSaturation": "Oxygen saturation",
"unitSteps": "steps",
"bmiUnderweight": "Underweight",
"bmiNormal": "Normal weight",
"bmiOverweight": "Overweight (pre-obese)",
"bmiObeseGrade1": "Obesity grade I",
"bmiObeseGrade2": "Obesity grade II",
"bmiObeseGrade3": "Obesity grade III",
"bpOptimal": "Optimal",
"bpNormal": "Normal",
"bpHighNormal": "High-normal",
"bpHypertensionGrade1": "Hypertension grade 1",
"bpHypertensionGrade2": "Hypertension grade 2",
"bpHypertensionGrade3": "Hypertension grade 3",
"moodAwful": "Very bad",
"moodBad": "Bad",
"moodNeutral": "Neutral",
"moodGood": "Good",
"moodGreat": "Very good",
"typeGlucoseFasting": "Glucose (fasting)",
"typeGlucosePostprandial": "Glucose (postprandial)",
"typeGlucoseRandom": "Glucose (random)",
"typeGlucoseBedtime": "Glucose (bedtime)",
"glucoseClassificationTitle": "Blood glucose — reference ranges (ADA 2024 / DDG)",
"glucoseRow": "{label}: avg {avg} {unit} (target {rangeMin}–{rangeMax}) — {class}",
"glucoseInTarget": "in target",
"glucoseBelowTarget": "below target",
"glucoseAboveTarget": "above target",
"practiceLabel": "Practice",
"dialog": {
"title": "Doctor report (PDF)",
"description": "Pick the reporting period and (optionally) the practice name; both are printed on the cover.",
"startLabel": "Start date",
"endLabel": "End date",
"practiceLabel": "Practice / clinic name (optional)",
"practicePlaceholder": "e.g. Dr. Müller — Family practice",
"preset90d": "Last 90 days",
"preset180d": "Last 6 months",
"preset365d": "Last 12 months",
"submit": "Generate PDF",
"cancel": "Cancel",
"errorEndBeforeStart": "End date must be on or after the start date.",
"errorRangeTooLong": "The reporting period cannot exceed 2 years.",
"errorInvalidDate": "Please select a valid start and end date."
},
"sections": {
"title": "Choose sections",
"bp": "Blood pressure",
"weight": "Weight",
"pulse": "Resting pulse",
"bmi": "Body Mass Index (BMI)",
"mood": "Mood",
"moodSensitive": "Sensitive — off by default.",
"compliance": "Medication compliance",
"sleep": "Sleep duration",
"empty": "No data was recorded in this date range yet. The report will still include the cover page.",
"unavailableHint": "No data in this period"
},
"insurer": "Health insurer",
"insuranceNumber": "Insurance no.",
"summaryTitle": "Clinical summary",
"summaryReadings": "Recorded over {days} days: {count} measurements across {params} parameters.",
"summaryTrend": "{label}: latest {latest} {arrow}",
"summaryAdherence": "Medication adherence: {rate}% (weighted mean).",
"chartsTitle": "Trend charts",
"aiSummaryTitle": "AI summary — not clinically validated",
"aiSummaryDisclaimer": "This section was generated automatically by an AI model and is not clinically validated. It does not replace a medical assessment.",
"packageReadme": "HealthLog health record\n\nThis package contains:\n- report.pdf: the health report for your doctor.\n- bundle.json: the same data as an HL7 FHIR R4 document Bundle, ePA-compatible.\n\nGenerated with HealthLog.",
"wellnessTitle": "Wellness summary",
"wellnessDisclaimer": "These are descriptive wellness scores computed from your tracked signals (0–100). They are not clinical assessments or diagnoses.",
"wellnessRecovery": "Recovery",
"wellnessStress": "Stress",
"wellnessStrain": "Strain"
},
"errorBoundary": {
"title": "Something went wrong",
"description": "An unexpected error occurred. You can retry, copy the technical details, or open a bug report."
},
"notFound": {
"title": "This page doesn't exist.",
"backToDashboard": "Back to dashboard"
},
"offlineBanner": {
"message": "No connection — your changes will save once you're back online."
},
"nav": {
"dashboard": "Dashboard",
"measurements": "Measurements",
"medications": "Medications",
"insights": "Insights",
"targets": "Targets",
"achievements": "Achievements",
"settings": "Settings",
"bugreport": "Bug Report",
"admin": "Admin Console",
"logout": "Sign out",
"login": "Sign in",
"about": "About HealthLog",
"notifications": "Notification Center",
"theme": "Appearance",
"themeSystem": "System",
"themeDark": "Dark",
"themeLight": "Light",
"collapseSidebar": "Collapse",
"userMenu": "User menu",
"mood": "Mood",
"skipToContent": "Skip to content",
"sidebar": "Sidebar",
"mainNavigation": "Main navigation",
"mobileNavigation": "Mobile navigation",
"breadcrumb": "Breadcrumb navigation",
"loadingScreen": "Loading…",
"more": "More",
"moreSheetTitle": "More",
"moreSheetDescription": "Pages that don't fit the bottom bar."
},
"auth": {
"login": "Sign in",
"register": "Sign up",
"username": "Username",
"password": "Password",
"email": "Email address",
"emailPlaceholder": "name@example.com",
"emailOrUsername": "Email address or username",
"emailOrUsernamePlaceholder": "name@example.com or username",
"loginWithPasskey": "Sign in with Passkey",
"loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"loginFailed": "Login failed",
"registerFailed": "Registration failed",
"createAccount": "Create account",
"newAccount": "Create new account",
"backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.",
"privacyPolicy": "Privacy policy"
},
"dashboard": {
"title": "Dashboard",
"greeting": {
"morning": "Good morning",
"day": "Hello",
"evening": "Good evening"
},
"welcomeBack": "{greeting}, welcome back.",
"welcomeBackWithName": "{greeting} {name}, welcome back.",
"greetingSalutation": "Hi, {name}",
"streakLabel": "days in a row",
"weight": "Weight",
"bloodPressure": "Blood Pressure",
"pulse": "Pulse",
"bodyFat": "Body Fat",
"sleep": "Sleep",
"steps": "Steps",
"vo2Max": "VO₂ max",
"vo2MaxUnit": "mL/(kg·min)",
"bpInTarget": "BP in Target",
"weightShort": "Weight",
"bloodPressureSysShort": "BP (Sys)",
"bloodPressureDiaShort": "BP (Dia)",
"pulseShort": "Pulse",
"bodyFatShort": "Body Fat",
"moodShort": "Mood",
"sleepShort": "Sleep",
"stepsShort": "Steps",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BP in Target",
"medications": "Medications",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"quickAddMedicationIntake": "Log medication intake",
"medicationIntakeQuickAdd": {
"sheetTitle": "Log medication intake",
"sheetDescription": "Record dose, time, and medication in a few taps.",
"medicationLabel": "Medication",
"medicationPlaceholder": "Select a medication",
"doseLabel": "Dose",
"dosePlaceholder": "e.g. 5 mg",
"doseHint": "Currently the standard dose is recorded. Variable doses are coming in a later version.",
"timeLabel": "Time taken",
"saveError": "Could not save medication intake.",
"emptyTitle": "No medications yet",
"emptyDescription": "Create a medication with a schedule first, then come back here to log the intake.",
"emptyCta": "Add medication"
},
"compliance7d": "Compliance (7 days)",
"mood": "Mood",
"customizeTitle": "Dashboard layout",
"layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout",
"layoutResetSuccess": "Reset to default layout",
"layoutUsingDefaults": "Using default layout",
"layoutCustomized": "Custom layout active",
"moveUp": "Move up",
"moveDown": "Move down",
"layoutTileColumn": "Tile",
"layoutChartColumn": "Chart",
"dragHandle": "Drag to reorder",
"dragHandleHint": "Drag the handle to reorder this widget. You can also use the Up and Down arrow buttons, or focus the handle and press Space and the arrow keys.",
"emptyTitle": "Your dashboard is empty",
"emptyDescription": "Log your first measurement or mood entry. Tiles and charts appear automatically as data lands.",
"emptyAddMeasurement": "Add your first measurement",
"staleHint": "Last reading {count} d ago",
"staleHintWeeksOne": "Last reading 1 week ago",
"staleHintWeeksOther": "Last reading {count} weeks ago",
"staleHintMonthsOne": "Last reading 1 month ago",
"staleHintMonthsOther": "Last reading {count} months ago",
"coachCta": "Ask the coach",
"recentWorkouts": {
"title": "Recent workouts",
"viewAll": "View all",
"loading": "Loading workouts…",
"empty": {
"title": "No workouts yet",
"cta": "Open Apple Health on your iPhone to sync workouts here."
}
},
"metric": {
"title": {
"weight": "Weight",
"bloodPressure": "Blood Pressure",
"pulse": "Pulse",
"bodyFat": "Body Fat",
"glucose": "Blood Glucose",
"sleep": "Sleep",
"steps": "Steps",
"totalBodyWater": "Total Body Water",
"boneMass": "Bone Mass",
"oxygenSaturation": "Oxygen Saturation"
},
"unit": {
"weight": "kg",
"bloodPressure": "mmHg",
"pulse": "bpm",
"bodyFat": "%",
"glucose": "mg/dL",
"sleep": "h",
"steps": "steps",
"totalBodyWater": "kg",
"boneMass": "kg",
"oxygenSaturation": "%"
}
}
},
"measurements": {
"title": "Measurements",
"subtitle": "Weight, blood pressure, pulse and more",
"addMeasurement": "Add",
"editMeasurement": "Edit measurement",
"type": "Type",
"value": "Value",
"date": "Date",
"source": "Source",
"notes": "Notes",
"typeWeight": "Weight",
"typeBloodPressure": "Blood Pressure",
"typeBpSys": "Sys",
"typeBpDia": "Dia",
"typePulse": "Pulse",
"typeBodyFat": "Body Fat",
"typeSleep": "Sleep",
"typeSteps": "Steps",
"typeBloodGlucose": "Blood glucose",
"typeTotalBodyWater": "Total body water",
"typeBoneMass": "Bone mass",
"typeOxygenSaturation": "Oxygen saturation",
"typeHeartRateVariability": "Heart-rate variability",
"typeRestingHeartRate": "Resting heart rate",
"typeActiveEnergyBurned": "Active energy",
"typeFlightsClimbed": "Flights climbed",
"typeWalkingRunningDistance": "Walking + running distance",
"typeVo2Max": "VO₂ max",
"typeBodyTemperature": "Body temperature",
"typeFatFreeMass": "Fat-free mass",
"typeFatMass": "Fat mass",
"typeMuscleMass": "Muscle mass",
"typeSkinTemperature": "Skin temperature",
"typePulseWaveVelocity": "Pulse-wave velocity",
"typeVascularAge": "Vascular age",
"typeVisceralFat": "Visceral fat",
"typeAudioExposureEnv": "Audio Exposure (Environment)",
"typeAudioExposureHeadphone": "Audio Exposure (Headphones)",
"typeTimeInDaylight": "Time in Daylight",
"typeWalkingSteadiness": "Walking Steadiness",
"typeAudioExposureEvent": "Loud-Listening Event",
"typeRespiratoryRate": "Respiratory rate",
"typeBodyMassIndex": "Body-mass index",
"typeLeanBodyMass": "Lean body mass",
"typeWalkingHeartRateAverage": "Walking heart rate (avg)",
"typeWalkingAsymmetry": "Walking asymmetry",
"typeWalkingDoubleSupport": "Walking double support",
"typeWalkingStepLength": "Walking step length",
"typeWalkingSpeed": "Walking speed",
"glucoseContext": "Context",
"glucoseContextFasting": "Fasting (≥8h without food)",
"glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed",
"unitHours": "hours",
"unitSteps": "steps",
"sourceManual": "Manual",
"sourceWithings": "Withings",
"sourceImport": "Import",
"sourceAppleHealth": "Apple Health",
"systolicLabel": "Systolic (mmHg)",
"diastolicLabel": "Diastolic (mmHg)",
"pulseLabel": "Pulse (bpm)",
"valueWithUnit": "Value ({unit})",
"timestamp": "Time",
"notesPlaceholder": "e.g. after a meal",
"formReset": "Reset form",
"saveError": "Error saving",
"duplicateTimestamp": "A measurement of this type already exists at the selected timestamp.",
"deleteError": "Error deleting",
"invalidValue": "Please enter a valid value.",
"invalidTimestamp": "Please select a valid time.",
"loginRequired": "Please sign in to view measurements.",
"allTypes": "All types",
"filterByType": "Filter by type",
"measurementCount": "{count} measurements",
"emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter",
"emptyFilteredDescription": "Try a different type or clear the filter to see all measurements.",
"emptyAddFirst": "Add your first measurement",
"emptyResetFilter": "Show all types",
"comment": "Comment",
"actions": "Actions",
"deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} of {total}",
"previousPage": "Previous page",
"nextPage": "Next page",
"dailyTotalCaption": "({count} samples)",
"expandDay": "Show samples for this day",
"collapseDay": "Hide samples for this day",
"loadError": "Could not load measurements.",
"typeCardioRecovery": "Cardio recovery",
"typeWristTemperature": "Wrist temperature",
"typeFallCount": "Falls",
"typeSixMinuteWalkDistance": "Six-minute walk distance",
"typeStairAscentSpeed": "Stair ascent speed",
"typeStairDescentSpeed": "Stair descent speed",
"typeBreathingDisturbances": "Sleep breathing disturbances",
"typeIrregularRhythmNotification": "Irregular rhythm notification",
"typeHighHeartRateEvent": "High heart rate notification",
"typeLowHeartRateEvent": "Low heart rate notification",
"typeWalkingSteadinessEvent": "Walking steadiness alert",
"typeBreathingDisturbanceEvent": "Breathing disturbance",
"typeRecoveryScore": "Recovery score",
"typeStressScore": "Stress score",
"typeStrainScore": "Strain score"
},
"mood": {
"title": "Mood",
"subtitle": "Mood tracker and entries",
"addEntry": "Add",
"editEntry": "Edit entry",
"moodLevel": "Mood",
"tags": "Tags",
"tagsPlaceholder": "e.g. Exercise, Work, Family",
"tagsHelp": "Comma-separated",
"timestamp": "Time",
"date": "Date",
"source": "Source",
"levelSuperGut": "Amazing",
"levelGut": "Good",
"levelOkay": "Okay",
"levelSchlecht": "Bad",
"levelLausig": "Terrible",
"sourceMoodlog": "moodLog",
"allMoods": "All moods",
"entryCount": "{count} entries",
"emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter",
"emptyFilteredDescription": "Try a different mood level or clear the filter to see all entries.",
"emptyAddFirst": "Log your first mood",
"emptyResetFilter": "Show all moods",
"actions": "Actions",
"formReset": "Reset form",
"saveError": "Error saving",
"deleteError": "Error deleting",
"invalidTimestamp": "Please select a valid time.",
"deleteConfirmTitle": "Delete entry?",
"deleteConfirmDescription": "This mood entry will be permanently deleted.",
"pageInfo": "Page {page} of {total}",
"loginRequired": "Please sign in to view mood entries.",
"note": "Note",
"notePlaceholder": "Add a note about how you're feeling…",
"tagPicker": "Tags",
"tagCategory": {
"feelings": "Feelings",
"sleep": "Sleep",
"health": "Health",
"social": "Social",
"work": "Work"
},
"tag": {
"happy": "happy",
"excited": "excited",
"grateful": "grateful",
"relaxed": "relaxed",
"content": "content",
"tired": "tired",
"unsure": "unsure",
"bored": "bored",
"tense": "tense",
"angry": "angry",
"stressed": "stressed",
"sad": "sad",
"sleptWell": "slept well",
"sleptOk": "slept okay",
"sleptPoorly": "slept poorly",
"earlyNight": "early night",
"workedOut": "worked out",
"ateWell": "ate well",
"hydrated": "hydrated",
"walked": "walked",
"alcohol": "alcohol",
"family": "family",
"friends": "friends",
"party": "party",
"alone": "alone",
"productive": "productive",
"overtime": "overtime",
"dayOff": "day off",
"travel": "travel",
"sickDay": "sick day"
}
},
"medications": {
"title": "Medications",
"subtitle": "Medications, schedules & intake",
"loginRequired": "Please sign in to manage medications.",
"addMedication": "Add",
"editMedication": "Edit medication",
"newMedication": "New medication",
"firstMedication": "Add first medication",
"emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications",
"retryLoad": "Retry",
"name": "Name",
"dose": "Dose",
"scheduleFrom": "From",
"scheduleTo": "To",
"scheduleLabel": "Label",
"scheduleDays": "Days",
"scheduleDaily": "Daily",
"inactive": "Paused",
"intakeHistory": "Intake history",
"openDetailPage": "Open medication detail page",
"deleteConfirm": "Delete medication?",
"compliance": "Compliance",
"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": "Blood Pressure",
"categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid",
"categoryHormone": "Hormones",
"categorySupplement": "Supplement",
"categoryPainRelief": "Pain Relief",
"categoryAllergy": "Allergy",
"categoryDigestive": "Gastrointestinal",
"categorySkin": "Skincare",
"categorySleepAid": "Sleep Aid",
"categoryDiabetes": "Diabetes",
"categoryAntibiotic": "Antibiotic",
"categoryOther": "Other",
"daysSun": "Sun",
"daysMon": "Mon",
"daysTue": "Tue",
"daysWed": "Wed",
"daysThu": "Thu",
"daysFri": "Fri",
"daysSat": "Sat",
"back": "Back",
"today": "Today",
"yesterday": "Yesterday",
"tomorrow": "Tomorrow",
"withoutNotification": "Without notification",
"pausedSince": "Paused since",
"takeNow": "Take now",
"overdue": "Overdue",
"veryOverdue": "Very overdue",
"compliance7d": "7-day compliance",
"compliance30d": "30-day compliance",
"complianceWindow": "{days}-day compliance",
"lastIntake": "Last intake:",
"nextIntake": "Next intake:",
"dayStreak": "day streak",
"taken": "Taken",
"skipped": "Skipped",
"intakeToastTaken": "{name} recorded as taken",
"intakeToastSkipped": "{name} skipped",
"weekdaySunday": "Sunday",
"weekdayMonday": "Monday",
"weekdayTuesday": "Tuesday",
"weekdayWednesday": "Wednesday",
"weekdayThursday": "Thursday",
"weekdayFriday": "Friday",
"weekdaySaturday": "Saturday",
"weekdaySundayPlural": "Sundays",
"weekdayMondayPlural": "Mondays",
"weekdayTuesdayPlural": "Tuesdays",
"weekdayWednesdayPlural": "Wednesdays",
"weekdayThursdayPlural": "Thursdays",
"weekdayFridayPlural": "Fridays",
"weekdaySaturdayPlural": "Saturdays",
"formType": "Type",
"formDose": "Dose",
"formUnit": "Unit",
"formSchedule": "Schedule",
"formTreatmentClass": "Treatment class",
"formTreatmentClassHelp": "Pick \"GLP-1 injection\" for weekly injectables like Mounjaro, Ozempic, Wegovy, Zepbound. Unlocks the body-map picker and the GLP-1 logbook below.",
"treatmentClassGeneric": "Standard medication",
"treatmentClassGlp1": "GLP-1 injection",
"glp1WeeklyPresetTitle": "Once weekly on …",
"glp1WeeklyPresetHelp": "Most GLP-1 receptor agonists are once-weekly. Tap a day to set the cadence.",
"glp1WeeklyPresetSuggest": "Use my last weekday choice",
"glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank if you don't track per-pen dosing.",
"glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjectionDays": "Next: {label} (in {days} days)",
"glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow",
"glp1RotationLast": "Last site: {site}",
"glp1RotationSuggested": "Recommended next: {site}",
"glp1LogSideEffect": "Log side effect",
"sideEffects": {
"section": "Side effects",
"addCta": "Log",
"sheetTitle": "Log a side effect",
"categoryLabel": "Category",
"entryLabel": "Symptom",
"severityLabel": "Severity",
"severity": {
"mild": "Mild",
"moderate": "Moderate",
"significant": "Significant",
"severe": "Severe",
"verySevere": "Very severe"
},
"notesLabel": "Notes (optional)",
"notesPlaceholder": "Anything worth remembering, max 280 characters",
"submitCta": "Save",
"cancelCta": "Cancel",
"emptyState": "No side effects logged yet. Tracking can help your doctor and surface patterns over time.",
"recentTitle": "Last 30 days",
"loading": "Loading…",
"deleteCta": "Delete",
"deleteConfirm": "Delete this entry?",
"errorSeverity": "Severity must be between 1 and 5",
"errorEntry": "Pick a symptom",
"categories": {
"gi": "Gastrointestinal",
"metabolic": "Metabolic",
"injectionSite": "Injection site",
"cognitive": "Cognitive",
"glp1Specific": "GLP-1 specific"
},
"entries": {
"nausea": "Nausea",
"vomiting": "Vomiting",
"diarrhea": "Diarrhoea",
"constipation": "Constipation",
"abdominalPain": "Abdominal pain",
"hypoglycemiaSymptoms": "Low-glucose symptoms",
"dehydration": "Dehydration",
"anorexia": "Decreased appetite",
"electrolyteFatigue": "Electrolyte-imbalance fatigue",
"injectionRedness": "Injection site redness",
"injectionSwelling": "Injection site swelling",
"injectionBruising": "Injection site bruising",
"injectionInduration": "Injection site induration",
"brainFog": "Brain fog",
"dizziness": "Dizziness",
"lowMood": "Low mood",
"lowEnergy": "Low energy",
"earlySatiety": "Early satiety",
"gastroparesisLike": "Slow stomach emptying",
"dysgeusia": "Taste change",
"gallbladderDiscomfort": "Gallbladder discomfort"
}
},
"scheduling": {
"naturalLanguage": {
"title": "Describe your medication",
"description": "Write the medication in your own words and we will pre-fill the form for you.",
"placeholder": "e.g. Mounjaro 5mg weekly on Wednesday morning starting next Monday",
"submit": "Extract",
"submitBusy": "Extracting…",
"cancel": "Cancel",
"examples": {
"label": "Try one of these examples",
"weekly": "Mounjaro 5mg weekly on Wednesday morning",
"daily": "Ibuprofen 200mg every day, 3 times a day",
"rolling": "Methotrexate 7.5mg every 7 days from last injection"
},
"error": {
"empty": "Type a description first.",
"tooLong": "Keep the description under 2000 characters.",
"rateLimit": "Too many requests — wait a moment and try again.",
"noProvider": "No AI provider configured — set one up in Settings.",
"budget": "Daily AI budget reached — try again tomorrow.",
"network": "Could not reach the AI provider — please retry."
}
},
"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": "Next: {step}",
"reviewHint": "Next: Save",
"jumpFirst": "Jump to the first step",
"jumpLast": "Jump to review and save"
},
"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": "Name"
},
"step2": {
"title": "What kind of medication is it?",
"subline": "We use this for the right templates and analytics.",
"short": "Type"
},
"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": "Route",
"deliveryForm": {
"ORAL": "Oral",
"INJECTION": "Injection",
"OTHER": "Other"
},
"dosesPerUnitLabel": "Doses per unit",
"dosesPerUnitPlaceholder": "e.g. 4",
"dosesPerUnitHint": "Doses per pen / vial — leave empty for no inventory tracking.",
"injectionSiteToggle": "Injection-site rotation",
"injectionSiteHint": "Optional rotation guide. The site for each dose is recorded when you log the intake.",
"short": "Dose"
},
"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": "When"
},
"step5": {
"title": "How often do you take it?",
"subline": "Pick the cadence — the details follow on the next step.",
"short": "Cadence"
},
"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": "Detail"
},
"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": "Times"
},
"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": "Done"
}
},
"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": "Dose strength over time",
"axisLabel": "Recorded dose ({unit})",
"tooltipLabel": "Dose",
"currentDose": "Current dose: {dose} {unit}",
"noCurrentDose": "No dose recorded yet.",
"empty": "No titration history yet. Log a dose change to see the strength curve."
},
"injectionSiteBodyOutlineAriaLabel": "Body outline",
"injectionSitePickerAriaLabel": "Injection site picker",
"injectionSiteRecommendedAriaLabel": "{site} — recommended next site",
"siteAbdomenLeft": "Abdomen, lower left",
"siteAbdomenRight": "Abdomen, lower right",
"siteAbdomenUpperLeft": "Abdomen, upper left",
"siteAbdomenUpperRight": "Abdomen, upper right",
"siteThighLeft": "Left thigh",
"siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation",
"sideEffectTagDiarrhea": "diarrhea",
"sideEffectTagFatigue": "fatigue",
"sideEffectTagAppetiteLoss": "appetite-loss",
"sideEffectTagHeartburn": "heartburn",
"sideEffectTagHeadache": "headache",
"newSchedule": "New schedule",
"removeSchedule": "Remove schedule",
"advancedEditing": "Advanced editing",
"advancedEditingHide": "Hide advanced editing",
"scheduleInterval": "Interval",
"scheduleEveryWeek": "every week",
"scheduleEveryNWeeks": "every {n} weeks",
"scheduleIntervalPrefix": "Interval:",
"nextSchedulePrefix": "Next schedule:",
"nextScheduleDaily": "daily",
"importIntakesAction": "Import intakes",
"apiEndpointAction": "API endpoint",
"pause": "Pause",
"activate": "Activate",
"disableNotifications": "Disable notifications",
"enableNotifications": "Enable notifications",
"purgeRecords": "Delete all records",
"formReset": "Reset form",
"createMedication": "Create medication",
"deleteConfirmDescription": "The medication and all intake history will be permanently deleted.",
"purgeConfirmTitle": "Delete all records?",
"purgeConfirmDescription": "All intake records for this medication will be permanently deleted. The medication itself will remain and start without history data.",
"saveError": "Error saving",
"deleteError": "Error deleting",
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"actions": "Actions",
"pageInfo": "Page {page} of {total}",
"previousPage": "Previous page",
"nextPage": "Next page",
"loginRequiredIntakes": "Please sign in to view intakes.",
"phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green",
"phaseYellow": "Yellow",
"phaseOrange": "Orange",
"phaseRed": "Red",
"phaseMinutes": "Min",
"phasePercent": "%",
"phaseBeforeEnd": "before end",
"phaseAfterEnd": "after end",
"phaseResetDefaults": "Reset to defaults",
"phaseSaved": "Reminder phases saved",
"phaseReset": "Reset to defaults",
"sourceWeb": "Web",
"sourceApi": "iOS App",
"sourceReminder": "Reminder",
"sourceImport": "Import",
"intakeSourceVia": "via {origin}",
"intakeHistoryEmptyTitle": "No intakes recorded yet",
"intakeHistoryEmptyDescription": "Log a dose on the daily intake page to start building the history.",
"intakeHistoryEmptyAction": "Open daily intake",
"intakeHistoryColTaken": "Taken",
"intakeHistoryColScheduled": "Scheduled",
"intakeHistoryColStatus": "Status",
"intakeHistoryColSource": "Source",
"intakeHistoryStatusTaken": "Taken",
"intakeHistoryStatusSkipped": "Skipped",
"intakeHistorySortByTaken": "Sort by taken time",
"intakeHistorySortByScheduled": "Sort by scheduled time",
"intakeHistoryPageInfo": "Page {page} of {total} · {count} entries",
"intakeHistoryPrev": "Previous",
"intakeHistoryNext": "Next",
"unitDrops": "Drops",
"unitTablets": "Tablet(s)",
"unitCapsules": "Capsule(s)",
"unitPieces": "Piece(s)",
"namePlaceholder": "e.g. Ibuprofen",
"dosePlaceholder": "e.g. 400",
"labelPlaceholder": "e.g. Morning",
"defaultDose": "Default",
"dayDeactivate": "Deactivate {day}",
"dayActivate": "Activate {day}",
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatide"
},
"semaglutide": {
"name": "Semaglutide"
},
"liraglutide": {
"name": "Liraglutide"
},
"dulaglutide": {
"name": "Dulaglutide"
},
"exenatide": {
"name": "Exenatide"
}
}
},
"researchMode": {
"dialog": {
"title": "Enable Research Mode",
"intro": "Research Mode adds an estimated drug-level chart to your GLP-1 medication page. Read the boundary below before turning it on — the chart is a learning aid, never a measurement, never medical advice.",
"whatItIsHeader": "What this is",
"whatItIs": "A sawtooth curve simulating how your logged doses superimpose over time, using the one-compartment Bateman model with absorption and half-life parameters published in the EMA EPAR for each approved GLP-1 receptor agonist. The vertical axis is unit-less and unlabeled. The shape, not the number, is what the chart shows.",
"whatItIsntHeader": "What this isn't",
"whatItIsnt": "Not a blood level. Not a measurement. Not a forecast of how your body actually responds. Not a basis for any dose, timing, or escalation decision. Talk to your prescribing clinician for anything that affects how you take your medication.",
"whyEstimateHeader": "Why it's an estimate",
"whyEstimate": "Population pharmacokinetics describe the typical patient. Individual variation is large — tirzepatide's Schneck/Urva 2024 model reports ~22% inter-individual variability on absorption and ~49% on volume of distribution. A textbook curve cannot capture your weight, kidney function, injection technique, or timing accuracy. Read the curve as the rhythm of dosing, not as your level.",
"mdrBoundaryHeader": "Regulatory boundary",
"mdrBoundary": "HealthLog displays public regulatory data and your own log entries. It does not predict, diagnose, treat, or recommend any therapy. EU Regulation 2017/745 (the Medical Device Regulation, MDR) and guidance document MDCG 2021-24 draw the line at software that interprets data for medical purposes — this chart stays decisively on the educational side of that line. If you ever feel it's nudging you toward a clinical decision, close it.",
"citationsHeader": "Sources",
"citations": "EMA European Public Assessment Reports for Mounjaro, Ozempic, Wegovy, Saxenda, Trulicity, Byetta, and Bydureon (Section 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": "Disclaimer version: {version}",
"acknowledgeCta": "I understand — enable",
"cancelCta": "Cancel",
"successToast": "Research Mode enabled. The drug-level chart is now visible on your GLP-1 medication page.",
"errorToast": "Could not enable Research Mode. Please try again.",
"staleVersionToast": "The disclaimer was updated since this page loaded. Reload to read the current version."
},
"chart": {
"title": "Estimated drug level",
"axisLabel": "Estimated level (relative)",
"emptyState": "No intake events yet.",
"emptyStateCta": "Log a dose to see the estimated level take shape.",
"estimateNote": "Educational estimate from EMA-published population pharmacokinetics. Not a measurement.",
"unknownDrug": "{name} is not in the EMA-approved GLP-1 catalog, so HealthLog cannot render a population-PK curve for it."
}
},
"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": "Clinical codes (ATC / RxNorm)",
"note": "Optional. Used on the FHIR health-record export. Codes are taken exactly as entered — never guessed.",
"atcLabel": "ATC",
"rxNormLabel": "RxNorm",
"saved": "Clinical codes saved",
"failed": "Could not save the clinical codes."
}
},
"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": "Edit plan",
"advancedOption": "Advanced settings"
},
"advanced": {
"title": "Advanced settings",
"group": {
"data": "Data",
"reminders": "Reminders",
"lifecycle": "Lifecycle",
"externalApi": "External API"
},
"dataPortability": {
"import": {
"title": "Import intakes",
"helper": "Load past intakes from a JSON file or pasted JSON.",
"button": "Import JSON"
},
"export": {
"title": "Export medication",
"helper": "Download this medication as a CSV file.",
"includeIntake": "Include intake history",
"button": "Export CSV"
}
}
},
"header": {
"historyLabel": "View intake history",
"advancedLabel": "Advanced settings"
},
"history": {
"back": "Back to medication",
"subtitle": "Full intake history",
"plannedSuffix": "planned"
}
},
"logInjectionSiteTitle": "Log injection site",
"logInjectionSiteDescription": "Where did you inject {name}? Optional — you can skip this.",
"logInjectionSiteSkip": "Skip",
"logInjectionSiteConfirm": "Save site",
"logInjectionSiteNoneAvailable": "No injection site is available — every site is excluded in your settings.",
"trackInjectionSitesToggle": "Track injection sites",
"trackInjectionSitesHint": "After a dose is taken, ask which site was used and suggest the next rotation.",
"allowedSitesLabel": "Allowed sites",
"allowedSitesHint": "Leave all selected for no restriction. Sites you excluded globally are never offered."
},
"charts": {
"loadingLabel": "Loading chart…",
"loadingSlowHint": "Computing analytics — this can take a moment.",
"weight": "Weight",
"bloodPressure": "Blood Pressure",
"pulse": "Pulse",
"bodyFat": "Body Fat",
"sleep": "Sleep",
"steps": "Steps",
"hrv": "HRV",
"restingHeartRate": "Resting heart rate",
"activeEnergy": "Active energy",
"flights": "Flights climbed",
"distance": "Walking + running distance",
"vo2Max": "VO₂ max",
"bodyTemperature": "Body temperature",
"noData": "No data in selected time range",
"bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg",
"points7Label": "7 pts",
"points7Title": "Last 7 data points",
"points30Label": "30 pts",
"points30Title": "Last 30 data points",
"points90Label": "90 pts",
"points90Title": "Last 90 data points",
"pointsAllLabel": "All",
"pointsAllTitle": "All available data points",
"systolic": "Systolic",
"diastolic": "Diastolic",
"bodyWater": "Body water",
"boneMass": "Bone mass",
"spo2": "SpO₂",
"movingAverage7d": "7-day trend",
"avg7dShort": "7d",
"avg30dShort": "30d",
"trend7dShort": "7-day trend",
"trend": "Trend",
"perWeek": "/week",
"totalDelta": "Total",
"colorGreen": "Green:",
"colorOrange": "Orange:",
"colorRed": "Red:",
"mood": "Mood",
"moodScore": "Mood Score",
"weekdays": {
"mon": "Mon",
"wed": "Wed",
"fri": "Fri",
"sun": "Sun"
},
"months": {
"jan": "Jan",
"feb": "Feb",
"mar": "Mar",
"apr": "Apr",
"may": "May",
"jun": "Jun",
"jul": "Jul",
"aug": "Aug",
"sep": "Sep",
"oct": "Oct",
"nov": "Nov",
"dec": "Dec"
},
"heatmapOnTime": "on time",
"heatmapLate": "late",
"heatmapVeryLate": "very late",
"legendOnTime": "On time",
"legendLate": "Late",
"legendVeryLate": "Very late",
"legendMissed": "Missed",
"emptyStateTitle": "Add more measurements to see trends",
"emptyStateDescription": "Log at least 3 entries to unlock the trend line.",
"needMoreDistinctDaysTitle": "More distinct days needed",
"needMoreDistinctDaysDescription": "Log on more days to unlock the trend line.",
"noDataInRangeTitle": "No data in this range",
"noDataInRangeDescription": "No measurements fall inside the selected range. Switch the range or log a new measurement.",
"personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal",
"deltaVsTarget": "{delta} vs. target",
"weekdaysFull": {
"mon": "Monday",
"tue": "Tuesday",
"wed": "Wednesday",
"thu": "Thursday",
"fri": "Friday",
"sat": "Saturday",
"sun": "Sunday"
},
"rangeBand": "Range"
},
"chart": {
"overlay": {
"controls": {
"title": "Chart overlays",
"trendIndicator": "7-day trend",
"trendArrow": "Trend arrow",
"targetRange": "Target range",
"comparisonBaseline": "Comparison",
"comparisonUnavailable": "No prior-period data yet",
"tooltip": {
"openSettings": "Chart overlay settings"
}
}
}
},
"comparison": {
"toggleLabel": "Compare to",
"toggleHint": "Show the same period from last year alongside today's chart.",
"baseline": {
"none": "None",
"lastMonth": "Last month",
"lastYear": "Last year"
},
"captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year",
"deltaVs": {
"lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year"
},
"tooltipPrior": "Prior period",
"unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year yet"
},
"notAvailableForCompliance": "Comparison N/A for compliance"
},
"insights": {
"noAnalysisYet": "No analysis yet.",
"assessmentPreparing": "Preparing your assessment…",
"emptyTitle": "Not enough data yet",
"emptyDescription": "Insights light up once you've logged a handful of measurements. Start with weight or blood pressure.",
"emptyAddMeasurement": "Add a measurement",
"bmiEmptyTitle": "Set your height to see BMI",
"bmiEmptyDescription": "BMI needs your height. Add it under Settings → Account.",
"bmiEmptyAction": "Open account settings",
"noProviderConfigured": "Assessment unavailable.",
"startAnalysis": "Start analysis",
"refreshAnalysis": "Refresh analysis",
"keyTakeaway": "Key Takeaway",
"findingsTitle": "Findings",
"heroFindingPositive": "Top finding",
"heroFindingNeutral": "Top finding",
"heroFindingAttention": "Worth attention",
"heroFindingWarning": "Top alert",
"correlationsTitle": "Correlations",
"recommendationsTitle": "Recommendations",
"personalRecord": {
"badge": "PR",
"tooltip": "Personal record: {value} {unit} on {date}"
},
"recommendation": {
"source": "Source",
"viewSource": "Open guideline in a new tab",
"rationale": "Why this recommendation",
"rationaleWindow": "Window",
"rationaleComparedTo": "Compared to",
"rationaleDeviation": "Deviation",
"rationaleExpand": "Show why",
"rationaleCollapse": "Hide why",
"legacyPayloadCta": "Insights updated — regenerate for new explainability features",
"feedbackHelpful": "Helpful",
"feedbackNotHelpful": "Not helpful",
"feedbackThanks": "Thanks for your feedback",
"feedbackConfirmed": "Feedback recorded",
"feedbackAlreadyRated": "Already rated",
"confidence": "Confidence",
"confidenceAria": "Confidence: {value} of 100",
"confidenceHigh": "High confidence",
"confidenceMedium": "Moderate confidence",
"confidenceLow": "Low confidence — based on limited data",
"confidenceDraft": "Draft"
},
"dataFoundation": "Data coverage",
"dataGaps": "Data gaps:",
"lastUpdated": "Last updated",
"confidenceHoch": "High",
"confidenceMittel": "Medium",
"confidenceGering": "Low",
"loadError": "Failed to load insights",
"heroGenerated": "Generated {time}",
"heroPersonalBaseline": "Based on your last 90 days",
"heroRegenerate": "Regenerate",
"heroRegenerating": "Regenerating",
"regenerateAnalysis": "Re-run analysis",
"regenerateSuccess": "Analysis refreshed",
"warmAssessments": "Prepare assessments",
"warmStarted": "Assessments are being prepared in the background",
"heroFallbackSubtitle": "A daily read of your trends, drawn straight from the numbers you've logged.",
"heroGreetingMorning": "Good morning",
"heroGreetingAfternoon": "Good afternoon",
"heroGreetingEvening": "Good evening",
"heroComingSoonTooltip": "Coming soon",
"heroActionAskCoach": "Ask the coach",
"healthScore": {
"label": "Health Score",
"progressAria": "Health Score progress",
"deltaVsLastWeek": "{delta} vs last week",
"deltaUnavailable": "No history yet — check back next week.",
"componentBp": "BP",
"componentWeight": "Weight",
"componentMood": "Mood",
"componentCompliance": "Meds",
"disclaimer": "Indicative — not a clinical assessment.",
"deltaExplainer": {
"trigger": "What does this delta mean?",
"title": "How the delta is computed",
"description": "Change vs last week: {delta}",
"body": "The score combines BP, weight, mood and meds. We compare today's score with the same time last week. Log a fresh reading or a mood check to nudge it up."
},
"provenance": {
"toggle": "Driven by",
"weightLabel": "share",
"mixedBanner": "Some components blend multiple sources. The breakdown shows the most recent value per component.",
"footnote": "Weights are rescaled to the data that's actually available.",
"asOfLabel": "as of {date}",
"provisional": "Provisional — only {count} of {total} inputs available",
"provisionalBadge": "Provisional",
"sourceAria": "Source: {source}",
"sources": {
"manual": "Manual",
"withings": "Withings",
"appleHealth": "Apple Health",
"mixed": "Mixed",
"none": "No data"
}
}
},
"suggestedPrompts": {
"label": "Try asking",
"whyMonday": "Why was BP higher on Monday?",
"weightVsPulse": "How did weight loss affect my pulse?",
"weekVsMonth": "Compare this week to last month",
"tellMyDoctor": "What should I tell my doctor?",
"medicationWorking": "Is my medication working?"
},
"dailyBriefing": {
"title": "Daily Briefing",
"keyFindingsTitle": "Key findings",
"emptyTitle": "No briefing yet",
"emptyDescription": "Generate today's briefing to get a narrative read of your trends.",
"emptyAction": "Generate briefing",
"loadingLabel": "Synthesising today's briefing"
},
"therapyTimeline": {
"title": "GLP-1 therapy timeline",
"description": "Chronological log of dose changes, injections, inventory events, and side-effect days.",
"empty": "No GLP-1 therapy events logged in the last 90 days.",
"doseTo": "dose set to",
"pens": "pens",
"sideEffects": "Side effects"
},
"trendsRow": {
"title": "Trends",
"subtitle": "Last 30 days at a glance",
"caption": {
"bp": "Systolic and diastolic readings over the last 30 days.",
"weight": "Body-weight trend over the last 30 days.",
"pulse": "Resting pulse over the last 30 days.",
"mood": "Daily mood score over the last 30 days.",
"sleep": "Nightly sleep duration over the last 30 days.",
"steps": "Daily step count over the last 30 days.",
"hrv": "Heart-rate variability over the last 30 days.",
"resting_hr": "Resting heart rate over the last 30 days.",
"active_energy": "Active energy burned over the last 30 days.",
"flights": "Flights of stairs climbed over the last 30 days.",
"distance": "Walking and running distance over the last 30 days.",
"vo2_max": "VO₂ max over the last 30 days.",
"body_temp": "Body temperature over the last 30 days."
}
},
"vo2Max": {
"statLatest": "Latest",
"statMin": "Min",
"statMax": "Max",
"empty": "No VO₂ max data yet — sync Apple Health to populate this view."
},
"trendAnnotation": {
"emptyBp": "Awaiting more data to annotate this trend.",
"emptyWeight": "Awaiting more data to annotate this trend.",
"emptyMood": "Awaiting more data to annotate this trend.",
"confidenceHigh": "High confidence",
"confidenceModerate": "Moderate confidence",
"confidenceLow": "Low confidence",
"pendingLabel": "Generating trend commentary"
},
"range": {
"label": "Time range",
"noPriorData": "no prior-period data",
"option": {
"7d": "7d",
"30d": "30d",
"90d": "90d",
"1y": "1y"
},
"priorLabel": {
"7d": "vs prior 7d",
"30d": "vs prior 30d",
"90d": "vs prior 90d",
"1y": "vs prior year"
},
"noChange": "no change"
},
"correlationRow": {
"title": "Relationships",
"subtitle": "Pre-defined hypotheses, gated on n ≥ 14 and p < 0.05",
"disclaimer": "Relationships are observational, not causal — talk to your doctor if BP runs high.",
"experimentCta": "Try a 7-day experiment",
"experimentTooltip": "Coming soon",
"emptyTitle": "Need more data to see this relationship",
"sourceChip": "based on {n} paired readings · {window}",
"sourceWindowLast30": "last 30 days",
"confidenceHigh": "High confidence",
"confidenceModerate": "Moderate confidence",
"confidenceLow": "Low confidence",
"card": {
"bpComplianceTitle": "BP × medication compliance",
"bpComplianceSubtitle": "Daily systolic against compliance %",
"moodPulseTitle": "Mood × resting pulse",
"moodPulseSubtitle": "Same-day mood and resting pulse",
"weightWeekdayTitle": "Weight × weekday",
"weightWeekdaySubtitle": "Weight grouped by day of week"
}
},
"coach": {
"refusalOutOfScope": "I can only help with the health metrics in your log — measurements, medications, mood, trends. I cannot answer questions outside that scope.",
"refusalInjection": "I noticed wording that tries to override my instructions. I am the HealthLog Coach and only summarise your own health data — please rephrase your question in those terms.",
"errorBudget": "You've reached today's Coach usage limit. The budget refreshes at midnight UTC.",
"errorProvider": "The Coach could not reach an Insights provider just now. Please try again in a moment.",
"errorNetwork": "No internet connection — try again once you're back online.",
"tagline": "Personal health coach, grounded in your data.",
"newChat": "New chat",
"send": "Send",
"thinking": "Thinking…",
"composerPlaceholder": "Ask anything about your data…",
"composerHint": "Press Enter to send, Shift+Enter for a new line.",
"composerDisclaimer": "Coach replies are generated. Clinical decisions belong with your doctor.",
"voiceComingSoon": "Voice input arrives with the iOS app in v1.5.",
"threadEmpty": "Ask anything about your trends, medications, or readings to start a conversation.",
"historyTitle": "Conversations",
"historySearchPlaceholder": "Search conversations…",
"historyEmpty": "Your conversations will appear here. Ask anything to start.",
"historyDeleteAria": "Delete conversation",
"historyDeleteConfirm": "Delete this conversation? This cannot be undone.",
"sourcesTitle": "What I can see",
"sourcesFresh": "Fresh",
"sourcesStale": "Stale",
"sourcesFooter": "The Coach reads only the data you've connected.",
"evidenceLabel": "What I'm looking at",
"metric": {
"bp": "Blood pressure",
"weight": "Weight",
"pulse": "Pulse",
"mood": "Mood",
"compliance": "Compliance",
"general": "General",
"hrv": "HRV",
"sleep": "Sleep",
"resting_hr": "Resting HR",
"steps": "Steps",
"active_energy": "Active energy",
"flights": "Flights climbed",
"distance": "Distance",
"vo2_max": "VO₂ max",
"body_temp": "Body temperature",
"medications": "Medications",
"anthropometrics": "Profile (height, age, gender)",
"walking_hr": "Walking heart rate",
"respiratory_rate": "Respiratory rate",
"spo2": "Blood oxygen",
"pulse_wave_velocity": "Pulse-wave velocity",
"vascular_age": "Vascular age",
"body_fat": "Body fat",
"fat_mass": "Fat mass",
"fat_free_mass": "Fat-free mass",
"muscle_mass": "Muscle mass",
"lean_body_mass": "Lean body mass",
"bone_mass": "Bone mass",
"total_body_water": "Body water",
"bmi": "BMI",
"visceral_fat": "Visceral fat",
"glucose": "Glucose",
"walking_steadiness": "Walking steadiness",
"walking_asymmetry": "Walking asymmetry",
"walking_double_support": "Double support time",
"walking_step_length": "Step length",
"walking_speed": "Walking speed",
"audio_env": "Environmental sound",
"audio_headphone": "Headphone audio",
"audio_event": "Loud-sound events",
"daylight": "Time in daylight",
"skin_temp": "Skin temperature",
"workouts": "Workouts"
},
"window": {
"last7days": "last 7 days",
"last30days": "last 30 days",
"last90days": "last 90 days",
"lastYear": "year so far",
"allTime": "all time"
},
"windowLabel": "Window",
"settingsAriaLabel": "Coach settings",
"settingsTitle": "Coach settings",
"settingsDescription": "Tune how the Coach talks with you.",
"settingsToneLabel": "Tone",
"settingsToneWarm": "Warm",
"settingsToneNeutral": "Neutral",
"settingsToneConcise": "Concise",
"settingsVerbosityLabel": "Reply length",
"settingsVerbosityBrief": "Brief",
"settingsVerbosityDefault": "Default",
"settingsVerbosityDetailed": "Detailed",
"settingsExcludeLabel": "Exclude metrics",
"settingsExcludeHint": "The Coach will not see data for selected metrics.",
"settingsContextLabel": "Include context",
"settingsContextHint": "Optional blocks the Coach can lean on. Switch one off and the block is dropped from every turn.",
"settingsEvidenceLabel": "Show evidence by default",
"settingsEvidenceHint": "Open the disclosure under every reply automatically.",
"settingsDefaultWindowLabel": "Default analysis window",
"settingsDefaultWindowHint": "The Coach reads this much history per chat unless you override it from the drawer header.",
"settingsSave": "Save",
"settingsSaved": "Saved.",
"settingsCancel": "Cancel",
"feedbackHelpful": "Helpful",
"feedbackUnhelpful": "Not quite",
"feedbackThanks": "Thanks for the signal.",
"dailyLimitTitle": "Daily limit reached",
"dailyLimitBody": "Daily limit reached; resets at 00:00 UTC.",
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min.",
"cluster": {
"cardio": {
"label": "Cardiovascular",
"hint": "BP · pulse · HRV · resting & walking HR"
},
"body": {
"label": "Body composition",
"hint": "Weight · body fat · muscle · BMI"
},
"activity": {
"label": "Activity",
"hint": "Steps · energy · distance · VO₂ max"
},
"workouts": {
"label": "Workouts",
"hint": "Runs · rides · sessions"
},
"sleep": {
"label": "Sleep",
"hint": "Duration · stages"
},
"mood": {
"label": "Mood",
"hint": "Daily mood entries"
},
"glucose": {
"label": "Glucose",
"hint": "Fasting · postprandial readings"
},
"medication": {
"label": "Medication",
"hint": "Adherence · GLP-1 context"
},
"mobility": {
"label": "Mobility & gait",
"hint": "Steadiness · asymmetry · gait"
},
"environment": {
"label": "Environment",
"hint": "Noise · daylight · skin temp"
}
},
"settingsClustersLabel": "Data the Coach sees",
"settingsClustersHint": "Pick which clusters of your data the Coach can read. More data means richer answers and a larger prompt.",
"settingsClusterNoData": "No data yet",
"sourcesMemberCount": "{count} metrics"
},
"relativeJustNow": "just now",
"relativeMinutesAgoOne": "{count} minute ago",
"relativeMinutesAgoOther": "{count} minutes ago",
"relativeHoursAgoOne": "{count} hour ago",
"relativeHoursAgoOther": "{count} hours ago",
"relativeDaysAgoOne": "{count} day ago",
"relativeDaysAgoOther": "{count} days ago",
"navOverview": "Overview",
"navBloodPressure": "Blood Pressure",
"navWeight": "Weight",
"navPulse": "Pulse",
"navMood": "Mood",
"navMedication": "Medication",
"navBmi": "BMI",
"navSleep": "Sleep",
"navHrv": "HRV",
"navRestingHr": "Resting HR",
"navOxygenSaturation": "Oxygen",
"navBodyTemperature": "Temperature",
"navActiveEnergy": "Active energy",
"navAriaLabel": "Skip to section",
"tabStrip": {
"vitalsParent": {
"label": "Vitals",
"header": "Vital signs"
},
"bodyParent": {
"label": "Body",
"header": "Body composition"
},
"activityParent": {
"label": "Activity",
"header": "Activity & mobility"
},
"cardiovascularParent": {
"label": "Cardiovascular",
"header": "Cardiovascular markers"
},
"hearingParent": {
"label": "Hearing",
"header": "Hearing & audio exposure"
},
"environmentParent": {
"label": "Environment",
"header": "Environment"
},
"metabolicParent": {
"label": "Metabolic",
"header": "Metabolic"
}
},
"hrv": {
"title": "HRV",
"description": "Heart-rate variability over time — your nervous-system recovery signal, captured during sleep by Apple Watch and other compatible wearables.",
"chartTitle": "Heart-rate variability",
"emptyState": {
"title": "No HRV samples yet",
"description": "HRV samples land here once Apple Watch (or a compatible Withings device) starts syncing nightly readings."
}
},
"restingHr": {
"title": "Resting heart rate",
"description": "The daily floor your heart settles at — distinct from the spot pulse samples on the pulse page. Apple Health surfaces one value per day.",
"chartTitle": "Resting heart rate",
"emptyState": {
"title": "No resting heart rate yet",
"description": "Resting heart rate arrives once Apple Watch or a compatible Withings device has worn through one quiet day."
}
},
"oxygenSaturation": {
"title": "Oxygen saturation",
"description": "Blood oxygen (SpO₂) — clinical normal is 95–100 %, with target zones shaded on the chart.",
"chartTitle": "Oxygen saturation",
"emptyState": {
"title": "No SpO₂ samples yet",
"description": "SpO₂ samples land here once a compatible wearable (Apple Watch, Withings ScanWatch) captures a reading."
}
},
"bodyTemperature": {
"title": "Body temperature",
"description": "Core body temperature trend — Celsius. Skin-temperature readings from Withings live on a separate metric.",
"chartTitle": "Body temperature",
"emptyState": {
"title": "No body temperature yet",
"description": "Log a body-temperature reading or let your wearable sync one, and the trend will appear here.",
"cta": "Log body temperature"
}
},
"activeEnergy": {
"title": "Active energy",
"description": "Daily active-energy total in kilocalories — one row per day, sourced from Apple Health or Withings activity.",
"chartTitle": "Active energy",
"emptyState": {
"title": "No active-energy data yet",
"description": "Active-energy totals land here once Apple Health or a Withings activity device syncs a day's worth of movement."
}
},
"subPage": {
"blutdruckDescription": "Your systolic / diastolic trend with age-personalised target zones and a written assessment.",
"gewichtDescription": "Weight trend mapped against your height-derived healthy band, plus a written assessment.",
"pulsDescription": "Pulse trend against the personalised Karvonen target band, plus a written assessment.",
"stimmungDescription": "Daily mood scores over time with a written assessment.",
"stimmungEmptyTitle": "Log your first mood",
"stimmungEmptyDescription": "Mood insights light up once you've logged a few entries. Tap below to get started.",
"stimmungEmptyAction": "Open mood journal",
"medikamenteDescription": "Per-medication adherence calendars and a written assessment.",
"medikamenteEmptyTitle": "Add your first medication",
"medikamenteEmptyDescription": "Compliance insights need at least one tracked medication.",
"medikamenteEmptyAction": "Open medications",
"therapyTimelineDescription": "Chronological GLP-1 therapy log — dose changes, injections, inventory, side effects.",
"bmiDescription": "BMI derived from your weight and height, with a written assessment.",
"target": {
"range": "Target: {min}–{max} {unit}",
"bpRange": "Target: {sysMin}–{sysMax} / {diaMin}–{diaMax} {unit}",
"inTargetShare": "{pct}% of logged days within target",
"adjustLink": "Adjust target range"
},
"explainer": {
"trigger": "What is {title}?",
"bloodPressureTitle": "Blood pressure",
"bloodPressureBody": "Blood pressure is the force your blood exerts on the artery walls, written as systolic over diastolic (the peak during a heartbeat over the resting value between beats). Consistently high readings strain the heart and blood vessels over time.",
"pulseTitle": "Pulse",
"pulseBody": "Your pulse is how many times your heart beats per minute. A spot reading reflects what you were doing in the moment — at rest it is typically 60–100 beats per minute, and it rises naturally with movement, stress, or caffeine.",
"weightTitle": "Weight",
"weightBody": "Body weight is one of the simplest signals of long-term energy balance and overall health. The trend over weeks matters far more than any single reading, which fluctuates with hydration, food, and time of day.",
"bmiTitle": "Body mass index (BMI)",
"bmiBody": "BMI is your weight divided by your height squared, giving a single number that places you in a broad weight category. It is a population-level screen, not a diagnosis, and does not distinguish muscle from fat.",
"sleepTitle": "Sleep",
"sleepBody": "Sleep duration is how long you actually slept across the night, split into light, deep, and REM stages. Most adults need roughly seven to nine hours; both consistent quantity and quality support recovery, mood, and metabolism.",
"moodTitle": "Mood",
"moodBody": "Mood tracking records how you feel over time on a simple scale. Logging it regularly reveals patterns — how sleep, activity, or medication line up with how you feel — that a single day never shows.",
"medicationsTitle": "Medication adherence",
"medicationsBody": "Adherence is how reliably you take your medication as prescribed, shown here as the share of expected doses you actually logged. Steady intake is often what makes a treatment work as intended.",
"restingHrTitle": "Resting heart rate",
"restingHrBody": "Resting heart rate is your heart rate when you are completely at rest, usually measured overnight. A lower resting rate generally points to better cardiovascular fitness, and a rising trend can be an early sign of stress or illness.",
"hrvTitle": "Heart rate variability (HRV)",
"hrvBody": "HRV is the tiny variation in time between consecutive heartbeats. Higher variability usually reflects a well-recovered, adaptable nervous system, while a sustained drop can signal fatigue, stress, or insufficient recovery.",
"oxygenSaturationTitle": "Oxygen saturation (SpO₂)",
"oxygenSaturationBody": "SpO₂ is the percentage of your red blood cells carrying oxygen. Readings of 95–100% are normal at rest; values that stay below 90% warrant attention, though brief nightly dips are common.",
"bodyTemperatureTitle": "Body temperature",
"bodyTemperatureBody": "Body temperature reflects your core thermal state, normally around 37 °C with small daily swings. A sustained rise can indicate infection, while overnight wrist readings mainly track relative changes rather than a clinical value.",
"activeEnergyTitle": "Active energy",
"activeEnergyBody": "Active energy is the calories you burn through movement, on top of the baseline your body uses at rest. It is a direct measure of how physically active your day was.",
"workoutsTitle": "Workouts",
"workoutsBody": "Workouts are the structured exercise sessions your devices record, with type, duration, and energy. Tracking them shows how regular training accumulates over weeks and how it relates to your other health signals.",
"respiratoryRateTitle": "Respiratory rate",
"respiratoryRateBody": "Respiratory rate is the number of breaths you take per minute. At rest most adults breathe roughly twelve to twenty times a minute; a sustained rise can accompany illness, exertion, or stress.",
"bodyWaterTitle": "Total body water",
"bodyWaterBody": "Total body water is the share of your body weight made up of fluid, inside and around your cells. It shifts with hydration, food, and activity, so the trend over weeks tells you more than any single reading.",
"boneMassTitle": "Bone mass",
"boneMassBody": "Bone mass is the estimated weight of the mineral in your skeleton. Scale-based estimates are approximate, but a steady or rising trend supports long-term bone strength.",
"fatFreeMassTitle": "Fat-free mass",
"fatFreeMassBody": "Fat-free mass is everything in your body that is not fat — muscle, bone, organs, and water. Holding or building it while losing weight usually signals healthier body composition.",
"fatMassTitle": "Fat mass",
"fatMassBody": "Fat mass is the total weight of fat in your body. Some fat is essential for hormones and energy storage, but too much — especially around the abdomen — raises long-term health risk.",
"muscleMassTitle": "Muscle mass",
"muscleMassBody": "Muscle mass is the estimated weight of the muscle in your body. More muscle supports strength, metabolism, and mobility, and it tends to need active effort to preserve as you age.",
"visceralFatTitle": "Visceral fat",
"visceralFatBody": "Visceral fat is the fat stored deep in the abdomen around your organs. Unlike fat under the skin, a high level is closely linked to heart disease and type 2 diabetes, so lower is generally better.",
"leanBodyMassTitle": "Lean body mass",
"leanBodyMassBody": "Lean body mass is your total weight minus body fat — muscle, bone, organs, and water combined. Tracking it alongside weight shows whether changes come from muscle or from fat.",
"flightsClimbedTitle": "Flights climbed",
"flightsClimbedBody": "Flights climbed counts the floors you go up each day, with one flight roughly ten feet of elevation. It is a simple marker of incidental activity and lower-body effort.",
"walkingDistanceTitle": "Walking + running distance",
"walkingDistanceBody": "Walking and running distance is the ground you cover on foot each day. It complements step count by reflecting how far you moved, not just how often you stepped.",
"walkingSteadinessTitle": "Walking steadiness",
"walkingSteadinessBody": "Walking steadiness estimates how stable and balanced your gait is, classed from OK to low. A lower level points to a higher chance of a fall and is worth discussing with a clinician.",
"walkingHeartRateTitle": "Walking heart rate",
"walkingHeartRateBody": "Walking heart rate is your average pulse during a steady walk. A lower walking rate over time often reflects improving cardiovascular fitness for the same effort.",
"walkingAsymmetryTitle": "Walking asymmetry",
"walkingAsymmetryBody": "Walking asymmetry is the share of time your steps are uneven between the left and right leg. A higher percentage can point to pain, injury, or a gait problem worth looking into.",
"doubleSupportTimeTitle": "Double support time",
"doubleSupportTimeBody": "Double support time is the share of each walking cycle when both feet touch the ground at once. A higher percentage usually means a more cautious, less stable gait.",
"stepLengthTitle": "Step length",
"stepLengthBody": "Step length is the average distance from one footfall to the next. A shorter step over time can reflect fatigue, caution, or a change in mobility.",
"walkingSpeedTitle": "Walking speed",
"walkingSpeedBody": "Walking speed is how fast you move on a level walk. It is a well-studied marker of overall health and mobility, and a steady or rising pace is a good sign.",
"pulseWaveVelocityTitle": "Pulse wave velocity",
"pulseWaveVelocityBody": "Pulse wave velocity measures how fast the pressure wave from each heartbeat travels along your arteries. A faster wave indicates stiffer arteries, which is linked to higher cardiovascular risk.",
"vascularAgeTitle": "Vascular age",
"vascularAgeBody": "Vascular age estimates how old your arteries behave compared with your actual age, based on arterial stiffness. A vascular age below your real age suggests healthier blood vessels.",
"environmentalAudioTitle": "Environmental sound levels",
"environmentalAudioBody": "Environmental sound levels track the loudness of the world around you in decibels. Prolonged exposure above about 70 dB can damage hearing over time, so lower daily averages are safer.",
"headphoneAudioTitle": "Headphone audio levels",
"headphoneAudioBody": "Headphone audio levels track how loudly you listen through earbuds or headphones, in decibels. Keeping the volume down and taking breaks protects your hearing over the long run.",
"audioEventsTitle": "Loud sound events",
"audioEventsBody": "Loud sound events flag moments when noise around you reached a level that can harm hearing with enough exposure. Frequent events are a cue to seek quieter surroundings or hearing protection.",
"daylightTitle": "Time in daylight",
"daylightBody": "Time in daylight is how long you spend in outdoor light each day. Regular daylight supports a healthy sleep-wake rhythm and mood, and time outdoors is linked to eye health.",
"bloodGlucoseTitle": "Blood glucose",
"bloodGlucoseBody": "Blood glucose is the amount of sugar in your blood, the body's main energy source. It rises after eating and settles between meals; readings that stay high over time can signal diabetes or prediabetes.",
"skinTemperatureTitle": "Skin temperature",
"skinTemperatureBody": "Skin temperature here is the small nightly change in your wrist temperature from your own baseline, not an absolute fever reading. Shifts can track sleep, environment, illness, or menstrual-cycle phase.",
"cardioFitnessTitle": "Cardio fitness (VO₂ max)",
"cardioFitnessBody": "VO₂ max is how much oxygen your body can use at peak effort. It is the single best lab marker of aerobic fitness, and a higher or rising value is a strong sign of cardiovascular health.",
"cardioRecoveryTitle": "Cardio recovery",
"cardioRecoveryBody": "Cardio recovery is how many beats per minute your heart rate falls in the first minute after you stop hard exercise. A bigger drop means your heart settles down faster, which is a sign of good fitness.",
"wristTemperatureTitle": "Wrist temperature",
"wristTemperatureBody": "Wrist temperature is measured while you sleep. Apple shows it as the difference from your personal baseline; a steady reading is normal, while a sustained rise can hint at illness, intense training, or a cycle change.",
"fallsTitle": "Falls",
"fallsBody": "This counts the hard falls your Apple Watch detects. Zero is the goal; a rising count is a mobility-risk signal worth raising with a clinician, especially for older adults.",
"sixMinuteWalkTitle": "Six-minute walk distance",
"sixMinuteWalkBody": "This is Apple's estimate of how far you could walk in six minutes — a long-standing clinical test of mobility and cardiopulmonary endurance. A steady or rising distance is a good sign.",
"stairAscentSpeedTitle": "Stair ascent speed",
"stairAscentSpeedBody": "This is how fast you climb a flight of stairs. It is a sensitive marker of leg strength and mobility — a steady or rising pace is a good sign, and a falling one is worth watching.",
"stairDescentSpeedTitle": "Stair descent speed",
"stairDescentSpeedBody": "This is how fast you go down a flight of stairs. Together with ascent speed it tracks leg control and balance — a steady pace is a good sign, and a falling one is worth watching.",
"breathingDisturbancesTitle": "Sleep breathing disturbances",
"breathingDisturbancesBody": "Your Apple Watch can estimate how often your breathing was interrupted during sleep. A lower index is better; a level Apple flags as elevated, especially over many nights, is worth raising with a clinician."
},
"stats": {
"label": "Summary statistics",
"min": "Min",
"max": "Max",
"median": "Median",
"mean": "Mean"
},
"showAllValues": "Show all readings",
"valuesPageTitle": "{metric} — all readings",
"valuesPageDescription": "Every reading behind this metric. Edit or remove an entry directly.",
"diversity": {
"trigger": "Measurement tip",
"weekday": "Most of your {metric} readings land on one weekday. Logging on other days gives a fuller picture.",
"timeOfDay": "Most of your {metric} readings land at a similar time of day. Varying the time gives a fuller picture."
},
"valuesBack": "Back to insights",
"valuesBackToMetric": "Back to {metric}",
"scoresBack": "Back to insights"
},
"sleep": {
"title": "Sleep",
"description": "Stage breakdown and nightly duration, drawn from Apple Health.",
"headlineTitle": "Average per night",
"headlineCaption": "Averaged across {count} nights — {suffix}",
"headlineCaptionSuffix": "per night",
"compositionTitle": "Stage composition",
"compositionSubtitle": "Last {nights} nights",
"compositionAriaLabel": "Sleep stage composition over {nights} nights",
"stages": {
"deep": "Deep",
"rem": "REM",
"core": "Core",
"asleep": "Asleep",
"awake": "Awake",
"inBed": "In bed",
"unavailable": "No stage data yet — Apple Health stage syncing arrives in v1.5."
},
"empty": {
"title": "No sleep data yet",
"description": "Apple Health sync arrives in v1.5 and will fill this in automatically.",
"action": "Manage devices"
}
},
"correlations": "Correlations",
"medicationCompliance": "Medication Compliance",
"dayStreak": "{count} day streak",
"compliance7d": "7-day compliance",
"compliance30d": "30-day compliance",
"taken": "taken",
"skipped": "skipped",
"missed": "missed",
"generalStatusBadge": {
"good": "Good",
"watch": "Watch",
"critical": "Critical"
},
"assessmentTitle": "Assessment",
"bloodPressureSectionTitle": "Blood Pressure",
"weightSectionTitle": "Weight",
"pulseSectionTitle": "Pulse",
"bmiSectionTitle": "BMI",
"complianceNoData": "No compliance data available.",
"generate": "Generate new analysis",
"moodSectionTitle": "Mood",
"confidence": "Confidence",
"cached": "Cached",
"emptyState": {
"bloodPressure": {
"title": "No blood pressure entries yet",
"description": "Log a blood pressure reading and the trend chart, in-range share, and WHO classification will appear here.",
"cta": "Log blood pressure"
},
"weight": {
"title": "No weight entries yet",
"description": "Log a weight and the trend, moving average, and target band will appear automatically.",
"cta": "Log weight"
},
"pulse": {
"title": "No pulse entries yet",
"description": "Log a pulse reading and resting pulse, HRV and VO₂ max will appear in this view.",
"cta": "Log pulse"
},
"bmi": {
"title": "BMI not yet computed",
"description": "Once height and at least one weight entry are present, the BMI trend with WHO zones will appear here.",
"cta": "Log weight"
},
"mood": {
"title": "No mood entries yet",
"description": "Log a mood entry and the trend, stability band and correlations will appear.",
"cta": "Log mood"
},
"medication": {
"title": "No medications set up yet",
"description": "Set up a medication and intake compliance, drug level and titration timeline will appear here.",
"cta": "Add medication"
},
"sleep": {
"title": "No sleep entries yet",
"description": "Once sleep data lands (manual or via Withings / Apple Health), the per-night stage breakdown will appear here.",
"cta": "Connect Withings"
}
},
"navWorkouts": "Workouts",
"workouts": {
"title": "Workouts",
"description": "Recent runs, rides, walks and strength sessions, deduped across Apple Watch and Withings sources.",
"emptyState": {
"title": "No workouts yet",
"description": "Open the Apple Health app on your iPhone to sync workouts here. Withings activity import keeps walking and cycling sessions flowing in too."
},
"row": {
"duration": "Duration",
"distance": "Distance",
"energy": "Active energy"
},
"detail": {
"backToList": "Back to workouts",
"statsTitle": "Stats",
"statsDuration": "Duration",
"statsDistance": "Distance",
"statsActiveEnergy": "Active energy",
"statsAvgHr": "Average HR",
"statsMaxHr": "Max HR",
"statsMinHr": "Min HR",
"statsStepCount": "Steps",
"statsElevation": "Elevation",
"statsPace": "Pace",
"statsSource": "Source",
"routeTitle": "Route",
"routeUnavailable": "No GPS route recorded for this workout.",
"hrChartTitle": "Heart rate",
"hrChartUnavailable": "Per-second heart-rate samples are not stored for this workout.",
"notFound": "Workout not found.",
"loading": "Loading workout…"
},
"sport": {
"walking": "Walking",
"running": "Running",
"cycling": "Cycling",
"hiking": "Hiking",
"swimming": "Swimming",
"rowing": "Rowing",
"elliptical": "Elliptical",
"stairClimber": "Stair climber",
"yoga": "Yoga",
"mindAndBody": "Mind and body",
"strength": "Strength",
"hiit": "HIIT",
"dance": "Dance",
"golf": "Golf",
"tennis": "Tennis",
"basketball": "Basketball",
"soccer": "Soccer",
"crossTraining": "Cross training",
"mixedCardio": "Mixed cardio",
"other": "Other"
}
},
"bloodGlucose": {
"title": "Blood Glucose",
"description": "Your blood-glucose readings over time, in mg/dL.",
"chartTitle": "Blood glucose",
"emptyState": {
"title": "No glucose data yet",
"description": "Blood-glucose readings appear here once you log one or a connected device syncs."
}
},
"navBloodGlucose": "Glucose",
"totalBodyWater": {
"title": "Total Body Water",
"description": "Your total body water over time, in kilograms.",
"chartTitle": "Total body water",
"emptyState": {
"title": "No body-water data yet",
"description": "Body-water readings appear here once a connected body-composition scale syncs."
}
},
"navTotalBodyWater": "Body Water",
"boneMass": {
"title": "Bone Mass",
"description": "Your bone mass over time, in kilograms.",
"chartTitle": "Bone mass",
"emptyState": {
"title": "No bone-mass data yet",
"description": "Bone-mass readings appear here once a connected body-composition scale syncs."
}
},
"navBoneMass": "Bone Mass",
"flightsClimbed": {
"title": "Flights Climbed",
"description": "Flights of stairs you climbed each day.",
"chartTitle": "Flights climbed per day",
"emptyState": {
"title": "No flights data yet",
"description": "Flights-climbed totals appear here once Apple Health syncs a day's movement."
}
},
"navFlightsClimbed": "Flights",
"walkingRunningDistance": {
"title": "Walking + Running Distance",
"description": "Walking and running distance you covered each day, in kilometres.",
"chartTitle": "Distance per day",
"emptyState": {
"title": "No distance data yet",
"description": "Daily distance appears here once Apple Health syncs a day's movement."
}
},
"navWalkingRunningDistance": "Distance",
"fatFreeMass": {
"title": "Fat-Free Mass",
"description": "Your fat-free mass over time, in kilograms.",
"chartTitle": "Fat-free mass",
"emptyState": {
"title": "No fat-free-mass data yet",
"description": "Fat-free-mass readings appear here once a connected body-composition scale syncs."
}
},
"navFatFreeMass": "Fat-Free Mass",
"fatMass": {
"title": "Fat Mass",
"description": "Your fat mass over time, in kilograms.",
"chartTitle": "Fat mass",
"emptyState": {
"title": "No fat-mass data yet",
"description": "Fat-mass readings appear here once a connected body-composition scale syncs."
}
},
"navFatMass": "Fat Mass",
"muscleMass": {
"title": "Muscle Mass",
"description": "Your muscle mass over time, in kilograms.",
"chartTitle": "Muscle mass",
"emptyState": {
"title": "No muscle-mass data yet",
"description": "Muscle-mass readings appear here once a connected body-composition scale syncs."
}
},
"navMuscleMass": "Muscle Mass",
"skinTemperature": {
"title": "Skin Temperature",
"description": "Your wrist skin temperature over time, in degrees Celsius.",
"chartTitle": "Skin temperature",
"emptyState": {
"title": "No skin-temperature data yet",
"description": "Skin-temperature readings appear here once a wearable syncs overnight wrist temperature."
}
},
"navSkinTemperature": "Skin Temp",
"pulseWaveVelocity": {
"title": "Pulse Wave Velocity",
"description": "Your arterial pulse-wave velocity over time, in m/s — higher values suggest stiffer arteries.",
"chartTitle": "Pulse wave velocity",
"emptyState": {
"title": "No pulse-wave-velocity data yet",
"description": "Pulse-wave-velocity readings appear here once a compatible Withings device syncs."
}
},
"navPulseWaveVelocity": "Pulse Wave Velocity",
"vascularAge": {
"title": "Vascular Age",
"description": "Your estimated vascular age over time, in years.",
"chartTitle": "Vascular age",
"emptyState": {
"title": "No vascular-age data yet",
"description": "Vascular-age estimates appear here once a compatible Withings device syncs."
}
},
"navVascularAge": "Vascular Age",
"visceralFat": {
"title": "Visceral Fat",
"description": "Your visceral-fat rating over time.",
"chartTitle": "Visceral fat",
"emptyState": {
"title": "No visceral-fat data yet",
"description": "Visceral-fat ratings appear here once a compatible body-composition scale syncs."
}
},
"navVisceralFat": "Visceral Fat",
"audioExposureEnv": {
"title": "Environmental Audio",
"description": "Your daily average environmental sound exposure, in dBA.",
"chartTitle": "Environmental sound exposure",
"emptyState": {
"title": "No environmental-audio data yet",
"description": "Environmental sound-level readings appear here once Apple Health syncs."
}
},
"navAudioExposureEnv": "Environmental Audio",
"audioExposureHeadphone": {
"title": "Headphone Audio",
"description": "Your daily average headphone audio exposure, in dBA.",
"chartTitle": "Headphone audio exposure",
"emptyState": {
"title": "No headphone-audio data yet",
"description": "Headphone audio-level readings appear here once Apple Health syncs."
}
},
"navAudioExposureHeadphone": "Headphone Audio",
"timeInDaylight": {
"title": "Time in Daylight",
"description": "Minutes spent in daylight each day.",
"chartTitle": "Time in daylight per day",
"emptyState": {
"title": "No daylight data yet",
"description": "Daylight totals appear here once Apple Health syncs a day's exposure."
}
},
"navTimeInDaylight": "Daylight",
"walkingSteadiness": {
"title": "Walking Steadiness",
"description": "Your walking steadiness over time, as a percentage.",
"chartTitle": "Walking steadiness",
"emptyState": {
"title": "No walking-steadiness data yet",
"description": "Walking-steadiness readings appear here once Apple Health syncs."
}
},
"navWalkingSteadiness": "Walking Steadiness",
"audioExposureEvent": {
"title": "Loud Audio Events",
"description": "Days with a loud-environment exposure event.",
"chartTitle": "Loud-environment events per day",
"emptyState": {
"title": "No loud-event data yet",
"description": "Loud-environment events appear here once Apple Health syncs."
}
},
"navAudioExposureEvent": "Loud Events",
"respiratoryRate": {
"title": "Respiratory Rate",
"description": "Your respiratory rate over time, in breaths per minute.",
"chartTitle": "Respiratory rate",
"emptyState": {
"title": "No respiratory-rate data yet",
"description": "Respiratory-rate readings appear here once Apple Health syncs sleep or workout breathing."
}
},
"navRespiratoryRate": "Respiratory Rate",
"leanBodyMass": {
"title": "Lean Body Mass",
"description": "Your lean body mass over time, in kilograms.",
"chartTitle": "Lean body mass",
"emptyState": {
"title": "No lean-body-mass data yet",
"description": "Lean-body-mass readings appear here once a connected body-composition scale syncs."
}
},
"navLeanBodyMass": "Lean Body Mass",
"walkingHeartRateAverage": {
"title": "Walking Heart Rate",
"description": "Your average heart rate while walking, in bpm.",
"chartTitle": "Walking heart rate average",
"emptyState": {
"title": "No walking-heart-rate data yet",
"description": "Walking-heart-rate readings appear here once Apple Health syncs."
}
},
"navWalkingHeartRateAverage": "Walking Heart Rate",
"walkingAsymmetry": {
"title": "Walking Asymmetry",
"description": "Your walking asymmetry over time, as a percentage.",
"chartTitle": "Walking asymmetry",
"emptyState": {
"title": "No walking-asymmetry data yet",
"description": "Walking-asymmetry readings appear here once Apple Health syncs."
}
},
"navWalkingAsymmetry": "Walking Asymmetry",
"walkingDoubleSupport": {
"title": "Double Support Time",
"description": "The percentage of each stride spent with both feet on the ground.",
"chartTitle": "Double support time",
"emptyState": {
"title": "No double-support data yet",
"description": "Double-support readings appear here once Apple Health syncs."
}
},
"navWalkingDoubleSupport": "Double Support",
"walkingStepLength": {
"title": "Walking Step Length",
"description": "Your average walking step length over time, in metres.",
"chartTitle": "Step length",
"emptyState": {
"title": "No step-length data yet",
"description": "Step-length readings appear here once Apple Health syncs."
}
},
"navWalkingStepLength": "Step Length",
"walkingSpeed": {
"title": "Walking Speed",
"description": "Your average walking speed over time, in km/h.",
"chartTitle": "Walking speed (km/h)",
"emptyState": {
"title": "No walking-speed data yet",
"description": "Walking-speed readings appear here once Apple Health syncs."
}
},
"navWalkingSpeed": "Walking Speed",
"mood": {
"heatmapTitle": "Mood calendar",
"heatmapNoEntry": "No entry",
"legendGreat": "Great",
"legendGood": "Good",
"legendOkay": "Okay",
"legendLow": "Low",
"distributionTitle": "Mood distribution",
"distributionDaysUnit": "days",
"weekdayTitle": "Average by weekday",
"weekdayNoData": "No data",
"weekdayBestWorst": "Best day: {best} · Toughest day: {worst}",
"tagsTitle": "Tags and triggers",
"tagAvgMood": "Average mood when tagged",
"correlationsTitle": "Mood and other metrics",
"correlationsDescription": "How your mood moves with sleep, activity, and pulse on the same day.",
"correlation": {
"sleepTitle": "Mood vs. sleep",
"stepsTitle": "Mood vs. activity",
"pulseTitle": "Mood vs. pulse",
"sleepAxis": "Sleep (min)",
"stepsAxis": "Steps",
"pulseAxis": "Pulse (bpm)",
"strengthStrong": "Strong",
"strengthModerate": "Moderate",
"strengthWeak": "Weak",
"strengthNone": "None",
"source": "{n} paired days · r = {r}",
"emptyTitle": "Not enough paired data yet",
"emptyDescription": "Log mood and this metric on the same days to see a correlation.",
"weightTitle": "Mood vs. weight",
"bloodPressureTitle": "Mood vs. blood pressure",
"weightAxis": "Weight",
"bloodPressureAxis": "Systolic (mmHg)"
},
"structuredTagsTitle": "Tag breakdown",
"inTargetValue": "{pct}%",
"inTargetCaption": "of recent days in your good-mood range",
"narrative": {
"title": "What stands out",
"weekdayDip": "Your mood dips most on {weekday} — {delta} below your week.",
"weekdayPeak": "{weekday} is consistently your best day, averaging {value}.",
"trendUp": "Your mood is trending up over the last {days} days (+{delta} vs the prior period).",
"trendDown": "Your mood is trending down over the last {days} days (-{delta} vs the prior period).",
"weekendUp": "You feel better on weekends (+{delta} vs weekdays).",
"weekendDown": "Your mood runs lower on weekends (-{delta} vs weekdays).",
"tagLift": "Days tagged \"{tag}\" average {delta} above your overall mood.",
"tagDrop": "Days tagged \"{tag}\" run {delta} below your average.",
"inTarget": "You've been in your good-mood range {pct}% of the last 30 days.",
"streak": "You've logged your mood {days} days in a row — keep it up.",
"timeOfDay": "You feel best in the {bucket}, averaging {value}."
},
"timeOfDay": {
"title": "Mood by time of day",
"morning": "Morning",
"afternoon": "Afternoon",
"evening": "Evening",
"night": "Night",
"bestCaption": "You tend to feel best in the {bucket}."
},
"stability": {
"value": "{score}/100",
"bandVerySteady": "Your mood has been very steady",
"bandSteady": "Your mood has been fairly steady",
"bandVariable": "Your mood has been noticeably variable",
"bandVeryVariable": "Your mood has swung a lot lately"
}
},
"derived": {
"coverage": {
"summary": "{present} of {required} inputs · {percent}%",
"ratioLabel": "{present}/{required}",
"historyDays": "Based on {count} days of history",
"missing": "Track these to sharpen this: {list}"
},
"scoreRing": {
"aria": "Score {score} out of 100, {band}",
"ariaProvisional": "Score not available yet — not enough data",
"provisionalCaption": "Not enough data yet",
"band": {
"green": "good",
"yellow": "fair",
"red": "low"
}
},
"provenance": {
"title": "How this is computed",
"trigger": "How this is computed",
"inputsLabel": "Inputs",
"noInputs": "No inputs backed this value yet.",
"methodLabel": "Method",
"window": "From your last {days} days · {source} data",
"asOf": "as of {date}",
"standardLink": "Standard: {name}"
},
"vitals": {
"sectionTitle": "Your vitals",
"loadingLabel": "Loading your vitals",
"loadError": "Could not load your vitals right now.",
"building": "Building your typical range — {count} of {target} days",
"typicalRange": "Typical for you: {low}–{high}",
"fitnessYounger": "Cardio fitness of someone ~{years} yr younger",
"fitnessOlder": "Cardio fitness ~{years} yr above your age",
"fitnessTypical": "Cardio fitness typical for your age",
"fitnessNoNorm": "Add your age and sex to frame this",
"vascularBelow": "{years} yr below your age",
"vascularAbove": "{years} yr above your age",
"vascularMatch": "In line with your age",
"vascularNoAge": "Add your date of birth to frame this",
"hrvBand": {
"balanced": "Balanced for you",
"unbalanced": "Above your usual range",
"low": "Below your usual range"
},
"bmiCategory": {
"underweight": "Underweight (WHO)",
"normal": "Normal range (WHO)",
"overweight": "Overweight (WHO)",
"obese": "Obese (WHO)"
},
"sixMinuteBand": {
"green": "{percent}% of predicted for your profile",
"yellow": "{percent}% of predicted for your profile",
"red": "{percent}% of predicted for your profile"
},
"sixMinuteNoBand": "Add your age, height, weight and sex to frame this",
"mobilitySectionTitle": "Mobility & body"
},
"anatomy": {
"outOf": "/100",
"contributorsLabel": "Contributors",
"contributorValue": "{value} · {weight}% weight",
"contributorMissing": "no data",
"disclaimer": "Indicative — not a clinical assessment.",
"insufficient": "Not enough data yet to score this. Keep tracking and it will appear here."
},
"composite": {
"SLEEP_SCORE": {
"title": "Sleep score",
"description": "A transparent sleep-quality score with every sub-score shown.",
"method": "A 0–100 blend of sufficiency (asleep vs your age-based need), efficiency (asleep ÷ in-bed), consistency (how steady your sleep midpoint is), timing (vs your habitual midpoint) and composition (REM + deep share). Sub-scores reweight around any that your data cannot support; nothing is fabricated.",
"sub": {
"sufficiency": "Sufficiency",
"efficiency": "Efficiency",
"consistency": "Consistency",
"timing": "Timing",
"composition": "Composition"
}
},
"READINESS": {
"title": "Readiness",
"description": "A daily wellness proxy from how your signals sit against your own baseline.",
"method": "A 0–100 blend of resting-HR deviation, HRV (SDNN) deviation, sleep adequacy, respiratory-rate stability and mood stability — each measured against your personal baseline. Weights renormalise over the components your data supports. A wellness proxy, not a recovery or clinical score.",
"component": {
"rhr": "Resting heart rate",
"hrv": "HRV (SDNN)",
"sleep": "Sleep",
"respiratory": "Respiratory rate",
"mood": "Mood stability"
},
"caveat": "A wellness proxy, not a recovery or clinical score."
},
"VITALS_BASELINE": {
"method": "Your personal typical range is the median of your daily values over the window, ± a robust spread (median absolute deviation, scaled). It tracks YOUR readings, not a population norm — so a value inside the band is typical for you."
},
"HRV_BALANCE": {
"method": "Your recent HRV (SDNN) average placed against your own rolling baseline (median ± a robust spread). Balanced means it sits inside your personal range; the band is built from your data, never a population cut-off."
},
"BMI": {
"method": "Weight ÷ height², classified against the WHO adult categories (underweight / normal / overweight / obese). A screening ratio only — it does not distinguish muscle from fat."
},
"FITNESS_AGE": {
"method": "Your VO₂max placed against age- and sex-referenced cardiorespiratory-fitness percentiles, expressed as a fitness-age delta. The VO₂max is your device's estimate — never recomputed here."
},
"VASCULAR_AGE_DELTA": {
"method": "Your device's vascular-age / pulse-wave-velocity estimate compared with your chronological age, expressed as a delta in years. The estimate is the device's; HealthLog only re-frames it.",
"caveat": "Your device's own estimate, re-framed — descriptive, not a clinical vascular assessment.",
"description": "How your device's vascular-age estimate sits against your chronological age."
},
"COINCIDENT_DEVIATION": {
"method": "A flag raised when two or more of your vitals sit outside their personal typical range on the same day. Each band is the robust median ± k·MAD of your own history, so it adapts to you rather than to a population cut-off.",
"caveat": "An awareness flag from your own baselines — descriptive, not a diagnosis or a clinical alert."
},
"RECOVERY_SCORE": {
"method": "A nightly 0–100 recovery proxy blended from your HRV, resting heart rate and sleep against your own baseline. Higher means better-recovered. Computed once each night and read back here — never recomputed on the fly.",
"caveat": "A descriptive wellness proxy, not a training-grade or clinical recovery measure.",
"description": "A nightly recovery proxy from your HRV, resting heart rate and sleep."
},
"STRESS_SCORE": {
"method": "A nightly 0–100 stress proxy from the shape of your intra-day HRV against your baseline. Higher means more physiological load.",
"caveat": "An HRV-derived proxy, NOT an EDA / galvanic-skin stress measurement — your watch has no EDA sensor. Descriptive, not clinical.",
"description": "A nightly stress proxy from the shape of your intra-day HRV."
},
"STRAIN_SCORE": {
"method": "A nightly 0–100 strain proxy from your heart-rate-weighted activity load (a TRIMP-style training-impulse model). Higher means a harder day.",
"anchorPersonal": "Anchored to your own recent training-day load — scored relative to your typical effort, so a genuinely hard day for you reads high.",
"anchorPopulation": "Scored against a general reference while you build training history; once you have enough it switches to your own typical effort.",
"caveat": "A descriptive activity-load proxy, not a clinical or training-grade load measure.",
"description": "A nightly activity-load proxy from your heart-rate-weighted effort, relative to your typical effort."
},
"WRIST_TEMPERATURE_BASELINE": {
"method": "Your typical overnight wrist temperature is the median of your nightly readings over the window, ± a robust spread (median absolute deviation, scaled). It tracks YOUR readings — last night is shown as a deviation from your own baseline, not a population norm.",
"caveat": "A personal-deviation band only — descriptive, not an illness, fever or cycle-phase signal. Interpret it yourself."
},
"STAIR_ASCENT_SPEED_BASELINE": {
"method": "Your typical stair-climbing pace is the median of your daily values over the window, ± a robust spread (median absolute deviation, scaled). The band is built from your data — there is no population stair-speed cut-off, because pace depends on stair geometry and leg length.",
"caveat": "A personal mobility-trend band — descriptive, not a frailty or fall-risk assessment."
},
"STAIR_DESCENT_SPEED_BASELINE": {
"method": "Your typical stair-descent pace is the median of your daily values over the window, ± a robust spread (median absolute deviation, scaled). The band is built from your data — there is no population stair-speed cut-off, because pace depends on stair geometry and leg length.",
"caveat": "A personal mobility-trend band — descriptive, not a frailty or fall-risk assessment."
},
"SIX_MINUTE_WALK_BAND": {
"method": "Your device's ESTIMATED six-minute-walk distance placed against the Enright & Sherrill reference for your age, height, weight and sex, as a percent of predicted. The distance is the device's estimate — never recomputed here. Without your age, height, weight and sex the percent is hidden and only the distance and trend are shown.",
"caveat": "An estimate re-framed against a published reference — a functional-capacity awareness signal, not a clinical 6-minute-walk test or a diagnosis. The reference was established for ages 40–80; outside that range the predicted value is an extrapolation."
}
},
"scores": {
"sectionTitle": "Wellness scores",
"recovery": "Recovery",
"stress": "Stress",
"strain": "Strain"
},
"coincident": {
"label": "Several vitals off baseline",
"summary": "{count} of your vitals sat outside their personal range today.",
"vitals": "Outside range: {list}",
"cardTitle": "Today's signal",
"allClear": "All your vitals are within their personal range today.",
"allClearMeta": "Checked {count} of your vitals against your own typical range.",
"watch": "One vital is outside its usual range today.",
"watchVital": "Outside range: {vital}. Often just a one-off — worth a glance over the next few days.",
"firedHeadline": "{count} of your vitals are outside their personal range today.",
"factors": "Possible factors — never a cause: a hard workout, poor sleep, alcohol, altitude, stress, or illness. This is awareness from your own baselines, not a diagnosis.",
"building": "Building your personal baselines — track a few more days and this will appear."
}
},
"cardioFitness": {
"title": "Cardio Fitness",
"description": "Your VO₂ max over time — the headline measure of aerobic fitness.",
"chartTitle": "VO₂ max (mL/(kg·min))",
"emptyState": {
"title": "No cardio-fitness data yet",
"description": "VO₂ max readings appear here once Apple Health syncs from your workouts."
}
},
"navCardioFitness": "Cardio Fitness",
"cardioRecovery": {
"title": "Cardio Recovery",
"description": "How far your heart rate drops one minute after peak exercise.",
"chartTitle": "Cardio recovery (bpm)",
"emptyState": {
"title": "No cardio-recovery data yet",
"description": "Cardio-recovery readings appear here once Apple Health syncs from a workout."
}
},
"navCardioRecovery": "Cardio Recovery",
"wristTemperature": {
"title": "Wrist Temperature",
"description": "Your overnight wrist temperature, tracked against your own baseline.",
"chartTitle": "Wrist temperature (°C)",
"emptyState": {
"title": "No wrist-temperature data yet",
"description": "Wrist-temperature readings appear here once Apple Health syncs overnight wear."
}
},
"navWristTemperature": "Wrist Temp",
"falls": {
"title": "Falls",
"description": "Hard falls your Apple Watch detected, counted per day.",
"chartTitle": "Falls per day",
"emptyState": {
"title": "No fall data yet",
"description": "Detected falls appear here once Apple Health syncs. No falls is the goal."
}
},
"navFalls": "Falls",
"sixMinuteWalk": {
"title": "Six-Minute Walk",
"description": "Apple's estimate of how far you could walk in six minutes.",
"chartTitle": "Six-minute walk distance (m)",
"emptyState": {
"title": "No six-minute-walk data yet",
"description": "Six-minute-walk estimates appear here once Apple Health syncs."
}
},
"navSixMinuteWalk": "6-Min Walk",
"stairAscentSpeed": {
"title": "Stair Ascent Speed",
"description": "How fast you climb stairs, measured by your iPhone or Watch.",
"chartTitle": "Stair ascent speed (m/s)",
"emptyState": {
"title": "No stair-ascent-speed data yet",
"description": "Stair-ascent-speed readings appear here once Apple Health syncs."
}
},
"navStairAscentSpeed": "Stair Ascent",
"stairDescentSpeed": {
"title": "Stair Descent Speed",
"description": "How fast you go down stairs, measured by your iPhone or Watch.",
"chartTitle": "Stair descent speed (m/s)",
"emptyState": {
"title": "No stair-descent-speed data yet",
"description": "Stair-descent-speed readings appear here once Apple Health syncs."
}
},
"navStairDescentSpeed": "Stair Descent",
"breathingDisturbances": {
"title": "Breathing Disturbances",
"description": "How often your breathing was disturbed during sleep.",
"chartTitle": "Sleep breathing disturbances",
"emptyState": {
"title": "No breathing-disturbance data yet",
"description": "Sleep-breathing readings appear here once Apple Health syncs from a supported Apple Watch."
}
},
"navBreathingDisturbances": "Breathing",
"rhythmEvents": {
"sectionTitle": "Device health notifications",
"sectionIntro": "Notifications your watch sent on its own. HealthLog only shows these — it does not detect, confirm, or interpret them.",
"loadError": "Could not load your device notifications.",
"disclaimer": "These are alerts your device produced using its own built-in detection. They are shown here for your awareness only. This is not a medical assessment by HealthLog, and HealthLog does not diagnose any condition. If a notification concerns you, talk to your doctor.",
"event": {
"irregularRhythm": "Irregular rhythm notification",
"highHeartRate": "High heart rate notification",
"lowHeartRate": "Low heart rate notification",
"walkingSteadiness": "Walking steadiness alert",
"breathingDisturbance": "Breathing disturbance during sleep"
},
"verdict": {
"irregular": "Your device flagged a possible irregular rhythm.",
"notDetected": "Your device did not flag an irregular rhythm.",
"inconclusive": "Your device could not make a reading.",
"low": "Your device flagged low walking steadiness.",
"veryLow": "Your device flagged very low walking steadiness.",
"fired": "Your device flagged this event."
}
}
},
"thresholds": {
"defaultLabel": "Default",
"autoModeLabel": "Auto",
"overrideModeLabel": "Override",
"overrideToggleLabel": "Custom range",
"resetAction": "Reset to default",
"resetAllAction": "Reset all to default",
"minLabel": "Min",
"maxLabel": "Max",
"unitSuffix": "({unit})",
"outOfBoundsHint": "Allowed range: {min}–{max} {unit}",
"overrideWarning": "Overriding with values outside guideline ranges may produce unhealthy targets. Only do this on doctor's advice.",
"saveSuccess": "Thresholds updated",
"saveError": "Could not save thresholds",
"resetSuccess": "Reset to default",
"sourceOverride": "User override",
"metricWeight": "Weight",
"metricBpSys": "Blood pressure (systolic)",
"metricBpDia": "Blood pressure (diastolic)",
"metricPulse": "Resting pulse",
"metricBodyFat": "Body fat",
"metricSleep": "Sleep duration",
"metricSteps": "Daily steps",
"metricGlucoseFasting": "Glucose — fasting",
"metricGlucosePostprandial": "Glucose — post-meal",
"metricGlucoseRandom": "Glucose — random",
"metricGlucoseBedtime": "Glucose — bedtime",
"metricBodyWater": "Body water",
"metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"tour": {
"stepOf": "Step {current} of {total}",
"next": "Next",
"back": "Back",
"skip": "Skip tour",
"done": "Got it",
"restart": "Restart onboarding tour",
"restartHint": "Replay the dashboard walkthrough from the start.",
"restartConfirmation": "Tour will restart on your next dashboard visit.",
"steps": {
"tileStrip": {
"title": "Your daily numbers",
"body": "The tile strip shows the latest reading and a 7-day trend for every metric you log — weight, blood pressure, pulse, mood. Hide what you don't need from Settings → Dashboard."
},
"quickAdd": {
"title": "Log anything in two taps",
"body": "Use the Add button to drop a measurement or mood entry without leaving the dashboard. The form remembers your last context and tags."
},
"insights": {
"title": "Automatic insights",
"body": "Insights turns your readings into a plain-English health summary, with classifications for blood pressure, weight trend and mood. Bring your own provider key or use the built-in default."
},
"integrations": {
"title": "Connect your devices",
"body": "Open Settings to link Withings (auto-sync weight, BP and pulse), moodLog, or your Insights provider. Everything stays optional and encrypted."
},
"achievements": {
"title": "Earn streaks and badges",
"body": "The Achievements page tracks daily logging streaks, blood-pressure milestones and consistency badges. A small nudge to keep going."
}
}
},
"shell": {
"back": "Back",
"skip": "Skip",
"next": "Continue",
"step1of4": "Step 1 of 4",
"step2of4": "Step 2 of 4",
"step3of4": "Step 3 of 4",
"step4of4": "Step 4 of 4"
},
"goals": {
"title": "What would you like to track?",
"body": "Pick the areas you care about. Your dashboard and the default reminders follow your choice.",
"helpHint": "One to three priorities tend to work best — you can always add more later.",
"options": {
"weightManagement": "Weight management",
"bpTracking": "Blood pressure",
"glucoseTracking": "Glucose",
"sleepImprovement": "Better sleep",
"medicationCompliance": "Medications",
"generalWellness": "General wellness"
}
},
"source": {
"title": "Connect a source",
"body": "Bring in measurements automatically, or stay on manual entry — your call.",
"recommended": "Recommended",
"manual": {
"title": "Manual entry",
"body": "Log readings yourself, whenever it fits. Works on any device, no third-party account required."
},
"withings": {
"title": "Withings",
"body": "Scales, blood-pressure cuffs and trackers from Withings sync automatically.",
"cta": "Connect Withings"
},
"appleHealth": {
"title": "Apple Health",
"body": "iPhone and Apple Watch data flow in via the HealthLog iOS app.",
"badge": "Coming with v1.5 (iOS)",
"disabledHint": "Available once the iOS app ships."
}
},
"baseline": {
"title": "A bit about you",
"body": "Four optional fields sharpen target ranges, BMI and reminders. You can adjust any of them later in Settings.",
"displayNameLabel": "Display name",
"displayNamePlaceholder": "How should HealthLog address you?",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
"heightLabel": "Height (cm)",
"genderLabel": "Gender",
"genderNone": "Prefer not to say",
"genderMale": "Male",
"genderFemale": "Female",
"dateOfBirthLabel": "Date of birth",
"dateOfBirthHint": "Used only for age-aware analytics.",
"saveCta": "Save and continue"
},
"done": {
"title": "You're all set",
"body": "Welcome aboard. Your dashboard is ready.",
"returnCta": "Open dashboard"
},
"welcomeBack": {
"title": "Welcome back",
"body": "You've already finished onboarding. To adjust anything, head to Settings — everything you set up is editable from there.",
"cta": "Open dashboard"
},
"welcome": {
"title": "Welcome to HealthLog",
"carouselLabel": "Welcome carousel",
"slideOf": "Slide {current} of {total}",
"prevSlide": "Previous slide",
"nextSlide": "Next slide",
"gotoSlide": "Go to slide {index}",
"cta": "Get started",
"slide1": {
"title": "Track every signal",
"body": "Weight, blood pressure, glucose, sleep, mood — keep your full picture in one log you own."
},
"slide2": {
"title": "Connect your sources",
"body": "Sync with Apple Health and Withings, or add readings by hand. Your data stays on your server."
},
"slide3": {
"title": "See the pattern",
"body": "Daily summaries, trend charts, and a coach that surfaces what changed — all on your own device."
}
}
},
"gettingStarted": {
"title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} of {total} done",
"dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item",
"items": {
"profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.",
"profileCta": "Open profile",
"measurementTitle": "Log your first measurement",
"measurementDescription": "One reading unlocks the tile — the trend itself draws from your 5th reading.",
"measurementCta": "Add measurement",
"medicationTitle": "Add a medication",
"medicationDescription": "Track compliance and get reminders right when you need them.",
"medicationCta": "Add medication",
"withingsTitle": "Connect Withings (optional)",
"withingsDescription": "Auto-sync weight, BP and pulse from your Withings devices.",
"withingsCta": "Connect",
"notificationsTitle": "Configure notifications",
"notificationsDescription": "Choose how HealthLog should remind you — Telegram, ntfy or Web Push.",
"notificationsCta": "Open notifications"
}
},
"trendHints": {
"title": "First trend after 5 readings",
"remainingOne": "1 more reading to go.",
"remainingMany": "{count} more readings to go."
},
"settings": {
"researchMode": {
"sectionTitle": "Research Mode",
"subtitle": "Opt-in display of an estimated GLP-1 drug-level curve, derived from EMA-published population pharmacokinetics. Reading-only — never a measurement or medical advice.",
"toggleLabel": "Show the estimated drug-level chart",
"disabledStatus": "Disabled. The drug-level chart is hidden.",
"enabledStaleStatus": "The disclaimer was updated. Re-acknowledge below to bring the chart back.",
"acknowledgedOn": "Acknowledged on {date}.",
"rePromptTitle": "Disclaimer updated",
"rePromptBody": "The Research Mode disclaimer was updated since you last acknowledged it. Re-read and re-confirm to keep the chart visible.",
"rePromptCta": "Re-acknowledge disclaimer",
"disableError": "Could not disable Research Mode. Please try again."
},
"shell": {
"sectionsNav": "Settings sections"
},
"sections": {
"account": {
"title": "Account",
"description": "Profile, password, passkeys, and your onboarding tour."
},
"integrations": {
"title": "Integrations",
"description": "Withings, moodLog, and other connected services."
},
"notifications": {
"title": "Notifications",
"description": "Live overview of every configured channel."
},
"dashboard": {
"title": "Dashboard",
"description": "Tile layout and order."
},
"thresholds": {
"title": "Targets",
"description": "Per metric: your own target range for healthy values."
},
"sources": {
"title": "Sources",
"description": "Pick which ingest source wins when more than one records the same metric for the same day.",
"cardTitle": "Source priority by metric",
"help": "When more than one source delivers the same value on the same day (e.g. Withings and Apple Health both report 1,200 steps), the top source counts as the canonical reading. Other sources stay stored for the audit trail.",
"resetDefaults": "Reset to defaults",
"moveUp": "Move up",
"moveDown": "Move down",
"saveSuccess": "Source priority saved.",
"saveError": "Saving the source priority failed.",
"resetSuccess": "Source priority reset to defaults.",
"perMetricToggle": "Per-metric overrides ({count})",
"perMetricHelp": "Metrics you have customised away from the default ladder. Use this list to roll any single metric back to its constant default without touching the rest.",
"perMetricEmpty": "No per-metric overrides set — every metric uses the global ladder above.",
"resetMetric": "Reset",
"deviceTypeToggle": "Device-type priority ({count})",
"deviceTypeHelp": "Within a source, which device wins. When an Apple Watch and an iPhone both record steps, the higher-ranked device-type counts as the canonical reading.",
"deviceTypeDefault": "Default device-type ladder",
"resetDeviceTypes": "Reset device-types",
"metrics": {
"steps": "Steps",
"activeEnergy": "Active energy",
"walkingRunningDistance": "Walking + running distance",
"flightsClimbed": "Flights climbed",
"sleep": "Sleep",
"weight": "Weight",
"bloodPressure": "Blood pressure",
"pulse": "Pulse",
"bodyFat": "Body fat",
"bodyTemperature": "Body temperature",
"spo2": "Oxygen saturation",
"hrv": "Heart-rate variability",
"restingHeartRate": "Resting heart rate",
"vo2Max": "VO2 max"
},
"sourceLabels": {
"WITHINGS": "Withings",
"APPLE_HEALTH": "Apple Health",
"MANUAL": "Manual entry",
"IMPORT": "Import"
},
"deviceLabels": {
"watch": "Watch",
"band": "Band",
"ring": "Ring",
"phone": "Phone",
"scale": "Scale",
"other": "Other",
"unknown": "Unknown"
}
},
"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": "Advanced",
"description": "Opt-in Research Mode toggle plus the account-wide danger zone for wiping every health record."
},
"export": {
"title": "Export",
"description": "Download your health data as PDF, CSV, or a full JSON backup.",
"otherOptionsHeading": "Other export options",
"hero": {
"eyebrow": "Doctor visit",
"valueStatement": "A printable PDF report for your doctor's appointment — vitals, BMI, blood-pressure classification, medication compliance and (optionally) mood, all on a few pages.",
"cta": "Configure & generate report",
"formatHint": "PDF · print-ready"
},
"actions": {
"download": "Download"
},
"filters": {
"since": "From",
"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": "Medications",
"description": "Your medication list with dosage, schedules, and (optionally) the full intake history.",
"includeIntake": "Include intake history"
},
"moodCsv": {
"title": "Mood",
"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": "Profile",
"language": "Language",
"languageDescription": "Choose the display language of the application.",
"username": "Username",
"height": "Height (cm)",
"dateOfBirth": "Date of birth",
"dateOfBirthHint": "Used for automatic blood pressure target calculations.",
"gender": "Gender",
"genderNone": "Not specified",
"genderMale": "Male",
"genderFemale": "Female",
"genderHint": "Used for gender-specific target values.",
"timezone": "Timezone",
"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": "Profile photo",
"description": "Upload a photo stored on your own server. It appears across the app in place of an external avatar service.",
"upload": "Upload photo",
"replace": "Replace photo",
"remove": "Remove",
"hint": "JPEG, PNG, or WebP. Up to 2 MB and 2048×2048 pixels.",
"uploaded": "Profile photo updated",
"removed": "Profile photo removed",
"invalidType": "Unsupported image type. Use JPEG, PNG, or WebP.",
"tooLarge": "Image exceeds the 2 MB limit.",
"error": "Could not update the profile photo. Please try again."
},
"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": "Name",
"passkeyDevice": "Device",
"passkeyBackup": "Backup",
"passkeyCreated": "Created",
"passkeyActions": "Actions",
"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",
"telegramDescription": "Medication reminders via bot.",
"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": "Active",
"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": "copy",
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Cancel",
"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": "Save",
"saved": "Saved",
"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}",
"testUnexpectedResponse": "AI provider connection failed — unexpected response from the server.",
"testReasonCredentials": "Provider rejected the credentials — re-authenticate in AI settings.",
"testReasonRateLimited": "Provider rate-limited the request — try again shortly.",
"testReasonServerError": "The AI provider returned a server error.",
"testReasonUnreachable": "Could not reach the AI provider.",
"disableCoach": {
"title": "Hide Coach",
"description": "Hides the Coach button and drawer everywhere.",
"toggleAria": "Hide the Coach button and drawer",
"savedHidden": "Coach hidden.",
"savedShown": "Coach visible.",
"saveError": "Could not save the change. Please try again."
}
},
"dashboard": {
"units": {
"title": "Units",
"description": "Choose how distances and speeds are shown across charts and tiles.",
"metric": "Metric",
"imperial": "Imperial",
"saved": "Unit preference saved.",
"saveError": "Could not save your unit preference."
}
},
"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": "Connected",
"errorReconnect": "Error — reconnect",
"warningServerError": "Connected, server error",
"parkedReconnect": "Paused — reconnect manually",
"notConnected": "Not connected",
"justNow": "just now",
"minutesAgo": "{count} min ago",
"hoursAgo": "{count} h ago",
"daysAgo": "{count} d ago",
"ariaLabel": "Integration status",
"resumeCta": "Reconnect",
"resumeSuccess": "Integration resumed",
"resumeError": "Reconnect failed"
},
"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": "Active",
"activeTokensTitle": "Active tokens",
"revokedTokensTitle": "Revoked tokens ({count})",
"tokenTableName": "Name",
"tokenTablePermissions": "Permissions",
"tokenTableStatus": "Status",
"tokenTableCreated": "Created",
"tokenTableLastUsed": "Last used",
"tokenTableActions": "Actions",
"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": "Saved",
"savingError": "Error saving",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood entries.",
"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": "Sources & docs",
"newerAvailable": "Newer version: {tag}",
"tourReplay": "Replay the tour",
"tourReplayHint": "Watch the dashboard walkthrough — handy if you skipped it on first visit."
},
"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": "Delivery status",
"description": "Per-channel state; \"Auto-disabled\" stops retries after permanent errors.",
"emptyDescription": "No channels configured yet. Add a channel below to start tracking its delivery health.",
"stateActive": "Active",
"stateAutoDisabled": "Auto-disabled",
"stateSendingPaused": "Sending paused",
"stateManuallyDisabled": "Disabled",
"lastSuccess": "Last successful send",
"lastFailure": "Last failure",
"consecutiveFailures": "Consecutive failures",
"disabledReason": "Reason",
"nextRetry": "Next retry",
"reEnable": "Re-enable",
"sendTest": "Send test"
},
"identity": {
"description": "Optional details for the health-record export (PDF cover + FHIR export). All fields are optional.",
"fullName": "Full name",
"fullNamePlaceholder": "e.g. Jane Doe",
"insurer": "Health insurer",
"insurerPlaceholder": "e.g. AOK Bayern",
"insuranceNumber": "Insurance number (KVNR)",
"insuranceNumberHint": "10 characters: one letter + nine digits (e.g. A123456780)."
},
"healthRecord": {
"title": "Export health record",
"description": "Generate a complete health record for your doctor — as a PDF, structured (FHIR), or a combined package.",
"format": "Format",
"format_pdf": "PDF",
"format_fhir": "Structured (FHIR)",
"format_package": "Package: PDF + FHIR",
"range": "Period",
"range90": "Last 90 days",
"range180": "Last 6 months",
"range365": "Last 12 months",
"practiceName": "Practice (optional)",
"practiceNamePlaceholder": "e.g. Dr. Smith",
"includedData": "Included data",
"groupVitals": "Vital signs",
"groupCardio": "Heart & fitness",
"groupActivity": "Activity & sleep",
"weight": "Weight",
"bp": "Blood pressure",
"pulse": "Pulse",
"oxygenSaturation": "Oxygen saturation",
"bodyFat": "Body fat",
"bodyComposition": "Body composition",
"restingHeartRate": "Resting heart rate",
"hrv": "Heart rate variability",
"vo2max": "VO₂max",
"steps": "Steps",
"distance": "Distance",
"sleep": "Sleep",
"glucose": "Blood glucose",
"medications": "Medications & adherence",
"mood": "Mood (off by default — sensitive data)",
"bmi": "BMI",
"includeCharts": "Embed trend charts (PDF only)",
"includeAiSummary": "Append AI summary (not clinically validated)",
"fhirNote": "The structured output follows the FHIR R4 standard (ePA-compatible).",
"generate": "Generate",
"error": "Export failed ({code})."
},
"globalExcludedInjectionSitesLabel": "Globally excluded injection sites",
"globalExcludedInjectionSitesHint": "Sites listed here are never offered for any medication and rejected when logging a dose, even if a medication prefers them."
},
"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": "Retry",
"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": "Geo data",
"offlineGeoEnabled": "Offline (GeoLite2)",
"offlineGeoFallback": "Fallback (ipwho.is) — set MAXMIND_LICENSE_KEY in 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": "Assistant Surfaces",
"description": "Each toggle hides a model-driven surface app-wide without removing the provider configuration. The master kills every sub-flag at once.",
"master": {
"title": "Assistant enabled",
"description": "Master switch for every model-driven surface. When off, every sub-flag below is forced off."
},
"coach": {
"title": "Coach",
"description": "Chat drawer, launcher button, and the mobile FAB on every Insights page."
},
"briefing": {
"title": "Daily Briefing",
"description": "Briefing card, hero strip narration, recommendations grid, and the regenerate action."
},
"insightStatus": {
"title": "Status cards",
"description": "Per-metric status cards on every /insights sub-page."
},
"correlations": {
"title": "Correlations",
"description": "Correlation tile narration on the Insights overview."
},
"healthScoreExplainer": {
"title": "Health-Score explainer",
"description": "The ? glyph next to the Health-Score delta line. The delta digit stays visible regardless."
}
},
"bugReportRepo": "Repository",
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"userManagement": "User Management",
"userName": "Name",
"userEmail": "Email",
"userRole": "Role",
"userPasskeys": "Passkeys",
"userCreated": "Created",
"userActions": "Actions",
"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": "Reset",
"loadingUsers": "Loading users...",
"apiTokens": "API Tokens",
"tokenUser": "User",
"tokenName": "Name",
"tokenPermissions": "Permissions",
"tokenPermissionAll": "All",
"tokenPermissionAllTooltip": "Wildcard permission — this token can call every API route.",
"tokenStatus": "Status",
"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": "Showing {count} of {total} auth entries",
"status": "Status",
"action": "Action",
"ip": "IP",
"location": "Location",
"timestamp": "Time",
"provider": "Provider",
"providerPassword": "Password",
"providerPasskey": "Passkey",
"providerApiToken": "API token",
"providerWithings": "Withings",
"providerUnknown": "Unknown",
"outcome": "Outcome",
"outcomeSuccess": "Success",
"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} medications, {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": "Login",
"authLoginPasskey": "Passkey login",
"authLoginPassword": "Password login",
"authLoginFailed": "Failed",
"authLogout": "Logout",
"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": "Actions",
"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": "Overview",
"sectionsNav": "Admin sections"
},
"overview": {
"welcomeTitle": "Welcome, {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": "Geo data",
"snapshotOfflineGeoOn": "Offline (GeoLite2)",
"snapshotOfflineGeoOff": "Fallback (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": "Integrations",
"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": "Assistant Surfaces",
"subtitle": "Toggle each model-driven surface on or off without removing the provider configuration."
},
"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": "All",
"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": "Last 7 days",
"range30d": "Last 30 days",
"rangeAll": "All time",
"perPage": "Per page",
"prev": "Previous",
"next": "Next",
"pageOf": "Page {page} of {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": "Type",
"typeWeeklyAuto": "Weekly (auto)",
"typeManual": "Manual",
"colSize": "Size",
"colCreatedAt": "Last snapshot",
"colActions": "Actions",
"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": "Carrier",
"carrierUnknown": "Unknown carrier",
"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": "Medication",
"vitals": "Vitals",
"mood": "Mood",
"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": "Bug Report",
"subtitle": "Send a bug report, feature request, or question. The server administrator will see your submission.",
"loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title",
"description": "Description",
"submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.",
"errorCreating": "Error creating report",
"category": "Type",
"categoryBug": "Bug report",
"categoryFeature": "Feature request",
"categoryQuestion": "Question",
"categoryOther": "Other feedback",
"bugTitlePlaceholder": "Short summary (optional)",
"githubEscalationNote": "Your feedback is stored locally. If the admin enables GitHub integration, it can be promoted to a public issue on request.",
"internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Notification Center",
"breadcrumbInbox": "Notification Center",
"breadcrumbChannels": "Notification channels",
"breadcrumbSettings": "Settings",
"eventColumn": "Event",
"subtitle": "Choose which notifications you want to receive through which channel.",
"loadError": "Notification preferences could not be loaded.",
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to channel settings",
"channelDisabled": "Disabled",
"admin": {
"deployFailedTitle": "Deployment failed: {application}",
"deployFailedBody": "An error occurred while deploying {application} (#{deployment}): {error}. View logs: {logsUrl}",
"testNotificationTitle": "HealthLog test notification",
"testNotificationBody": "This test notification was triggered from the admin panel. If you can see it, the channel is working.",
"reminderCheckMissedTitle": "Reminder missed: {medication}",
"reminderCheckMissedBody": "{medication} ({dose}) was not logged in the {window} window.",
"reminderCheckOverdueTitle": "Dose overdue: {medication}",
"reminderCheckOverdueBody": "{medication} ({dose}) in the {window} window is {minutes} minutes overdue.",
"offlineGeoUnavailableTitle": "Offline geolocation databases not loaded",
"offlineGeoUnavailableBody": "HealthLog is resolving login locations through the online ipwho.is fallback. To enable the offline GeoLite2-City + GeoLite2-ASN databases, set MAXMIND_LICENSE_KEY in GitHub Actions secrets at {secretsUrl} and redeploy. Until then the carrier column on the login overview stays empty."
},
"user": {
"telegramTestBody": "HealthLog: connection successful. Telegram notifications are active."
},
"moodReminder": {
"title": "Daily mood reminder",
"description": "A gentle nudge at your chosen time when you haven't logged a mood for the day. Routes only through channels you've already configured (Telegram, ntfy, Web Push, Apple Push) and stays silent once you've logged today.",
"toggleAria": "Toggle daily mood reminder",
"statusOn": "Active at your chosen time",
"statusOff": "Off",
"enabledToast": "Mood reminder enabled.",
"disabledToast": "Mood reminder disabled.",
"saveError": "Save failed. Please try again.",
"hourLabel": "Reminder time",
"hourAria": "Mood reminder hour",
"hourSavedToast": "Reminder time updated."
},
"eventMedicationReminder": "Medication reminder",
"eventMedicationReminderDesc": "Sent at each scheduled dose time.",
"eventMeasurementAnomaly": "Unusual measurement",
"eventMeasurementAnomalyDesc": "Sent when a reading is well outside your usual range.",
"eventComplianceLow": "Low compliance",
"eventComplianceLowDesc": "Sent when your intake rate over the last few days drops below 80 %.",
"eventWithingsSyncFailed": "Withings sync failed",
"eventWithingsSyncFailedDesc": "Sent when Withings synchronisation fails multiple attempts in a row.",
"eventSystemAlert": "System notice",
"eventSystemAlertDesc": "General messages from the HealthLog server, e.g. maintenance windows or account notes.",
"eventPersonalRecord": "Personal record",
"eventPersonalRecordDesc": "Sent when a reading beats your previous best.",
"eventMoodReminder": "Mood reminder",
"eventMoodReminderDesc": "Daily nudge to log your current mood."
},
"i18n": {
"maintainershipBanner": {
"notice": "This locale is machine-translated including the Coach's safety-critical instructions. Automated drift-guard runs in CI; please report any Coach regressions on GitHub.",
"cta": "Report on GitHub",
"dismiss": "Dismiss"
}
},
"targets": {
"bmi": "BMI",
"average30d": "30-day average:",
"consistency": {
"ariaLabel": "Last 7 days, in-range status per day",
"daysInRange": "{count} of {total} in range",
"daysLogged": "{count} of {total} logged",
"dotInRange": "in range",
"dotNearRange": "near range",
"dotOutOfRange": "out of range",
"dotNotLogged": "not logged",
"insufficientData": "Not enough data yet — keep logging.",
"relativeDay": {
"today": "today",
"yesterday": "yesterday",
"twoDaysAgo": "2 days ago",
"threeDaysAgo": "3 days ago",
"fourDaysAgo": "4 days ago",
"fiveDaysAgo": "5 days ago",
"sixDaysAgo": "6 days ago"
}
},
"relativeDay": {
"today": "today",
"yesterday": "yesterday",
"daysAgo": "{count} days ago"
},
"edit": {
"openLabel": "Edit target range for {metric}",
"title": "Edit target range — {metric}",
"description": "Adjust the in-range band used across charts, insights and the doctor report. Values are in {unit}.",
"derivedHint": "This card is derived from other metrics. Edit the underlying targets (e.g. blood pressure or weight) instead.",
"minLabel": "Min",
"maxLabel": "Max",
"systolicMin": "Systolic min",
"systolicMax": "Systolic max",
"diastolicMin": "Diastolic min",
"diastolicMax": "Diastolic max",
"boundsHint": "Allowed range: {min}–{max} {unit}",
"resetToDefault": "Reset to default",
"saveSuccess": "Target range updated",
"saveError": "Could not save the target range",
"resetSuccess": "Target range reset to default"
},
"mood": {
"stability": {
"stable": "stable",
"variable": "variable",
"highlyVariable": "highly variable"
}
},
"currentValue": "Current: {value} {unit}",
"targetRangeValue": "Target: {min}–{max} {unit}",
"sourceLabel": "Source: {source}",
"inTarget": "Within target range",
"aboveTarget": "{delta} {unit} above target",
"belowTarget": "{delta} {unit} below target",
"diastolic": "Diastolic",
"glucoseFasting": "Glucose — fasting",
"glucosePostprandial": "Glucose — post-meal",
"glucoseRandom": "Glucose — random",
"glucoseBedtime": "Glucose — bedtime",
"status": {
"underweight": "Underweight",
"normal": "Normal",
"overweight": "Overweight",
"obesityGrade1": "Obesity Grade I",
"obesityGrade2": "Obesity Grade II",
"obesityGrade3": "Obesity Grade III",
"optimal": "Optimal",
"highNormal": "High-normal",
"hypertensionGrade1": "Hypertension Grade 1",
"hypertensionGrade2": "Hypertension Grade 2",
"hypertensionGrade3": "Hypertension Grade 3",
"bradycardia": "Bradycardia",
"elevated": "Elevated",
"tachycardia": "Tachycardia",
"significantlyLow": "Significantly low",
"slightlyLow": "Slightly low",
"onTarget": "On target",
"slightlyElevated": "Slightly elevated",
"significantlyElevated": "Significantly elevated",
"farTooShort": "Far too short",
"tooShort": "Too short",
"slightlyLong": "Slightly long",
"farTooLong": "Far too long",
"belowEssential": "Below essential",
"essential": "Essential",
"athletic": "Athletic",
"fitness": "Fitness",
"acceptable": "Acceptable",
"obese": "Obese",
"veryLow": "Very low",
"lowActive": "Low active",
"moderatelyActive": "Moderately active",
"active": "Active",
"veryActive": "Very active",
"good": "Good",
"moderate": "Moderate",
"low": "Low",
"high": "High",
"veryGood": "Very good",
"veryStable": "Very stable",
"stable": "Stable",
"fluctuating": "Fluctuating"
}
},
"passwordStrength": {
"veryWeak": "Very weak",
"weak": "Weak",
"acceptable": "Acceptable",
"strong": "Strong",
"veryStrong": "Very strong",
"tooShort": "Too short",
"characters": "characters",
"minLength": "At least {count} characters required."
},
"telegram": {
"errorInvalidAction": "Invalid action.",
"errorMedicationNotFound": "Medication not found.",
"errorMedicationInactive": "Medication not found or inactive.",
"errorUnknownAction": "Unknown action.",
"snoozeOneHour": "1 hour",
"snoozeThreeHours": "3 hours",
"snoozedFor": "{name} snoozed for {duration}.",
"skipped": "{name} skipped.",
"alreadyRecorded": "{name} was already recorded.",
"recordedAsTaken": "{name} recorded as taken.",
"confirmed": "{name} confirmed.",
"genericConfirmed": "Confirmed.",
"cancelled": "Cancelled.",
"noActiveMedications": "No active medications found.",
"whichMedication": "<b>Which medication did you take?</b>",
"cancelButton": "Cancel",
"askMedicationName": "Please specify a medication, e.g. <b>taken Ramipril</b>.",
"medicationNotFoundExact": "Medication not found. Please send the name exactly as in 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} min.",
"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} min.",
"phaseRedTitle": "🔴 Missed: {medName}",
"phaseRedMessage": "🔴 Missed:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nMarked as missed.",
"buttonTaken": "Taken",
"buttonConfirm": "✓ Confirm",
"buttonSnoozeOneHour": "🕐 1h",
"buttonSnoozeThreeHours": "🕐 3h",
"buttonSkip": "⏭ Skip"
},
"moodReminders": {
"dailyTitle": "Log your mood",
"dailyBody": "How are you feeling today?"
}
}