mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-07 04:12:04 +00:00
Weigh-ins: Garmin's document has no samplePk and gives kilograms, the live service sends a samplePk and grams. A weigh-in now takes its id from samplePk or else its own GMT instant, reads each mass by magnitude (above 1000 is grams), and is written whole or not at all: a missing weight, a missing instant or one implausible value drops every row of it, counted on the wide event by reason. Refused resources: a lasting 4xx on one resource (a cycle summary for an account that tracks no cycle) is noted once on the progress column, counts as done for the backfill, is skipped by the hourly sync and is listed in the card's details. It no longer holds the backfill open or turns the connection red. The cycle leg never parks the connection, whatever it is refused with. Backfill: weigh-ins walk back to the start of Garmin Connect on their own, so history before the first watch day and a scale-only account arrive. Progress and the completion stamp are written only while the connection the slice started on is still the stored one. Key: connect sends the key to the one service the person picks (Garmin Connect or Garmin Connect China), never to both. A parked key is asked about again once a day with a single token exchange and reconnected when Garmin accepts it. The key's end is read from the token's own iat and exp, an estimate the key outlived is cleared after an accepted exchange, and the validity can be corrected from the card's menu (PATCH /api/garmin/key-expiry, with the day the key was created) without pasting it again. Sync: an incremental run reaches back to the last successful sync, up to a year, so an outage longer than the 30-day window leaves no gap; a night Garmin no longer reports (deleted, or turned into a nap) is retired. Card: connect errors are translated from meta.errorCode in every locale. Types: BODY_BATTERY, STRESS_LEVEL, TRAINING_READINESS and ACUTE_TRAINING_LOAD get source ladders of their own (the device or the bridge first, then the hand-entered sources in their usual order), join the ranked types and the provenance picker, and the recovery-empty description names them.
14202 lines
717 KiB
JSON
14202 lines
717 KiB
JSON
{
|
||
"common": {
|
||
"listCapped": "Showing the latest {count}; older entries are not listed here.",
|
||
"save": "Save",
|
||
"conflictReloaded": "Reloaded from the server. Please make your change again.",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete",
|
||
"undo": "Undo",
|
||
"edit": "Edit",
|
||
"moreOptions": "More options",
|
||
"create": "Create",
|
||
"close": "Close",
|
||
"loading": "Loading…",
|
||
"loadFailed": "Could not load",
|
||
"error": "Error",
|
||
"saved": "Saved",
|
||
"pullToRefresh": "Refreshing…",
|
||
"no": "No",
|
||
"noData": "No data available",
|
||
"optional": "Optional",
|
||
"active": "Active",
|
||
"inactive": "Inactive",
|
||
"disabled": "Disabled",
|
||
"networkError": "Network error",
|
||
"openDatePicker": "Open date picker",
|
||
"openTimePicker": "Open time picker",
|
||
"hours": "Hours",
|
||
"minutes": "Minutes",
|
||
"feet": "ft",
|
||
"inches": "in",
|
||
"heightFeet": "Height in feet",
|
||
"heightInches": "Height in inches",
|
||
"period": "AM/PM",
|
||
"am": "AM",
|
||
"pm": "PM",
|
||
"unknownError": "Unknown error",
|
||
"copied": "Copied!",
|
||
"or": "or",
|
||
"unknown": "Unknown",
|
||
"add": "Add",
|
||
"import": "Import",
|
||
"test": "Test",
|
||
"reset": "Reset",
|
||
"copy": "Copy",
|
||
"copyDetails": "Copy details",
|
||
"retry": "Retry",
|
||
"showPassword": "Show password",
|
||
"hidePassword": "Hide password",
|
||
"learnMore": "Learn more",
|
||
"dismiss": "Dismiss",
|
||
"moreInfo": "More information",
|
||
"durationHoursMinutes": "{hours}h {minutes}m",
|
||
"durationMinutes": "{minutes}m",
|
||
"durationClockMinutes": "{time} min",
|
||
"durationClockHours": "{time} h",
|
||
"errorIdLabel": "Error ID",
|
||
"errorIdCopy": "Copy error ID",
|
||
"errorIdCopied": "Error ID copied",
|
||
"readThrottled": "There are too many requests just now, so try again later.",
|
||
"sessionEnded": "Your session has ended, so sign in again to continue.",
|
||
"signIn": "Sign in"
|
||
},
|
||
"apiErrors": {
|
||
"measurement": {
|
||
"create": {
|
||
"invalid": "Check the measurement details and try again."
|
||
},
|
||
"duplicate_timestamp": "A measurement already exists for this time."
|
||
},
|
||
"mood": {
|
||
"list": {
|
||
"invalid": "The mood list filters are invalid."
|
||
},
|
||
"create": {
|
||
"invalid": "Check the mood entry and try again."
|
||
},
|
||
"update": {
|
||
"invalid": "Check the mood entry and try again."
|
||
},
|
||
"duplicate_timestamp": "A mood entry already exists for this time.",
|
||
"not_found": "This mood entry is no longer available.",
|
||
"ratedFactor": {
|
||
"out_of_range": "A factor rating is outside its allowed range."
|
||
}
|
||
},
|
||
"labs": {
|
||
"create": {
|
||
"invalid": "Check the lab result and try again."
|
||
},
|
||
"result": {
|
||
"notFound": "This lab result is no longer available."
|
||
},
|
||
"biomarker": {
|
||
"notFound": "This biomarker is no longer available.",
|
||
"duplicate": "A biomarker with this name already exists.",
|
||
"create": {
|
||
"invalid": "Check the biomarker details and try again."
|
||
},
|
||
"update": {
|
||
"invalid": "Check the biomarker details and try again.",
|
||
"referenceRangeInvalid": "The lower reference value must not exceed the upper value."
|
||
}
|
||
},
|
||
"update": {
|
||
"invalid": "Check the lab result and try again.",
|
||
"linkedFieldsImmutable": "Edit the biomarker to change its name, unit, panel, or reference range.",
|
||
"qualitativeExpected": "Enter a text result for this qualitative reading.",
|
||
"numericExpected": "Enter a number for this numeric reading.",
|
||
"referenceRangeInvalid": "The lower reference value must not exceed the upper value."
|
||
}
|
||
},
|
||
"onboarding": {
|
||
"disclaimer": {
|
||
"invalid": "Please confirm the medical disclaimer again."
|
||
},
|
||
"tour": {
|
||
"invalid": "The tour progress could not be saved."
|
||
},
|
||
"complete": {
|
||
"invalid": "Check the profile details and try again."
|
||
},
|
||
"user": {
|
||
"notFound": "Your account could not be found."
|
||
},
|
||
"step": {
|
||
"rateLimited": "Too many attempts. Please wait and try again.",
|
||
"invalid": "This onboarding step could not be saved.",
|
||
"completed": "Onboarding is already complete.",
|
||
"outOfOrder": "Your onboarding progress changed. Refresh and continue.",
|
||
"concurrent": "Your onboarding progress changed. Refresh and continue."
|
||
}
|
||
},
|
||
"profile": {
|
||
"update": {
|
||
"nothingSaved": "Nothing was saved. Check the highlighted field and try again.",
|
||
"invalidBody": "The profile update could not be read.",
|
||
"emailInUse": "This email address is already in use.",
|
||
"emailRateLimited": "Too many email-address changes. Try again later.",
|
||
"emailSecondFactorRequired": "Confirm with your second factor or a passkey to change the email address."
|
||
}
|
||
},
|
||
"auth": {
|
||
"reproof": {
|
||
"required": "Confirm your current password to change this.",
|
||
"failed": "That did not verify. Nothing was changed."
|
||
}
|
||
},
|
||
"biomarkers": {
|
||
"unit": {
|
||
"locked": "This marker already has readings, so its unit can't be changed. The stored values would be shown in the new unit without being converted."
|
||
}
|
||
},
|
||
"symptoms": {
|
||
"definition": {
|
||
"limitReached": "You have 8 symptoms. Hide one to add another.",
|
||
"notFound": "This symptom no longer exists."
|
||
},
|
||
"episode": {
|
||
"notOpen": "That illness is no longer open. Choose another or none."
|
||
},
|
||
"event": {
|
||
"notFound": "This entry no longer exists."
|
||
}
|
||
},
|
||
"medications": {
|
||
"notFound": "This medication is no longer available.",
|
||
"ingredients": {
|
||
"invalid": "Check the composition and try again.",
|
||
"unitMismatch": "This unit is not offered for the nutrient.",
|
||
"extract": {
|
||
"fileType": "Upload a JPEG, PNG, WebP or PDF.",
|
||
"fileTooLarge": "The file is larger than 10 MB.",
|
||
"rateLimited": "Too many label reads. Try again in an hour.",
|
||
"budgetExceeded": "Your AI usage budget for today is reached.",
|
||
"failed": "The label could not be read. Try a sharper photo."
|
||
}
|
||
}
|
||
},
|
||
"aiRuns": {
|
||
"readerBusy": "The document reader is busy with other work. Try again in a minute."
|
||
}
|
||
},
|
||
"doctorReport": {
|
||
"title": "Health Report",
|
||
"anamnesisTitle": "Health profile",
|
||
"anamnesisNotRecorded": "Not recorded",
|
||
"anamnesisUnreadable": "Stored value could not be read",
|
||
"anamnesisConditions": "Chronic conditions",
|
||
"anamnesisSmoking": "Smoking status",
|
||
"anamnesisAlcohol": "Alcohol pattern",
|
||
"anamnesisShiftSchedule": "Work schedule",
|
||
"anamnesisColFact": "Profile item",
|
||
"anamnesisColValue": "Recorded value",
|
||
"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",
|
||
"emergency": {
|
||
"title": "Emergency information",
|
||
"subtitle": "For use in an acute situation. Self-reported; confirm where possible.",
|
||
"none": "Not recorded",
|
||
"unreadable": "Stored value could not be read",
|
||
"bloodType": "Blood type",
|
||
"bloodTypeUnknown": "Unknown",
|
||
"bloodTypeValues": {
|
||
"A_POS": "A positive",
|
||
"A_NEG": "A negative",
|
||
"B_POS": "B positive",
|
||
"B_NEG": "B negative",
|
||
"AB_POS": "AB positive",
|
||
"AB_NEG": "AB negative",
|
||
"O_POS": "O positive",
|
||
"O_NEG": "O negative"
|
||
},
|
||
"severeAllergies": "Severe allergies",
|
||
"activeMedications": "Current medications",
|
||
"chronicConditions": "Chronic conditions",
|
||
"implants": "Implants and devices",
|
||
"advanceDirective": "Advance directive",
|
||
"advanceDirectiveValues": {
|
||
"EXISTS": "Exists",
|
||
"NONE": "None",
|
||
"UNKNOWN": "Not stated"
|
||
},
|
||
"organDonor": "Organ donor",
|
||
"organDonorValues": {
|
||
"YES": "Yes",
|
||
"NO": "No",
|
||
"UNKNOWN": "Not stated"
|
||
},
|
||
"contacts": "Emergency contacts",
|
||
"notes": "Additional notes"
|
||
},
|
||
"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 adherence",
|
||
"glp1Title": "GLP-1 therapy",
|
||
"glp1WeightSummary": "Weight over report period: {start} kg → {end} kg ({delta} kg)",
|
||
"glp1CurrentDose": "Current dose: {value} {unit} (since {since})",
|
||
"glp1Compliance": "Adherence: {taken} / {total} ({rate}%)",
|
||
"glp1SideEffectsTitle": "Side effects logged",
|
||
"colGlp1Date": "Date",
|
||
"colGlp1Dose": "Dose",
|
||
"colGlp1Note": "Note",
|
||
"colGlp1SideEffect": "Side effect",
|
||
"colMedication": "Medication",
|
||
"colTaken": "Taken",
|
||
"colSkipped": "Skipped",
|
||
"colMissed": "Missed",
|
||
"colExpected": "Expected",
|
||
"colComplianceRate": "Adherence rate",
|
||
"moodTitle": "Mood trajectory",
|
||
"moodSummary": "Average {avg} / 5.0, {count} entries, 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: {timezone} | Created: {timestamp}",
|
||
"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)",
|
||
"typeGlucoseUnspecified": "Glucose (untagged)",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"cycleTitle": "Menstrual cycle",
|
||
"cycleLmp": "Last period",
|
||
"cycleAvgLength": "Average cycle length",
|
||
"cycleAvgPeriod": "Average period length",
|
||
"cyclePhase": "Current phase",
|
||
"cycleDays": "days",
|
||
"cycleColStart": "Period start",
|
||
"cycleColLength": "Cycle length (days)",
|
||
"cycleColPeriod": "Period length (days)",
|
||
"cyclePhases": {
|
||
"MENSTRUAL": "Menstrual",
|
||
"FOLLICULAR": "Follicular",
|
||
"OVULATORY": "Ovulatory",
|
||
"LUTEAL": "Luteal"
|
||
},
|
||
"labsTitle": "Lab results",
|
||
"labsColAnalyte": "Biomarker",
|
||
"labsColValue": "Value",
|
||
"labsColReference": "Reference",
|
||
"labsColStatus": "Status",
|
||
"labsColDate": "Date",
|
||
"glucoseClinical": {
|
||
"title": "Glucose overview (clinical)",
|
||
"colMetric": "Metric",
|
||
"colValue": "Value",
|
||
"tirInRange": "Time in range ({low}–{high} {unit})",
|
||
"tirLow": "Low (< {low} {unit})",
|
||
"tirVeryLow": "Very low (< {veryLow} {unit})",
|
||
"tirHigh": "High (> {high} {unit})",
|
||
"tirVeryHigh": "Very high (> {veryHigh} {unit})",
|
||
"mean": "Average glucose",
|
||
"gmi": "Glucose Management Indicator (GMI)",
|
||
"eA1c": "Estimated A1C",
|
||
"cv": "Variability (CV%)",
|
||
"spotCaveat": "These are spot-reading estimates from individual measurements, not a continuous-monitor profile. Read them as a direction of travel rather than a clinical verdict."
|
||
},
|
||
"illnessTitle": "Conditions & illnesses",
|
||
"illnessOngoing": "Ongoing",
|
||
"illnessColCondition": "Condition",
|
||
"illnessColBodySite": "Body site",
|
||
"illnessColType": "Type",
|
||
"illnessColLifecycle": "Course",
|
||
"illnessColOnset": "Onset",
|
||
"illnessColResolved": "Resolved",
|
||
"allergiesTitle": "Allergies & intolerances",
|
||
"reactionUnreadable": "Reaction recorded but could not be decrypted",
|
||
"allergiesColSubstance": "Substance",
|
||
"allergiesColCategory": "Category",
|
||
"allergiesColKind": "Kind",
|
||
"allergiesColSeverity": "Severity",
|
||
"allergiesColReaction": "Reaction",
|
||
"allergiesColStatus": "Status",
|
||
"familyHistoryTitle": "Family history",
|
||
"familyHistoryColRelationship": "Relative",
|
||
"familyHistoryColCondition": "Condition",
|
||
"familyHistoryColAgeAtOnset": "Age at onset",
|
||
"labsSourceRangeNote": "* The reference range comes from the report itself and differs from the saved range:",
|
||
"labsCatalogRangeLabel": "saved range",
|
||
"visitsTitle": "Visits",
|
||
"visitsColDate": "Date",
|
||
"visitsColPractice": "Practice",
|
||
"visitsColKind": "Kind",
|
||
"visitsColReason": "Reason",
|
||
"visitsColOutcome": "Outcome",
|
||
"visitsColConditions": "Conditions",
|
||
"surgicalHistoryTitle": "Surgical history",
|
||
"surgicalHistoryColDate": "Date",
|
||
"surgicalHistoryColProcedure": "Procedure",
|
||
"surgicalHistoryColBodySite": "Body site",
|
||
"surgicalHistoryColOutcome": "Outcome",
|
||
"immunizationsTitle": "Immunizations",
|
||
"immunizationsColDate": "Date",
|
||
"immunizationsColVaccine": "Vaccine",
|
||
"immunizationsColDose": "Dose",
|
||
"immunizationsColLot": "Lot",
|
||
"courseRange": "Course {start} to {end}",
|
||
"courseSince": "Course since {start}",
|
||
"lifePackYears": "Pack-years",
|
||
"lifeAuditC": "AUDIT-C (screening)",
|
||
"lifeAuditCScore": "{score} of 12 on {date}.",
|
||
"lifeAuditCAbove": "At or above the cut-off of {cutoff} ({source}).",
|
||
"lifeAuditCBelow": "Below the cut-off of {cutoff} ({source}).",
|
||
"lifeAuditCNoCutoff": "No sex-specific cut-off applied.",
|
||
"lifeActivity": "Physical activity",
|
||
"lifeActivityValue": "{minutes} minutes a week, self-reported",
|
||
"lifeSitting": "Sitting on a workday",
|
||
"lifeSittingValue": "{hours} hours, self-reported",
|
||
"lifeWork": "Work",
|
||
"lifeNightWork": "night work",
|
||
"lifeExposures": "exposures: {list}",
|
||
"workouts": {
|
||
"title": "Workouts",
|
||
"summary": "{sessions} sessions, {hours} h in total; on average {perWeek} sessions and {minutesPerWeek} minutes per week.",
|
||
"colSport": "Sport",
|
||
"colSessions": "Sessions",
|
||
"colTime": "Time",
|
||
"colDistance": "Distance",
|
||
"colEnergy": "Energy",
|
||
"colHeartRate": "Avg heart rate",
|
||
"moreSports": "{count} more sports are counted in the totals but not listed."
|
||
},
|
||
"medicationEffect": {
|
||
"title": "Change around each medication start",
|
||
"colMedication": "Medication / measure",
|
||
"colStart": "Start",
|
||
"colLevel": "Level change (95 % CI)",
|
||
"colSlope": "Trend change (95 % CI)",
|
||
"colDays": "Days before / after",
|
||
"to": "to",
|
||
"week": "week",
|
||
"reasonNoStart": "No start date recorded",
|
||
"reasonBefore": "Too few readings before the start",
|
||
"reasonAfter": "Too few readings since the start",
|
||
"reasonFit": "Could not be computed",
|
||
"excludedAdherence": "{count} days after the start left out (under {floor} % of doses taken)",
|
||
"excludedNotTaking": "{count} days left out (paused or between courses)",
|
||
"notTracked": "intake not tracked, so no days left out for missed doses",
|
||
"endDoseChange": "window ends {date}, before the first dose change",
|
||
"days": "{before} days before, {after} days after the start, {excluded} days left out",
|
||
"method": "Segmented regression on daily values from 90 days before to at most 180 days after the start, with Newey-West intervals. Days after the start on which fewer than 80 % of the doses of the preceding 14 days were taken are left out. Describes an association over time, not a proven effect of the medication.",
|
||
"autocorrelation": "strong day-to-day carry-over, so the ranges may still be too narrow",
|
||
"window": "analysed {from} to {to}, which can reach beyond the report period",
|
||
"windowLine": "Analysed {from} to {to}. This window can reach beyond the report period."
|
||
},
|
||
"screenerUnvalidated": "{label}: {count} of {total} results were answered in a translation that has not been scientifically validated; treat them as orientation."
|
||
},
|
||
"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: changes can't be saved until you're back online.",
|
||
"saveFailed": "Couldn't save, you're offline. Please try again once you're back online.",
|
||
"showingCached": "Showing your last synced data."
|
||
},
|
||
"demoBanner": {
|
||
"message": "Demo mode: changes are not saved."
|
||
},
|
||
"nav": {
|
||
"dashboard": "Dashboard",
|
||
"measurements": "Measurements",
|
||
"medications": "Medications",
|
||
"insights": "Insights",
|
||
"achievements": "Achievements",
|
||
"settings": "Settings",
|
||
"admin": "Admin console",
|
||
"logout": "Sign out",
|
||
"login": "Sign in",
|
||
"notifications": "Notifications",
|
||
"theme": "Theme",
|
||
"themeSystem": "System",
|
||
"themeDark": "Dark",
|
||
"themeLight": "Light",
|
||
"collapseSidebar": "Collapse",
|
||
"expandSidebar": "Expand",
|
||
"collapseSidebarLabel": "Collapse sidebar",
|
||
"expandSidebarLabel": "Expand sidebar",
|
||
"userMenu": "User menu",
|
||
"accountSettings": "Account settings",
|
||
"mood": "Mood",
|
||
"coach": "Coach",
|
||
"skipToContent": "Skip to content",
|
||
"breadcrumb": "You are here",
|
||
"sidebar": "Sidebar",
|
||
"mainNavigation": "Main navigation",
|
||
"mobileNavigation": "Mobile navigation",
|
||
"loadingScreen": "Loading…",
|
||
"more": "More",
|
||
"moreSheetTitle": "More",
|
||
"moreSheetDescription": "Jump to the rest of HealthLog.",
|
||
"capture": {
|
||
"title": "Log",
|
||
"description": "What would you like to record?",
|
||
"measurement": "Measurement",
|
||
"measurementDescription": "Weight, blood pressure, pulse and more",
|
||
"medication": "Medication",
|
||
"medicationDescription": "Mark a dose as taken",
|
||
"mood": "Mood",
|
||
"moodDescription": "Log your mood and tags",
|
||
"workout": "Workout",
|
||
"workoutDescription": "A session your devices did not record",
|
||
"symptom": "Symptom",
|
||
"symptomDescription": "One of your own symptoms, with how strong",
|
||
"lifeEventDescription": "A move, a birth, a new job",
|
||
"lifeEvent": "Life event"
|
||
},
|
||
"cycle": "Cycle",
|
||
"labs": "Labs",
|
||
"profile": "Profile",
|
||
"vorsorge": "Checkups",
|
||
"illness": "Illness",
|
||
"documents": "Documents",
|
||
"vaccinations": "Vaccinations",
|
||
"mentalWellbeing": "Mental wellbeing",
|
||
"timeline": "Timeline"
|
||
},
|
||
"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",
|
||
"invitedBanner": "You have been invited. Create your account even while registration is otherwise closed.",
|
||
"alreadySignedIn": {
|
||
"title": "You are already signed in",
|
||
"body": "You are signed in as {username}. An invitation creates a new account. Sign out to accept it.",
|
||
"signOut": "Sign out and accept the invitation"
|
||
},
|
||
"createAccount": "Create 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",
|
||
"passwordBreached": "This password has appeared in known data breaches. Please choose a different one.",
|
||
"oidc": {
|
||
"signInDefault": "Sign in with SSO",
|
||
"errorDenied": "Sign-in was cancelled.",
|
||
"errorNoEmail": "Your identity provider did not share a verified email address.",
|
||
"errorEmailUnverified": "Your identity provider did not mark your email address as verified.",
|
||
"errorIdentityConflict": "That email address belongs to an account that is already linked to a different SSO identity.",
|
||
"errorRegistrationDisabled": "No account matches that identity, and new sign-ups are currently closed.",
|
||
"errorFailed": "Single sign-on failed. Please try again.",
|
||
"errorLinkRequired": "An account with this email address already exists here. Sign in to it once with its password or passkey to connect it to single sign-on."
|
||
},
|
||
"native": {
|
||
"signingInToApp": "Signing in to the HealthLog app"
|
||
},
|
||
"mfa": {
|
||
"title": "Two-factor authentication",
|
||
"totpHint": "Enter the 6-digit code from your authenticator app.",
|
||
"recoveryHint": "Enter one of your saved recovery codes.",
|
||
"securityKeyHint": "Use your registered security key to continue.",
|
||
"codeLabel": "Authentication code",
|
||
"recoveryLabel": "Recovery code",
|
||
"verify": "Verify",
|
||
"verifyFailed": "Verification failed. Please try again.",
|
||
"useSecurityKey": "Use a security key",
|
||
"useRecoveryCode": "Use a recovery code",
|
||
"useAuthenticator": "Use your authenticator app",
|
||
"backToLogin": "Back to login",
|
||
"rememberDevice": "Trust this device for 30 days"
|
||
},
|
||
"enrollMfa": {
|
||
"title": "Set up a second factor",
|
||
"body": "Your administrator requires a second factor on this account. Add an authenticator app or a security key to continue.",
|
||
"signOut": "Sign out"
|
||
},
|
||
"confirmAccess": {
|
||
"title": "Confirm it is you",
|
||
"body": "An assistant is asking to connect to your HealthLog data. Confirm it is you, then you will be taken back to decide whether to allow it.",
|
||
"action": "Confirm",
|
||
"failed": "That did not work. Please try again.",
|
||
"nothingToConfirm": "There is nothing to confirm here. Start the connection again from your assistant."
|
||
},
|
||
"insecureTransport": {
|
||
"title": "Signing in cannot complete on this page",
|
||
"body": "This server only sets its sign-in cookie over https://, but this page was opened over http://. The browser would drop the cookie, so signing in is switched off here.",
|
||
"fixLan": "Server on a home network without TLS: set SESSION_COOKIE_SECURE=false in its settings and restart it.",
|
||
"fixHttps": "Server behind an HTTPS proxy: open the https:// address instead, and make sure the proxy forwards X-Forwarded-Proto: https.",
|
||
"localhostNote": "This page is on http://localhost while the server sets its sign-in cookie for https:// only. Most browsers accept that on localhost; if signing in keeps returning here, set SESSION_COOKIE_SECURE=false."
|
||
},
|
||
"claim": {
|
||
"title": "Take over your health record",
|
||
"titleNamed": "Welcome, {name}",
|
||
"description": "Your health record has been looked after for you until now. Choose how you sign in and it becomes your own account. Nothing is copied or moved.",
|
||
"loading": "Checking your link…",
|
||
"invalid": "This link no longer works",
|
||
"invalidHint": "It is unknown, expired, withdrawn or already used. Ask the person who sent it for a new one.",
|
||
"oidcOnly": "This server only allows single sign-on. Continue with your identity provider instead.",
|
||
"signedInTitle": "Sign out first",
|
||
"signedInBody": "You are signed in as {username}. This link sets up a sign-in for someone else, so sign out before you use it.",
|
||
"signOut": "Sign out and continue",
|
||
"guardiansTitle": "Who keeps access for now",
|
||
"guardiansHint": "Proposed by the people who looked after your record. You decide right after signing in.",
|
||
"guardianUnnamed": "A guardian",
|
||
"usernameHint": "3 to 30 letters, numbers, _ or -.",
|
||
"usernameReserved": "Usernames starting with managed- are reserved.",
|
||
"emailHint": "Required, so you can get back in if you forget your password.",
|
||
"consentNote": "You confirm the disclaimer and any use of AI yourself. Until you do, nothing from your record is sent to an AI provider.",
|
||
"expires": "This link is valid until {date}.",
|
||
"submit": "Take over",
|
||
"submitting": "Taking over…",
|
||
"errorTaken": "That username or email address is already in use.",
|
||
"errorRateLimit": "Too many attempts. Wait a few minutes and try again.",
|
||
"errorFailed": "That did not work. Try again in a moment.",
|
||
"errorOffline": "That did not reach the server. Check your connection and try again.",
|
||
"ssoContinue": "Continue with {provider}",
|
||
"ssoStarting": "Redirecting…",
|
||
"ssoHint": "From then on you sign in here with your {provider} account.",
|
||
"ssoDivider": "or",
|
||
"ssoFallbackName": "single sign-on",
|
||
"errorTitle": "The handover did not go through",
|
||
"errorSubjectBound": "This sign-in already belongs to another account on this server. Open the link again and use a different account at your identity provider.",
|
||
"errorEmailTaken": "Your identity provider gave an email address that another account here already uses. Open the link again and use a different account, or ask the server's administrator.",
|
||
"errorUsernameTaken": "Someone took that username in the meantime. Open the link again and choose another one.",
|
||
"errorSignedIn": "You were signed in when you came back. Sign out, then open the link again.",
|
||
"errorSso": "Signing in with your identity provider did not work. Open the link again to try once more.",
|
||
"signInInstead": "Sign in to that account"
|
||
},
|
||
"inviteInvalid": {
|
||
"title": "Invitation invalid",
|
||
"description": "This invitation link is incomplete or was copied wrongly. Ask the person who invited you for a new link.",
|
||
"toLogin": "Go to sign in"
|
||
},
|
||
"deletionPending": "This account is scheduled for deletion on {date} and is locked until then. An admin of this server can undo the deletion before that date.",
|
||
"deletionPendingNoDate": "This account is scheduled for deletion and is locked. An admin of this server can undo the deletion until it completes."
|
||
},
|
||
"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",
|
||
"bpInTargetWindow90": "BP in Target (90d)",
|
||
"bpInTargetWindowDynamic": "BP in Target ({days}d)",
|
||
"bpInTargetCollecting": "collecting data",
|
||
"medications": "Medications",
|
||
"quickAddMeasurement": "Log measurement",
|
||
"quickAddMood": "Log mood",
|
||
"quickAddMedicationIntake": "Log medication intake",
|
||
"quickAddWorkout": "Log workout",
|
||
"quickAddLifeEvent": "Log life event",
|
||
"customizeDashboard": "Customize dashboard",
|
||
"medicationIntakeQuickAdd": {
|
||
"sheetDescription": "Record dose, time, and medication in a few taps.",
|
||
"medicationLabel": "Medication",
|
||
"medicationPlaceholder": "Select a medication",
|
||
"doseLabel": "Dose",
|
||
"dosePlaceholder": "e.g. 5 mg",
|
||
"doseHint": "Pre-filled with the standard dose. Edit it to record a deviating dose for this intake only.",
|
||
"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",
|
||
"noneActionableTitle": "Nothing to take today",
|
||
"noneActionableDescription": "Your medications are paused, kept as a record, or their course has not started or has already ended. A past dose can still be added from a medication's history.",
|
||
"noneActionableCta": "Open medications"
|
||
},
|
||
"quickEntryDiscard": {
|
||
"title": "Discard this entry?",
|
||
"description": "You have unsaved input. Close the form and lose what you typed?",
|
||
"confirm": "Discard",
|
||
"cancel": "Keep editing"
|
||
},
|
||
"compliance7d": "Adherence (7 days)",
|
||
"mood": "Mood",
|
||
"customizeTitle": "Dashboard layout",
|
||
"heroItemsTitle": "Today highlights",
|
||
"heroItemsDescription": "Choose which item types can appear in Today highlights.",
|
||
"heroItemsNotificationNote": "Notification settings are managed separately.",
|
||
"heroContentTitle": "Top card shows",
|
||
"heroContentScore": "Health score and daily summary",
|
||
"heroContentReminders": "Today highlights",
|
||
"heroItems": {
|
||
"coach_checkin": "Coach check-ins",
|
||
"dose_window": "Medication doses",
|
||
"preventive_care": "Preventive care",
|
||
"sync_issue": "Sync issues",
|
||
"milestone": "Milestones",
|
||
"ecg_new_recording": "New ECG recordings",
|
||
"tension_window": "Tension windows",
|
||
"same_time_baseline": "Same-time activity",
|
||
"upcoming_visit": "Appointments"
|
||
},
|
||
"layoutReset": "Reset to defaults",
|
||
"layoutResetTitle": "Reset the dashboard layout?",
|
||
"layoutResetBody": "Your tile layout and Today highlight choices return to their defaults.",
|
||
"layoutResetConfirm": "Reset layout",
|
||
"layoutSaveSuccess": "Dashboard layout saved",
|
||
"layoutSaveError": "Could not save dashboard layout",
|
||
"layoutConflictReloaded": "Layout reloaded from the server. Please make your change again.",
|
||
"layoutResetSuccess": "Reset to default layout",
|
||
"layoutUsingDefaults": "Using default layout",
|
||
"layoutCustomized": "Custom layout active",
|
||
"moveUp": "Move up",
|
||
"moveDown": "Move down",
|
||
"layoutTileColumn": "Tile",
|
||
"layoutChartColumn": "Chart",
|
||
"layoutNativeOnlyTitle": "Shown in the mobile app",
|
||
"layoutNativeOnlyHint": "The mobile app draws these widgets; this page does not. They are stored in the same layout, so this is where their visibility is set.",
|
||
"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",
|
||
"staleHintWeeksFew": "Last reading {count} weeks ago",
|
||
"staleHintMonthsOne": "Last reading 1 month ago",
|
||
"staleHintMonthsOther": "Last reading {count} months ago",
|
||
"staleHintMonthsFew": "Last reading {count} months ago",
|
||
"recentWorkouts": {
|
||
"title": "Recent workouts",
|
||
"viewAll": "View all",
|
||
"empty": {
|
||
"title": "No workouts yet",
|
||
"cta": "Connect a data source in Settings to see 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",
|
||
"mood": "Mood",
|
||
"bmi": "BMI"
|
||
},
|
||
"unit": {
|
||
"weight": "kg",
|
||
"bloodPressure": "mmHg",
|
||
"pulse": "bpm",
|
||
"bodyFat": "%",
|
||
"glucose": "mg/dL",
|
||
"sleep": "h",
|
||
"steps": "steps",
|
||
"totalBodyWater": "kg",
|
||
"boneMass": "kg",
|
||
"oxygenSaturation": "%",
|
||
"mood": "/5",
|
||
"bmi": "kg/m²"
|
||
}
|
||
},
|
||
"quickAddSymptom": "Log symptom",
|
||
"todayCardVisible": "Show the top card",
|
||
"recoveryKitBanner": {
|
||
"title": "Save your recovery kit",
|
||
"body": "Without copies of the keys this server uses, its data cannot be recovered after a reinstall. It takes a few minutes.",
|
||
"action": "Open the kit"
|
||
},
|
||
"greetingOnly": "{greeting}.",
|
||
"welcomeNew": "Welcome.",
|
||
"welcomeNewWithName": "Welcome, {name}."
|
||
},
|
||
"measurements": {
|
||
"title": "Measurements",
|
||
"subtitle": "Log readings and browse the full history.",
|
||
"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",
|
||
"timestampBackdateHint": "Adjust the date and time to log a past reading.",
|
||
"notesPlaceholder": "e.g. after a meal",
|
||
"formReset": "Reset form",
|
||
"saveError": "Error saving",
|
||
"duplicateTimestamp": "A measurement of this type already exists at the selected timestamp.",
|
||
"serverOwnedSource": "Values from a connected source can't be edited, but the timestamp and note stay editable.",
|
||
"deleteError": "Error deleting",
|
||
"deletedToast": "Measurement deleted",
|
||
"restoredToast": "Measurement restored",
|
||
"restoreError": "Restore failed",
|
||
"invalidValue": "Please enter a valid value.",
|
||
"invalidTimestamp": "Please select a valid time.",
|
||
"loginRequired": "Please sign in to view measurements.",
|
||
"allTypes": "All types",
|
||
"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 deleted. You can undo this for a short moment afterwards.",
|
||
"pageInfo": "Page {page} of {total}",
|
||
"previousPage": "Previous page",
|
||
"nextPage": "Next page",
|
||
"dailyTotalCaption": "({count} samples)",
|
||
"openMetricInsights": "Open {type} insights",
|
||
"sleepNapCaption": "incl. {count} nap(s)",
|
||
"sleepAwakeningsCaption": "{count} awakening(s)",
|
||
"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",
|
||
"typeHrvRmssd": "HRV (RMSSD)",
|
||
"typeDayStrain": "Day strain",
|
||
"typeWorkoutStrain": "Workout strain",
|
||
"typeSleepPerformance": "Sleep performance",
|
||
"typeSleepEfficiency": "Sleep efficiency",
|
||
"typeSleepConsistency": "Sleep consistency",
|
||
"typeSleepNeed": "Sleep need",
|
||
"typeEnergyExpenditureKj": "Energy expenditure",
|
||
"typeAverageHeartRate": "Average heart rate",
|
||
"typeMaxHeartRate": "Maximum heart rate",
|
||
"typeSleepDisturbanceCount": "Sleep disturbances",
|
||
"typeAnsCharge": "ANS charge",
|
||
"typeCardioLoad": "Cardio load",
|
||
"typeSleepScore": "Sleep score",
|
||
"typeBodyTemperatureDeviation": "Body temperature deviation",
|
||
"typeResilience": "Resilience",
|
||
"sourceComputed": "Computed",
|
||
"sourceWhoop": "WHOOP",
|
||
"sourceFitbit": "Fitbit",
|
||
"sourceNightscout": "Nightscout",
|
||
"sourcePolar": "Polar",
|
||
"sourceOura": "Oura",
|
||
"sourceTelegram": "Telegram",
|
||
"sourceMcp": "MCP",
|
||
"sourceGoogleHealth": "Google Health",
|
||
"sourceStrava": "Strava",
|
||
"sourceExternal": "External device",
|
||
"bulkDeleteSuccess": "{count} measurements deleted",
|
||
"bulkDeleteSuccessOne": "Measurement deleted",
|
||
"bulkDeleteError": "Error deleting the selected measurements",
|
||
"bulkDeleteConfirmTitle": "Delete {count} measurements?",
|
||
"bulkDeleteConfirmTitleOne": "Delete this measurement?",
|
||
"bulkDeleteConfirmBody": "The {count} selected measurements will be deleted. You can undo this for a short moment afterwards.",
|
||
"bulkDeleteConfirmBodyOne": "The selected measurement will be deleted. You can undo this for a short moment afterwards.",
|
||
"typePhq9Score": "PHQ-9 score",
|
||
"typeGad7Score": "GAD-7 score",
|
||
"typeGripStrength": "Grip strength",
|
||
"typePainNrs": "Pain (0–10)",
|
||
"typeWaistCircumference": "Waist circumference",
|
||
"typeWaistToHeight": "Waist-to-height ratio",
|
||
"unitScore": "pts",
|
||
"unitRatio": "ratio",
|
||
"unitRating": "rating",
|
||
"typeWho5Score": "WHO-5 score",
|
||
"typeSciScore": "SCI score",
|
||
"typeExerciseMinutes": "Exercise minutes",
|
||
"typeStandMinutes": "Standing minutes",
|
||
"typeStandHours": "Stand hours",
|
||
"typeMindfulMinutes": "Mindful minutes",
|
||
"typeStateOfMindValence": "State of mind",
|
||
"typeAfibBurden": "AFib burden",
|
||
"typeIndoorCo2": "Indoor CO₂",
|
||
"typeIndoorTemperature": "Indoor temperature",
|
||
"typeIndoorHumidity": "Indoor humidity",
|
||
"durationReadAs": "Read as {duration}",
|
||
"durationHoursMinutes": "{hours} h {minutes} min",
|
||
"durationHoursOnly": "{hours} h",
|
||
"durationMinutesOnly": "{minutes} min",
|
||
"durationInvalid": "Enter a duration like 7.5, 7:30 or 7h 30m.",
|
||
"durationTooLong": "One entry can't be longer than 24 hours.",
|
||
"sourceHealthConnect": "Health Connect",
|
||
"typeBodyBattery": "Body Battery",
|
||
"typeStressLevel": "Stress level",
|
||
"typeTrainingReadiness": "Training readiness",
|
||
"typeAcuteTrainingLoad": "Acute training load",
|
||
"sourceGarmin": "Garmin"
|
||
},
|
||
"metricCatalog": {
|
||
"title": "What HealthLog can track",
|
||
"description": "Every metric domain HealthLog supports, whether or not you have data for it yet, and what would supply it.",
|
||
"statusPresent": "Tracked",
|
||
"statusAbsent": "Not tracked yet",
|
||
"statusModuleOff": "Off",
|
||
"loadError": "Could not load your tracking status.",
|
||
"connectCta": "Connect a source",
|
||
"viewCta": "View",
|
||
"ecg": {
|
||
"source": "Single-lead ECG strips from a compatible watch (Withings ScanWatch today), synced automatically."
|
||
},
|
||
"watchdog": {
|
||
"title": "Automatic screening",
|
||
"description": "HealthLog also watches quietly in the background: irregular-rhythm and breathing-disturbance notifications from a connected watch, baseline-drift health-status alerts, and notable shifts between your two most recent lab panels. It surfaces a card only when something stands out. With at least one of those sources connected, no card showing is a good sign, not a missing feature; with none connected yet, there's simply nothing being watched."
|
||
}
|
||
},
|
||
"mood": {
|
||
"title": "Mood",
|
||
"subtitle": "Mood tracker and entries",
|
||
"mentalWellbeingLink": "Take a mental-wellbeing check-in",
|
||
"addEntry": "Add",
|
||
"editEntry": "Edit entry",
|
||
"moodLevel": "Mood",
|
||
"heroQuestion": "How are you?",
|
||
"factorYes": "Yes",
|
||
"factorNo": "No",
|
||
"factorRatingOption": "{label}: {value} of {max}",
|
||
"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",
|
||
"noteCharCount": "{count}/{max}",
|
||
"formResetConfirmTitle": "Reset this form?",
|
||
"formResetConfirmBody": "This clears the mood, tags and note you have entered. This cannot be undone.",
|
||
"formResetConfirmAction": "Reset",
|
||
"saveError": "Error saving",
|
||
"tagsNotSaved": "Saved. Tags that are no longer available were left off.",
|
||
"deleteError": "Error deleting",
|
||
"deletedToast": "Entry deleted",
|
||
"restoredToast": "Entry restored",
|
||
"restoreError": "Restore failed",
|
||
"invalidTimestamp": "Please select a valid time.",
|
||
"deleteConfirmTitle": "Delete entry?",
|
||
"deleteConfirmDescription": "This mood entry will be deleted. You can undo this for a short moment afterwards.",
|
||
"pageInfo": "Page {page} of {total}",
|
||
"previousPage": "Previous page",
|
||
"nextPage": "Next page",
|
||
"loginRequired": "Please sign in to view mood entries.",
|
||
"note": "Note",
|
||
"noteCollapse": "Collapse note",
|
||
"noteExpand": "Show full note",
|
||
"notePlaceholder": "Add a note about how you're feeling…",
|
||
"tagPicker": "Tags",
|
||
"tagCategory": {
|
||
"feelings": "Feelings",
|
||
"sleep": "Sleep",
|
||
"health": "Health",
|
||
"social": "Social",
|
||
"work": "Work",
|
||
"hobbies": "Hobbies",
|
||
"factors": "Factors",
|
||
"custom": "Custom"
|
||
},
|
||
"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",
|
||
"caffeine": "caffeine",
|
||
"nicotine": "nicotine",
|
||
"family": "family",
|
||
"friends": "friends",
|
||
"party": "party",
|
||
"alone": "alone",
|
||
"productive": "productive",
|
||
"overtime": "overtime",
|
||
"dayOff": "day off",
|
||
"travel": "travel",
|
||
"sickDay": "sick day",
|
||
"movies": "movies",
|
||
"reading": "reading",
|
||
"gaming": "gaming",
|
||
"music": "music",
|
||
"outdoors": "outdoors",
|
||
"fastFood": "fast food",
|
||
"noSweets": "no sweets",
|
||
"bigMeal": "big meal",
|
||
"factorWork": "work",
|
||
"factorSocial": "social",
|
||
"factorSleepQuality": "sleep quality",
|
||
"factorStress": "stress",
|
||
"factorConflict": "conflict",
|
||
"factorFamily": "family",
|
||
"factorSadness": "sadness",
|
||
"praise": "praise"
|
||
},
|
||
"sourceManual": "Manual",
|
||
"sourceWeb": "Web",
|
||
"sourceTelegram": "Telegram",
|
||
"sourceDaylio": "Daylio",
|
||
"bulkDeleteSuccess": "{count} entries deleted",
|
||
"bulkDeleteSuccessOne": "Entry deleted",
|
||
"bulkDeleteError": "Error deleting the selected entries",
|
||
"bulkDeleteConfirmTitle": "Delete {count} entries?",
|
||
"bulkDeleteConfirmTitleOne": "Delete this entry?",
|
||
"bulkDeleteConfirmBody": "The {count} selected mood entries will be deleted. You can undo this for a short moment afterwards.",
|
||
"bulkDeleteConfirmBodyOne": "The selected mood entry will be deleted. You can undo this for a short moment afterwards.",
|
||
"customize": "Customize mood tags",
|
||
"addTagInline": "Add tag",
|
||
"manage": {
|
||
"groupsTitle": "Groups",
|
||
"groupsDescription": "Create your own groups and set the order the picker shows them in.",
|
||
"newGroup": "New group",
|
||
"groupLabel": "Group name",
|
||
"groupIcon": "Icon",
|
||
"groupCreated": "Group created",
|
||
"groupRenamed": "Group saved",
|
||
"groupDeleteTitle": "Delete group?",
|
||
"groupDeleteBody": "Tags in this group move back to their original group. No entries are deleted.",
|
||
"groupDeleted": "Group deleted",
|
||
"groupEmpty": "No own groups yet.",
|
||
"groupLimitReached": "Group limit reached",
|
||
"tagsTitle": "Tags",
|
||
"tagsDescription": "Hide, rearrange, move, or edit the tags the picker shows.",
|
||
"newTag": "New tag",
|
||
"tagLabel": "Tag name",
|
||
"tagIcon": "Icon",
|
||
"tagGroup": "Group",
|
||
"usageCount": "{count} entries",
|
||
"hideTag": "Hide tag",
|
||
"showTag": "Show tag",
|
||
"moveToGroup": "Move to group",
|
||
"archive": "Archive",
|
||
"restore": "Restore",
|
||
"archivedTitle": "Archived tags",
|
||
"archivedDescription": "Archived tags stay in your past entries. They only disappear from the picker.",
|
||
"archivedEmpty": "Nothing archived.",
|
||
"purgeTitle": "Delete tag permanently?",
|
||
"purgeBody": "This removes the tag from {count} past entries. This cannot be undone.",
|
||
"purgeAction": "Delete permanently",
|
||
"purged": "Tag deleted",
|
||
"tagLimitReached": "Tag limit reached",
|
||
"iconPickerTitle": "Choose an icon",
|
||
"iconSearchPlaceholder": "Search icons…",
|
||
"iconSearchEmpty": "No icon matches.",
|
||
"iconSearchClear": "Clear search",
|
||
"orderSave": "Save order",
|
||
"orderSaved": "Order saved",
|
||
"moveUp": "Move up",
|
||
"moveDown": "Move down",
|
||
"iconGroupEmotions": "Emotions",
|
||
"iconGroupActivities": "Activities",
|
||
"iconGroupHealth": "Health",
|
||
"iconGroupFood": "Food & drink",
|
||
"iconGroupWeather": "Weather",
|
||
"iconGroupPlaces": "Places",
|
||
"iconGroupMisc": "Other"
|
||
},
|
||
"sectionMoreTags": "More tags",
|
||
"sectionNoteDetails": "Note & details",
|
||
"quickTagsHelp": "Your frequent tags, one tap",
|
||
"quickTagsExpand": "More",
|
||
"loadError": "Could not load your mood entries.",
|
||
"sectionLevelA": "State of mind",
|
||
"sectionLevelAHelp": "Optional. Anything you leave alone stays empty.",
|
||
"dimensionNotAnswered": "not recorded",
|
||
"dimensionClear": "clear",
|
||
"dimensionValueText": "{value} of {max}: {low} to {high}",
|
||
"dimension": {
|
||
"a1": {
|
||
"label": "Mood",
|
||
"low": "very unpleasant",
|
||
"high": "very pleasant"
|
||
},
|
||
"a2": {
|
||
"label": "Stress",
|
||
"low": "completely relaxed",
|
||
"high": "extremely strained"
|
||
},
|
||
"a3": {
|
||
"label": "Energy",
|
||
"low": "drained",
|
||
"high": "full of energy"
|
||
},
|
||
"a4": {
|
||
"label": "Connectedness",
|
||
"low": "isolated",
|
||
"high": "understood and supported"
|
||
},
|
||
"a5": {
|
||
"label": "Stability",
|
||
"low": "completely overwhelmed",
|
||
"high": "fully able to act"
|
||
}
|
||
},
|
||
"context": {
|
||
"section": {
|
||
"work": "Work",
|
||
"contacts": "Contact",
|
||
"leisure": "Free time",
|
||
"events": "Event"
|
||
},
|
||
"field": {
|
||
"workStatus": "Working day",
|
||
"workMinutes": "Time worked",
|
||
"overtimeMinutes": "Overtime",
|
||
"workLoad": "Workload",
|
||
"workSatisfaction": "Satisfaction with the work",
|
||
"contactCircles": "Who the contact was with",
|
||
"contactForm": "Form of contact",
|
||
"contactExtent": "How long it lasted",
|
||
"contactQuality": "Quality of the contact",
|
||
"contactSupport": "Support felt",
|
||
"leisureCategories": "What the free time went into",
|
||
"leisureMinutes": "Time for yourself",
|
||
"leisureJoy": "Enjoyment",
|
||
"leisureRecovery": "Recovery",
|
||
"eventType": "What happened",
|
||
"eventValence": "How it landed",
|
||
"eventAt": "When",
|
||
"notes": "Note"
|
||
},
|
||
"workStatus": {
|
||
"off": "Not working",
|
||
"partial": "Part of the day",
|
||
"regular": "A regular day",
|
||
"overtime": "Longer than usual"
|
||
},
|
||
"contactCircles": {
|
||
"partner": "Partner",
|
||
"child": "Child",
|
||
"family": "Family",
|
||
"friends": "Friends",
|
||
"colleagues": "Colleagues",
|
||
"acquaintances": "Acquaintances",
|
||
"professional": "Professional support",
|
||
"other": "Others"
|
||
},
|
||
"contactForm": {
|
||
"inPerson": "In person",
|
||
"phone": "Phone",
|
||
"video": "Video call",
|
||
"written": "Written"
|
||
},
|
||
"contactExtent": {
|
||
"brief": "Brief",
|
||
"medium": "Medium",
|
||
"extended": "Extended"
|
||
},
|
||
"leisureCategories": {
|
||
"film": "Film or series",
|
||
"reading": "Reading",
|
||
"gaming": "Gaming",
|
||
"music": "Music",
|
||
"creative": "Something creative",
|
||
"outing": "Out and about",
|
||
"garden": "Garden",
|
||
"cooking": "Cooking",
|
||
"timeWithChild": "Time with the child",
|
||
"relaxation": "Rest",
|
||
"other": "Something else"
|
||
},
|
||
"eventType": {
|
||
"goodNews": "Good news",
|
||
"badNews": "Bad news",
|
||
"success": "Something worked out",
|
||
"disappointment": "A disappointment",
|
||
"conflict": "A conflict",
|
||
"appointment": "An appointment",
|
||
"familyEvent": "A family occasion",
|
||
"change": "A change",
|
||
"unexpected": "Something unexpected"
|
||
},
|
||
"rating": {
|
||
"workLoad": {
|
||
"low": "no pressure",
|
||
"high": "under heavy pressure"
|
||
},
|
||
"workSatisfaction": {
|
||
"low": "not satisfied at all",
|
||
"high": "very satisfied"
|
||
},
|
||
"contactQuality": {
|
||
"low": "did not do me good",
|
||
"high": "did me a lot of good"
|
||
},
|
||
"contactSupport": {
|
||
"low": "not supported",
|
||
"high": "well supported"
|
||
},
|
||
"leisureJoy": {
|
||
"low": "no enjoyment",
|
||
"high": "a lot of enjoyment"
|
||
},
|
||
"leisureRecovery": {
|
||
"low": "not restorative",
|
||
"high": "very restorative"
|
||
},
|
||
"eventValence": {
|
||
"low": "clearly bad",
|
||
"high": "clearly good"
|
||
}
|
||
}
|
||
},
|
||
"dayContext": {
|
||
"minutesPlaceholder": "Minutes",
|
||
"contactsHelp": "How many people it was says nothing about the day. What counts is how the contact felt.",
|
||
"notePlaceholder": "Anything else that belongs to this day",
|
||
"notRecorded": "not recorded",
|
||
"linkedTitle": "From your other modules",
|
||
"linkedHelp": "Read from where it is kept. Change it there and it changes here.",
|
||
"linkedSleep": "Asleep",
|
||
"linkedInBed": "In bed",
|
||
"linkedSteps": "Steps",
|
||
"linkedActiveEnergy": "Active energy",
|
||
"linkedRestingHeartRate": "Resting heart rate",
|
||
"linkedHrv": "Heart rate variability",
|
||
"bodyLogged": "Logged in the illness journal: {count} symptoms",
|
||
"bodyNotLogged": "Nothing is logged in the illness journal for this day",
|
||
"openIllness": "Open"
|
||
},
|
||
"sourceNotification": "Notification",
|
||
"tagCatalogLoadError": "Could not load the tags."
|
||
},
|
||
"medications": {
|
||
"title": "Medications",
|
||
"subtitle": "Medications, schedules & intake",
|
||
"loginRequired": "Please sign in to manage medications.",
|
||
"addMedication": "Add",
|
||
"firstMedication": "Add first medication",
|
||
"addChoice": {
|
||
"logIntake": "Log an intake",
|
||
"newMedication": "New medication"
|
||
},
|
||
"takeAllDue": {
|
||
"button": "Take all due",
|
||
"dialogTitle": "Take due medications",
|
||
"dialogDescription": "These medications are due now. Confirm to record all of them as taken.",
|
||
"confirm": "Take all ({count})",
|
||
"successToast": "{count} intakes recorded",
|
||
"partialToast": "{taken} recorded, {failed} failed. Please try again",
|
||
"failedToast": "No intake recorded. Please try again"
|
||
},
|
||
"logIntake": {
|
||
"dialogTitle": "Log an intake",
|
||
"dialogDescription": "Record a dose against an existing medication. You can backdate it to a past date and time.",
|
||
"medicationLabel": "Medication",
|
||
"slotLabel": "Schedule slot",
|
||
"slotNone": "No specific slot",
|
||
"doseLabel": "Dose",
|
||
"doseHint": "Pre-filled with the medication or slot dose. Edit it to record a deviating dose for this intake only.",
|
||
"takenAtLabel": "Date and time",
|
||
"takenAtHint": "Defaults to now; pick an earlier date and time to log a past dose.",
|
||
"skippedLabel": "Logged as skipped",
|
||
"noMedications": "Add a medication first, then you can log intakes against it.",
|
||
"cancel": "Cancel",
|
||
"submit": "Log intake",
|
||
"slotError": "The selected slot couldn’t be matched to a time. Pick another slot or “No specific slot”."
|
||
},
|
||
"emptyTitle": "No medications yet",
|
||
"emptyDescription": "Add medications, dosages, and reminder windows to track adherence.",
|
||
"loadFailed": "Could not load medications",
|
||
"retryLoad": "Retry",
|
||
"inactive": "Paused",
|
||
"intakeHistory": "Intake history",
|
||
"openDetailPage": "Open medication detail page",
|
||
"compliance": "Adherence",
|
||
"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",
|
||
"importFailed": "Import failed",
|
||
"importInvalidFormat": "Invalid JSON format",
|
||
"requestExample": "Request example",
|
||
"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",
|
||
"categoryMentalHealth": "Mental health",
|
||
"categoryOther": "Other",
|
||
"daysSun": "Sun",
|
||
"daysMon": "Mon",
|
||
"daysTue": "Tue",
|
||
"daysWed": "Wed",
|
||
"daysThu": "Thu",
|
||
"daysFri": "Fri",
|
||
"daysSat": "Sat",
|
||
"back": "Back",
|
||
"today": "Today",
|
||
"yesterday": "Yesterday",
|
||
"tomorrow": "Tomorrow",
|
||
"asNeededMarker": "As needed",
|
||
"recordOnlyBadge": "Record only",
|
||
"courseEndedBadge": "Ended",
|
||
"trackIntake": {
|
||
"title": "Intake tracking",
|
||
"label": "Track intake",
|
||
"helperOn": "Doses fall due on this schedule, with reminders and adherence.",
|
||
"helperOff": "Kept as a record: nothing falls due, no reminders, no adherence.",
|
||
"enabledToast": "Intake tracking on",
|
||
"disabledToast": "Intake tracking off",
|
||
"toggleFailed": "Could not change intake tracking."
|
||
},
|
||
"autoMarkTaken": {
|
||
"label": "Record doses automatically",
|
||
"helper": "HealthLog records each scheduled dose as taken at its time. You can still change or skip a dose by hand. No reminders are sent.",
|
||
"cardHint": "Recorded automatically",
|
||
"enabledToast": "Doses are now recorded automatically",
|
||
"disabledToast": "Doses are no longer recorded automatically",
|
||
"toggleFailed": "Could not change automatic recording."
|
||
},
|
||
"withoutNotification": "Without notification",
|
||
"pausedSince": "Paused since",
|
||
"takeNow": "Take now",
|
||
"lastDoseYesterday": "Last dose yesterday",
|
||
"lastDoseDaysAgo": "Last dose {count} days ago",
|
||
"overdue": "Overdue",
|
||
"veryOverdue": "Very overdue",
|
||
"complianceWindow": "Adherence ({days} days)",
|
||
"complianceUnavailable": "Adherence could not be loaded",
|
||
"complianceNotApplicable": "Adherence not applicable",
|
||
"complianceNotApplicableReason": "No local schedule is stored in HealthLog.",
|
||
"complianceInfo": "Share of expected doses you logged. Weekly schedules count week by week.",
|
||
"complianceInfoLabel": "What does adherence mean?",
|
||
"lastIntake": "Last intake:",
|
||
"nextIntake": "Next intake:",
|
||
"nextIntakeOverdue": "Overdue since {time}, can still be taken",
|
||
"dayStreak": "day streak",
|
||
"dayStreakOne": "day streak",
|
||
"cycleDueToday": "Due today",
|
||
"cycleNoClosedCycles": "No closed dose cycles yet",
|
||
"taken": "Taken",
|
||
"skipped": "Skipped",
|
||
"intakeToastTaken": "{name} recorded as taken",
|
||
"intakeToastSkipped": "{name} skipped",
|
||
"intakeToastFailed": "Could not record {name}. Try again",
|
||
"intakeUndo": "Undo",
|
||
"intakeUndone": "Entry reverted",
|
||
"intakeUndoFailed": "Could not undo. Open the history to fix it",
|
||
"glp1LastInjection": "{label}",
|
||
"glp1NextInjectionDays": "{label} (in {days} days)",
|
||
"glp1NextInjectionToday": "today",
|
||
"glp1NextInjectionTomorrow": "tomorrow",
|
||
"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…",
|
||
"loadMore": "Load more",
|
||
"deleteCta": "Delete",
|
||
"deleteError": "Could not delete the 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"
|
||
},
|
||
"deleteConfirmTitle": "Delete this entry?",
|
||
"deleteConfirmBody": "This side-effect entry will be permanently removed."
|
||
},
|
||
"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.",
|
||
"consent": "Reading your description with AI needs your consent first.",
|
||
"unavailable": "Reading descriptions with AI is not available here right now."
|
||
}
|
||
},
|
||
"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.",
|
||
"short": "Dose",
|
||
"unitsPerDoseLabel": "Units per dose",
|
||
"unitsPerDoseHint": "e.g. 2 tablets of 2 mg for a 4 mg dose, or ½ a tablet for a split 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"
|
||
},
|
||
"overrideHint": "Optional: set a different dose or unit count just for this time of day. Leave blank to use the medication's default.",
|
||
"doseOverrideLabel": "Dose for this time (optional)",
|
||
"doseOverridePlaceholder": "e.g. half a tablet",
|
||
"unitsOverrideLabel": "Units consumed at this time",
|
||
"unitsOverrideInherit": "Default",
|
||
"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.",
|
||
"noChannelHint": "Reminders need a notification channel, and none is active right now.",
|
||
"noChannelHintLink": "Set up notifications",
|
||
"short": "Done"
|
||
}
|
||
},
|
||
"classRow": {
|
||
"bloodPressure": "Blood pressure",
|
||
"diabetes": "Diabetes",
|
||
"hormone": "Hormones",
|
||
"glp1": "GLP-1 injection",
|
||
"painRelief": "Pain",
|
||
"allergy": "Allergy",
|
||
"vitamin": "Vitamins",
|
||
"supplement": "Supplement",
|
||
"antibiotic": "Antibiotic",
|
||
"mentalHealth": "Mental health",
|
||
"thyroid": "Thyroid",
|
||
"digestive": "Gastrointestinal",
|
||
"skin": "Skincare",
|
||
"sleepAid": "Sleep aid",
|
||
"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."
|
||
},
|
||
"asNeeded": {
|
||
"label": "As needed",
|
||
"description": "No fixed plan. Log an intake whenever you need one (e.g. pain relief)."
|
||
}
|
||
},
|
||
"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",
|
||
"asNeeded": "As needed",
|
||
"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."
|
||
}
|
||
},
|
||
"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."
|
||
},
|
||
"titration": {
|
||
"title": "Titration plan",
|
||
"empty": "No dose-escalation steps recorded yet. Add dated dose changes to plot the plan.",
|
||
"youAreHere": "You are here",
|
||
"doseStep": "{dose} {unit}",
|
||
"plannedFor": "Planned for {date}"
|
||
},
|
||
"injectionSiteBodyOutlineAriaLabel": "Body outline",
|
||
"injectionSitePickerAriaLabel": "Injection site picker",
|
||
"injectionSiteRecommendedAriaLabel": "{site}: recommended next site",
|
||
"injectionSiteLegendAriaLabel": "Marker legend",
|
||
"injectionSiteLegendRecommended": "Recommended next site",
|
||
"injectionSiteLegendLastUsed": "Last used 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",
|
||
"phaseConfig": "Reminder phases",
|
||
"phaseConfigDescription": "Configure timing for reminders.",
|
||
"phaseGreen": "Green",
|
||
"phaseYellow": "Yellow",
|
||
"phaseOrange": "Orange",
|
||
"phaseRed": "Red",
|
||
"phaseMinutes": "Min",
|
||
"phasePercent": "%",
|
||
"phaseResetDefaults": "Reset to defaults",
|
||
"phaseSaved": "Reminder phases saved",
|
||
"sourceWeb": "Web",
|
||
"sourceApi": "iOS App",
|
||
"sourceReminder": "Reminder",
|
||
"sourceImport": "Import",
|
||
"sourceAppleHealth": "Apple Health",
|
||
"intakeSourceVia": "via {origin}",
|
||
"intakeRecordedAutomatically": "Recorded automatically",
|
||
"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",
|
||
"intakeHistoryInjectionSite": "Injection site: {site}",
|
||
"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",
|
||
"glp1": {
|
||
"drug": {
|
||
"tirzepatide": {
|
||
"name": "Tirzepatide"
|
||
},
|
||
"semaglutide": {
|
||
"name": "Semaglutide"
|
||
},
|
||
"liraglutide": {
|
||
"name": "Liraglutide"
|
||
},
|
||
"dulaglutide": {
|
||
"name": "Dulaglutide"
|
||
},
|
||
"exenatide": {
|
||
"name": "Exenatide"
|
||
}
|
||
}
|
||
},
|
||
"researchMode": {
|
||
"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"
|
||
},
|
||
"cadence": {
|
||
"oneShotOn": "One-time dose on {date}.",
|
||
"oneShotPending": "One-time dose pending.",
|
||
"asNeeded": "As needed, no fixed plan."
|
||
},
|
||
"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",
|
||
"scheduledForHint": "Scheduled: {dateTime}",
|
||
"farFromScheduledWarning": "This is far from the scheduled time. Check the date.",
|
||
"skippedLabel": "Skipped",
|
||
"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."
|
||
},
|
||
"viewRecent90": "Last 90 days",
|
||
"viewAll": "Full history",
|
||
"viewToggleLabel": "History range"
|
||
},
|
||
"verlauf": {
|
||
"loading": "Loading history…",
|
||
"loadError": "Could not load the history.",
|
||
"empty": "No intakes in this period yet.",
|
||
"summaryEmpty": "No doses to score yet.",
|
||
"adherenceLabel": "Adherence",
|
||
"adherenceBarLabel": "{onTime} on time, {late} late, {missed} missed",
|
||
"add": "Entry",
|
||
"markTaken": "Taken",
|
||
"markSkipped": "Skipped",
|
||
"rowActionsLabel": "Actions for {time}",
|
||
"markAsTaken": "Mark as taken",
|
||
"markAsSkipped": "Mark as skipped",
|
||
"adHocTag": "off-schedule",
|
||
"takenDetail": "planned {planned}, taken {taken}",
|
||
"doseTaken": "Dose: {dose}",
|
||
"status": {
|
||
"taken_on_time": "on time",
|
||
"taken_late": "late",
|
||
"skipped": "skipped",
|
||
"missed": "missed",
|
||
"upcoming": "upcoming",
|
||
"ad_hoc": "off-schedule"
|
||
},
|
||
"addDialog": {
|
||
"title": "Add intake",
|
||
"description": "Record a dose, including a backdated or off-schedule one.",
|
||
"takenAtLabel": "Taken at",
|
||
"skippedLabel": "Skipped",
|
||
"nudgeHint": "Close to the {slot} slot. On save we ask whether to attribute it.",
|
||
"cancel": "Cancel",
|
||
"submit": "Save"
|
||
},
|
||
"nudge": {
|
||
"title": "Attribute to this slot?",
|
||
"body": "This intake falls just outside the {slot} window. Attribute it to that slot, or keep it as an off-schedule entry?",
|
||
"keepAdHoc": "Off-schedule",
|
||
"pin": "Attribute"
|
||
},
|
||
"pin": {
|
||
"action": "Attribute to slot {time}",
|
||
"release": "Release attribution",
|
||
"pinnedTag": "attributed",
|
||
"pinnedToast": "Intake attributed to slot",
|
||
"unpinnedToast": "Attribution released",
|
||
"dueContext": "was due: {time} ({delta})",
|
||
"confirmTitle": "Attribute to slot {time}?",
|
||
"confirmBody": "The intake counts for this slot just as it would if it had been logged there: on time or late depending on when it was taken, so the rate is never flattered. You can release the attribution at any time.",
|
||
"confirmCancel": "Cancel",
|
||
"confirmAction": "Attribute"
|
||
}
|
||
},
|
||
"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": "Managed by iPhone",
|
||
"clientManagedHint": "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",
|
||
"appliesToAllNote": "Applies to every schedule of this medication.",
|
||
"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}? Reminders stop, 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."
|
||
},
|
||
"advanced": {
|
||
"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"
|
||
},
|
||
"history": {
|
||
"plannedSuffix": "planned"
|
||
},
|
||
"tabs": {
|
||
"uebersicht": "Overview",
|
||
"zeitplan": "Schedule",
|
||
"bestand": "Supply",
|
||
"verlauf": "History",
|
||
"injektion": "Injection",
|
||
"erweitert": "Advanced",
|
||
"wirkung": "Effect"
|
||
},
|
||
"shell": {
|
||
"loadFailed": "This medication could not be loaded.",
|
||
"tablistLabel": "Medication detail sections"
|
||
},
|
||
"uebersicht": {
|
||
"statusTitle": "Status",
|
||
"nextDoseLabel": "Next dose",
|
||
"nextDoseNone": "No upcoming dose.",
|
||
"nextDoseAsNeeded": "As needed, no planned dose.",
|
||
"nextDoseNotTracked": "Not tracked, kept as a record.",
|
||
"pausedHint": "Paused: no reminders.",
|
||
"reminderLabel": "Reminder",
|
||
"reminderOn": "On",
|
||
"reminderOff": "Off",
|
||
"supplyLabel": "Supply",
|
||
"supplyRunway": "Lasts about {days} more days",
|
||
"jumpToZeitplan": "Open schedule",
|
||
"jumpToVerlauf": "Open history",
|
||
"jumpToBestand": "Open supply",
|
||
"complianceTitle": "Adherence",
|
||
"complianceEmpty": "No adherence data yet."
|
||
},
|
||
"bestand": {
|
||
"title": "Supply",
|
||
"summary": "{remaining} of {total} doses remaining",
|
||
"itemsTitle": "Packs & containers",
|
||
"doses": "{remaining} / {total} doses",
|
||
"unknown": "Unknown",
|
||
"state": {
|
||
"ACTIVE": "Unopened",
|
||
"IN_USE": "In use",
|
||
"EXPIRED": "Expired",
|
||
"USED_UP": "Used up"
|
||
},
|
||
"empty": "No supply recorded.",
|
||
"emptyHelper": "Register a pack or container to track remaining supply and runway.",
|
||
"emptyCta": "Register a pack",
|
||
"addButton": "Register",
|
||
"lowStockLinkOn": "Low-stock notification: below {days} days",
|
||
"lowStockLinkOff": "Low-stock notification: off",
|
||
"addTitle": "Register a pack or container",
|
||
"addDescription": "Record a new supply with its unit count; the expiry date is optional.",
|
||
"addQuantityLabel": "Quantity (units)",
|
||
"addQuantityHelper": "1–1000 units per pack or container.",
|
||
"addExpiryLabel": "Expiry date (optional)",
|
||
"addSubmit": "Register",
|
||
"addSuccess": "Supply registered",
|
||
"addFailed": "The supply could not be registered.",
|
||
"adjustButton": "Adjust",
|
||
"adjustTitle": "Correct container",
|
||
"adjustDescription": "Set the remaining units and correct the dates printed on or recorded for this container. 0 units marks it as used up.",
|
||
"adjustQuantityLabel": "Remaining units",
|
||
"adjustHelper": "Capacity: {total} units.",
|
||
"adjustSubmit": "Save",
|
||
"adjustSuccess": "Stock updated",
|
||
"adjustFailed": "The stock could not be updated.",
|
||
"deleteTitle": "Delete container?",
|
||
"deleteDescription": "Permanently removes this pack or container from the stock. Logged intakes stay unchanged.",
|
||
"deleteSuccess": "Stock entry deleted",
|
||
"deleteFailed": "The stock entry could not be deleted.",
|
||
"containerTypeLabel": "Container type",
|
||
"containerType": {
|
||
"PEN": "Pen",
|
||
"AMPOULE": "Ampoule",
|
||
"BLISTER": "Tablet pack",
|
||
"INHALER": "Inhaler",
|
||
"BOTTLE": "Bottle",
|
||
"OTHER": "Other"
|
||
},
|
||
"unitsDetail": "{remaining} / {total} units",
|
||
"quantityModeDoses": "Doses",
|
||
"quantityModeUnits": "Units",
|
||
"quantityInUnits": "= {units} units",
|
||
"quantityInDoses": "≈ {doses} doses",
|
||
"quantityUnderOneDose": "< 1 dose",
|
||
"expiredSuffix": "+ {units} units expired",
|
||
"packagingTitle": "Packaging & dose",
|
||
"packagingUnitsPerDose": "1 dose = {units} units",
|
||
"packagingDefaultPack": "Default pack size: {units} units",
|
||
"packagingNoDefaultPack": "No default pack size set",
|
||
"packagingEdit": "Edit",
|
||
"packagingDescription": "Set how many units one dose consumes and how large a new pack usually is, e.g. after a manufacturer switch with a different blister size.",
|
||
"packagingUnitsPerDoseLabel": "Units per dose",
|
||
"packagingUnitsPerDoseHelper": "E.g. two 2 mg tablets for a 4 mg dose, or 1.5 for one and a half (above 0, up to 100). Doses already recorded stay unchanged.",
|
||
"packagingDefaultPackLabel": "Default pack size (units)",
|
||
"packagingDefaultPackHelper": "Prefills the quantity when registering new packs (1–1000). Leave empty if none applies.",
|
||
"packagingSuccess": "Packaging details saved",
|
||
"packagingFailed": "Saving failed",
|
||
"addManufacturerLabel": "Manufacturer",
|
||
"addDoseStrengthLabel": "Strength",
|
||
"addDoseStrengthHint": "As printed on the container, e.g. 5 mg/0.5 ml.",
|
||
"openedOn": "Opened {date}",
|
||
"expiresOn": "Expires {date}",
|
||
"summaryAllExpired": "No usable supply: {units} units marked expired",
|
||
"editExpiryLabel": "Printed expiry date",
|
||
"editExpiryHelper": "The date printed on the carton. Leave empty if none is recorded.",
|
||
"editOpenedLabel": "Opened on",
|
||
"editOpenedHelper": "Leave empty if the container is still sealed.",
|
||
"editOpenedHelperClock": "A pen or ampoule expires 30 days after it is opened. Leave empty if it is still sealed."
|
||
},
|
||
"erweitert": {
|
||
"group": {
|
||
"lifecycle": "Lifecycle",
|
||
"externalApi": "External API",
|
||
"data": "Data",
|
||
"danger": "Danger zone"
|
||
},
|
||
"editor": {
|
||
"title": "Edit medication in the editor",
|
||
"helper": "Change name, treatment class, frequency and schedules in the step-by-step editor.",
|
||
"button": "Open editor"
|
||
}
|
||
},
|
||
"zeitplan": {
|
||
"title": "Schedule",
|
||
"timesTitle": "Dose times",
|
||
"timesNote": "Adjust each dose's time and on-time window. The frequency (daily, weekly…) is edited in the editor under Advanced.",
|
||
"scheduleLabel": "Schedule {index}",
|
||
"fullEditNote": "Frequency, treatment class and course window are edited in the editor under Advanced → Lifecycle.",
|
||
"graceEcho": "Reminder window: {minutes} minutes",
|
||
"reminderTitle": "Reminder",
|
||
"manageChannels": "Manage notification channels",
|
||
"history": {
|
||
"title": "Plan history",
|
||
"currentSince": "Current plan since {date}",
|
||
"noTimes": "No fixed times",
|
||
"manualChip": "Added manually",
|
||
"showErasOne": "Show 1 earlier era",
|
||
"showErasOther": "Show {count} earlier eras",
|
||
"hideEras": "Hide earlier eras",
|
||
"addEra": "Add earlier era",
|
||
"addEraTitle": "Add earlier era",
|
||
"addEraDescription": "Record the times this medication used to be taken at, for example before you adjusted it here.",
|
||
"editAria": "Edit era",
|
||
"editEraTitle": "Edit era",
|
||
"editEraDescription": "Adjust the dose times and the date range of this era.",
|
||
"archivedEditHint": "This era was recorded automatically. Your change corrects the recorded history; the original is kept internally as a record.",
|
||
"updatedToast": "Era updated",
|
||
"updateError": "Could not update the era. It must not overlap other eras and must end before the current plan.",
|
||
"timesLabel": "Dose times",
|
||
"fromLabel": "From",
|
||
"untilLabel": "Until",
|
||
"untilHint": "\"Until\" is the day the following plan took over (exclusive).",
|
||
"validationTimes": "Add at least one time.",
|
||
"validationRangeMissing": "Set both the from and until dates.",
|
||
"validationRangeOrder": "The from date must lie before the until date.",
|
||
"cancel": "Cancel",
|
||
"submit": "Save era",
|
||
"createdToast": "Earlier era saved",
|
||
"createError": "Could not save the era. It must not overlap existing eras and must end before the current plan.",
|
||
"deletedToast": "Era deleted",
|
||
"deleteError": "Could not delete the era",
|
||
"deleteAria": "Delete era",
|
||
"deleteConfirmTitle": "Delete era?",
|
||
"deleteConfirmBody": "History and adherence for this period will be computed against the current plan again.",
|
||
"deleteConfirmAction": "Delete",
|
||
"loadError": "Could not load the plan history"
|
||
},
|
||
"save": "Save schedule",
|
||
"saved": "Schedule saved",
|
||
"failed": "Could not save the schedule",
|
||
"window": {
|
||
"intro": "For each dose, set when an intake still counts as on time: a precise time (±1h) or your own window such as 07:00–09:00.",
|
||
"explicitToggle": "Custom window",
|
||
"startLabel": "Window start",
|
||
"endLabel": "Window end",
|
||
"onTimeBand": "On time: {start}–{end}",
|
||
"lateUntil": "late until {time}",
|
||
"lateDays": "late until {days} days after",
|
||
"orderError": "The start must be before the end.",
|
||
"noTimes": "No dose times set yet."
|
||
}
|
||
}
|
||
},
|
||
"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.",
|
||
"logInjectionSiteSaveFailed": "Could not save the injection site. Please try again.",
|
||
"perSlotUnits": "{units} per dose",
|
||
"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.",
|
||
"viewToggleLabel": "View",
|
||
"viewToggleHint": "Choose whether your medications appear as cards or as a table.",
|
||
"viewCards": "Card view",
|
||
"viewTable": "Table view",
|
||
"viewSaveFailed": "View could not be saved",
|
||
"tableCaption": "Medications as a table with status, next dose, adherence and stock",
|
||
"tableColName": "Name",
|
||
"tableColStatus": "Status",
|
||
"tableColNextDose": "Next dose",
|
||
"tableColCompliance": "Adherence",
|
||
"tableColStock": "Stock",
|
||
"tableColActions": "Actions",
|
||
"tableSortBy": "Sort by {column}",
|
||
"tableComplianceDays": "{days} d",
|
||
"tableStockDoseOne": "1 dose",
|
||
"tableStockDoses": "{count} doses",
|
||
"tableStockRunway": "≈ {days} days left",
|
||
"cardLowStockRunway": "Supply: ≈ {days} days",
|
||
"takeActionFor": "Take {name}",
|
||
"skipActionFor": "Skip {name}",
|
||
"reorderDescription": "Set the order of your medications for both the card and the table view.",
|
||
"reorderSaved": "Order saved",
|
||
"reorderSaveFailed": "Order could not be saved",
|
||
"customize": "Customize medications",
|
||
"efficacy": {
|
||
"title": "Effect",
|
||
"intro": "How the measurements this medication is meant to influence have moved around the time you started it. It shows what lines up in time (an association, not a cause) and never advice about your treatment or dose.",
|
||
"notEligible": "There is no outcome to relate this medication to.",
|
||
"startFallback": "No start date is set, so the comparison uses your first recorded reading as the reference point.",
|
||
"noStart": "Set a start date for this medication to compare the readings before and after it began.",
|
||
"disclaimer": "Association only: these figures show what changed over the same period, not that the medication caused the change. Discuss any decision about your treatment with your doctor.",
|
||
"primaryBadge": "Main target",
|
||
"noSeries": "No readings recorded for this target yet.",
|
||
"startMarker": "Start",
|
||
"adherenceLane": "Adherence",
|
||
"typicalRange": "Typical range",
|
||
"levelShift": "A shift in the level was detected around {date}.",
|
||
"plateau": {
|
||
"title": "Weight plateau on the current dose",
|
||
"evidence": "Weight moved by {delta} {unit} over the last {window} days ({readings} readings), {days} days on {dose}."
|
||
},
|
||
"retarget": {
|
||
"label": "Not the right measurement?",
|
||
"placeholder": "Track against…",
|
||
"apply": "Apply",
|
||
"reset": "Reset to default",
|
||
"error": "Could not save that change. Try again."
|
||
},
|
||
"beforeAfter": {
|
||
"summary": "Ø {before} before → Ø {after} since, a change of {delta}.",
|
||
"counts": "Based on {beforeCount} readings before and {afterCount} since.",
|
||
"needBefore": "Not enough readings before the start yet. About {weeks} weeks are needed before and after to compare.",
|
||
"needAfter": "Not enough readings since the start yet. About {weeks} weeks are needed before and after to compare.",
|
||
"needStart": "Set a start date to compare the readings before and after it began.",
|
||
"needData": "Not enough readings yet. About {weeks} weeks are needed before and after the start to compare."
|
||
},
|
||
"insights": {
|
||
"title": "Medication effect",
|
||
"subtitle": "What lines up with the measurements your medications target: association only, never a verdict.",
|
||
"link": "Open the effect view",
|
||
"empty": "Not enough data yet to relate your medications to their target measurements."
|
||
},
|
||
"scaleAbsolute": "Absolute",
|
||
"scalePercentSinceStart": "% since start",
|
||
"scaleToggleLabel": "Chart scale",
|
||
"segmented": {
|
||
"title": "Change at the start",
|
||
"level": "Right at the start, the level moved by {value} {unit} (95 % range {low} to {high}).",
|
||
"slope": "After the start, the weekly trend changed by {value} {unit} per week (95 % range {low} to {high}).",
|
||
"preSlope": "Before the start, the trend was {value} {unit} per week.",
|
||
"includesZero": "Where a range includes zero, these readings are also consistent with no change.",
|
||
"basis": "Based on {before} days before and {after} days after the start ({from} to {to}).",
|
||
"excludedAdherence": "{count} days after the start were left out because fewer than {floor} % of the doses in the {lookback} days before them were taken.",
|
||
"excludedNotTaking": "{count} days were left out because the medication was paused or between courses.",
|
||
"notTracked": "Intake is not tracked for this medication, so no days were left out for missed doses.",
|
||
"endDoseChange": "The window ends before the first dose change, so this describes the starting dose.",
|
||
"confoundersTitle": "Other medication changes in this window, which this view cannot separate from this one:",
|
||
"confounderStarted": "{name} started on {date}",
|
||
"confounderStopped": "{name} stopped on {date}",
|
||
"confounderDoseChange": "{name}: dose changed on {date}",
|
||
"confounderPaused": "{name} paused on {date}",
|
||
"confounderResumed": "{name} resumed on {date}",
|
||
"method": "How this is worked out: one line is fitted to the daily values before the start and one after it. The jump between them at the start is the level change, the difference in their slopes the trend change. The ranges allow for readings that carry over from one day to the next.",
|
||
"needStart": "Set a start date to see the change at the start.",
|
||
"needBefore": "The change at the start needs readings on at least {days} days spread over {span} days before the start.",
|
||
"needAfter": "The change at the start needs readings on at least {days} days spread over {span} days since the start, on days the doses were taken.",
|
||
"fitFailed": "These readings could not be fitted, so no change at the start is shown.",
|
||
"autocorrelation": "The daily values carry over strongly from one day to the next, so even these ranges may be too narrow."
|
||
}
|
||
},
|
||
"import": {
|
||
"resultSuccess": "{imported} intakes imported",
|
||
"resultPartial": "{imported} imported, {skipped} skipped.",
|
||
"resultNothing": "Nothing was imported: all {skipped} entries were skipped.",
|
||
"resultAlreadyRecorded": "{recorded} intakes are already recorded. Nothing new was added.",
|
||
"resultEmpty": "That file carried no intakes.",
|
||
"showSkipDetails": "Show skipped rows ({count})",
|
||
"skipDetailLine": "Line {line}: {reason}",
|
||
"skipDetailsOmitted": "{count} more skipped rows are not shown.",
|
||
"skipGroupOne": "{count} entry skipped: {reason}",
|
||
"skipGroupFew": "{count} entries skipped: {reason}",
|
||
"skipGroupOther": "{count} entries skipped: {reason}",
|
||
"reasonDuplicateInFile": "another entry in the same file has the same date and time",
|
||
"reasonAlreadyRecorded": "an intake is already recorded for that date and time",
|
||
"reasonUnknown": "reason not recorded",
|
||
"reasonMedicationNotFound": "no medication on record matches the name in the file",
|
||
"reasonMedicationAmbiguous": "the name in the file matches more than one medication on record",
|
||
"reasonMedicationIsMirrored": "the medication is a read-only copy of another app's list",
|
||
"reasonStatusUnknown": "the status in the file is not one the format defines",
|
||
"reasonMissingTimestamp": "the row states no time",
|
||
"reasonMissingOffset": "the time carries no UTC offset, so the instant is unknown",
|
||
"reasonUnreadableTimestamp": "the time is not in the format the export documents",
|
||
"reasonImplausibleTimestamp": "the time names no real instant, or lies in the future",
|
||
"reasonMissingMedication": "the row names no medication",
|
||
"reasonUnreadableDosage": "the dosage is not a number",
|
||
"reasonUnreadableRow": "the row has fewer columns than the header",
|
||
"reasonStatusNoDoseInformation": "the file records nothing about that dose; nobody answered and nothing was logged",
|
||
"reasonStatusReminderEvent": "the row is about a snoozed reminder, which says nothing about the dose",
|
||
"reasonStatusNotificationNotSent": "the row records that no notification was sent, which is about the app rather than the dose"
|
||
},
|
||
"unitsPerDoseField": {
|
||
"other": "Other…",
|
||
"inputLabel": "Units per dose, other value",
|
||
"placeholder": "e.g. 1.5 or 1 1/2",
|
||
"invalid": "Enter a number above 0 and up to 100, for example 1.5 or 1 1/2.",
|
||
"preview": "Counts as {value} per dose"
|
||
},
|
||
"category": {
|
||
"custom": {
|
||
"add": "New category",
|
||
"label": "Category name",
|
||
"labelPlaceholder": "e.g. Travel kit",
|
||
"create": "Add",
|
||
"limitReached": "You have reached the limit of 20 own categories.",
|
||
"saveFailed": "That did not save. Please try again.",
|
||
"bpGateNote": "Blood pressure insights only count medications in the built-in Blood pressure category.",
|
||
"manage": "Manage categories",
|
||
"manageDescription": "Your own categories, shown next to the built-in ones.",
|
||
"hidden": "Hidden",
|
||
"count": "{count} medications",
|
||
"rename": "Rename",
|
||
"hide": "Hide from the picker",
|
||
"show": "Show in the picker",
|
||
"delete": "Delete",
|
||
"deleteTitle": "Delete this category?",
|
||
"deleteBody": "{count} medications filed under it move to Other. The medications themselves stay.",
|
||
"movedToOther": "Category deleted. {count} medications moved to Other."
|
||
},
|
||
"filter": {
|
||
"label": "Category",
|
||
"all": "All categories"
|
||
}
|
||
},
|
||
"course": {
|
||
"endedOn": "Last course ended {date}",
|
||
"nth": "Course {n}",
|
||
"startNew": "Start a new course",
|
||
"editTitle": "Edit course",
|
||
"startsOn": "First day",
|
||
"endsOn": "Last day (optional)",
|
||
"note": "Note (optional)",
|
||
"notePlaceholder": "e.g. the flu in March",
|
||
"title": "Courses",
|
||
"helper": "When you took it. Doses are expected only inside a course.",
|
||
"none": "Taken continuously, no separate courses.",
|
||
"range": "{start} to {end}",
|
||
"since": "Since {start}",
|
||
"meta": "Course {n}, {status}, {taken} doses taken",
|
||
"status": {
|
||
"current": "running",
|
||
"upcoming": "upcoming",
|
||
"ended": "ended"
|
||
},
|
||
"delete": "Delete course",
|
||
"deleteTitle": "Delete this course?",
|
||
"deleteBody": "The dates go; the doses you logged stay in the history.",
|
||
"deleteLastConfirm": "This is the only course. Without it the medication counts as taken continuously since you added it. The logged doses stay.",
|
||
"error": {
|
||
"overlap": "This course shares days with another one.",
|
||
"currentOpen": "End the running course before adding one after it.",
|
||
"oneShot": "A one-time medication has a single course.",
|
||
"invalidRange": "The last day cannot be before the first.",
|
||
"generic": "That did not save. Please try again."
|
||
}
|
||
},
|
||
"composition": {
|
||
"title": "Composition",
|
||
"empty": "Add what one tablet or capsule contains to count every dose taken in your micronutrients.",
|
||
"perUnitNote": "Per tablet or capsule; every dose taken adds this to the day's micronutrients.",
|
||
"add": "Add",
|
||
"edit": "Edit",
|
||
"rowHelper": "What one tablet or capsule contains, for its micronutrients.",
|
||
"sheetTitle": "What one unit contains",
|
||
"sheetDescription": "Enter the amounts per tablet or capsule as the label states them.",
|
||
"nutrientLabel": "Nutrient",
|
||
"amountLabel": "Amount",
|
||
"unitLabel": "Unit",
|
||
"choose": "Choose a nutrient",
|
||
"addRow": "Add a nutrient",
|
||
"removeRow": "Remove {name}",
|
||
"editorEmpty": "No nutrient yet. Add one per line of the label.",
|
||
"labelPhoto": "Read from a label photo",
|
||
"labelReading": "Reading the label…",
|
||
"labelWaiting": "Still waiting for the background worker to pick this up.",
|
||
"labelReviewNote": "Check each line against the label before you save.",
|
||
"lowConfidence": "This line was hard to read; check it against the label.",
|
||
"unmatchedTitle": "Lines without a matching nutrient, to enter by hand if needed:",
|
||
"servingNote": "The label states: {note}. The amounts are shown per single unit.",
|
||
"labelError": "The label could not be read",
|
||
"saveError": "The composition could not be saved",
|
||
"catalogError": "The list of nutrients could not be loaded",
|
||
"invalidRow": "Choose a nutrient and enter an amount above zero in every line."
|
||
}
|
||
},
|
||
"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",
|
||
"bucketWeeklyDaily": "Daily avg per week",
|
||
"bucketMonthlyDaily": "Daily avg per month",
|
||
"days7Label": "7d",
|
||
"days7Title": "Last 7 days",
|
||
"days30Label": "30d",
|
||
"daysNLabel": "{days}d",
|
||
"days30Title": "Last 30 days",
|
||
"days90Label": "90d",
|
||
"days90Title": "Last 90 days",
|
||
"daysAllLabel": "All",
|
||
"daysAllTitle": "All time",
|
||
"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.",
|
||
"errorTitle": "Data could not be loaded",
|
||
"loadErrorTitle": "Chart could not be loaded",
|
||
"loadErrorReload": "Reload",
|
||
"sparseDataCaption": "More days will fill out the trend.",
|
||
"tooltipHourlyMean": "{metric} (average of the hours)",
|
||
"dataTable": {
|
||
"toggle": "Data points ({count})",
|
||
"columnDate": "Date",
|
||
"noValue": "No value",
|
||
"captionDay": "One row per day of {metric}, the same points the chart draws.",
|
||
"captionWeek": "One row per week of {metric}, the average of that week's days, the same points the chart draws.",
|
||
"captionMonth": "One row per month of {metric}, the average of that month's days, the same points the chart draws.",
|
||
"hourlyMeanNote": "{metric} is each day's average, with every hour counting once, so a workout does not outweigh the rest of the day."
|
||
},
|
||
"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",
|
||
"a11y": {
|
||
"summary": "{metric} chart. Range {min} to {max}, latest {latest}, trend {trend}.",
|
||
"noData": "{metric} chart. No data available.",
|
||
"trendUp": "rising",
|
||
"trendDown": "falling",
|
||
"trendFlat": "steady",
|
||
"scatterSummary": "Correlation chart, {count} points plotting {xLabel} against {yLabel}.",
|
||
"scatterNoData": "Correlation chart of {xLabel} against {yLabel}. No data available.",
|
||
"moodHeatmap": "Mood heatmap from {start} to {end}, {days} days logged.",
|
||
"moodHeatmapEmpty": "Mood heatmap, no days logged yet.",
|
||
"complianceHeatmap": "Medication compliance heatmap from {start} to {end}, {days} active days.",
|
||
"complianceHeatmapEmpty": "Medication compliance heatmap, no active days yet."
|
||
},
|
||
"medicationsEmptyAction": "Add a medication",
|
||
"rangeLabel": "Time 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": {
|
||
"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 adherence"
|
||
},
|
||
"insights": {
|
||
"pattern": {
|
||
"dismiss": "Dismiss",
|
||
"dismissed": "This pattern is dismissed until its evidence changes.",
|
||
"restore": "Show again",
|
||
"dismissError": "Could not dismiss this pattern.",
|
||
"restoreError": "Could not restore this pattern.",
|
||
"loadError": "Patterns could not be loaded.",
|
||
"empty": "No current pattern cleared the evidence threshold.",
|
||
"seasonalNote": "Since version 1.42, HealthLog removes season and long-term trend before it compares values. You see fewer relationships, but the ones that remain hold up better. Many of the earlier patterns were just the calendar.",
|
||
"seasonalNoteDismiss": "Dismiss note"
|
||
},
|
||
"correlation": {
|
||
"direction": {
|
||
"higher": "higher",
|
||
"lower": "lower"
|
||
},
|
||
"weekdayDirection": {
|
||
"above": "above",
|
||
"below": "below"
|
||
},
|
||
"channelFactor": "rated {factor}",
|
||
"channel": {
|
||
"WEIGHT": "weight",
|
||
"BLOOD_GLUCOSE": "blood glucose",
|
||
"BLOOD_PRESSURE_SYS": "systolic blood pressure",
|
||
"BLOOD_PRESSURE_DIA": "diastolic blood pressure",
|
||
"ACTIVITY_STEPS": "daily steps",
|
||
"SLEEP_DURATION": "sleep duration",
|
||
"HEART_RATE_VARIABILITY": "heart-rate variability",
|
||
"RESTING_HEART_RATE": "resting heart rate",
|
||
"TIME_IN_DAYLIGHT": "time in daylight",
|
||
"MOOD": "mood",
|
||
"PULSE": "resting pulse",
|
||
"MEDICATION_COMPLIANCE": "medication compliance",
|
||
"SYMPTOM_SEVERITY": "symptom severity",
|
||
"ENV_TEMP_MEAN": "daily temperature",
|
||
"ENV_TEMP_MIN": "overnight low temperature",
|
||
"ENV_SUNSHINE": "sunshine",
|
||
"ENV_DAYLIGHT": "daylight",
|
||
"ENV_PRECIP": "precipitation",
|
||
"ENV_PRESSURE_MEAN": "barometric pressure",
|
||
"ENV_PRESSURE_DELTA": "intraday pressure swing",
|
||
"ENV_PM25": "fine particles (PM2.5)",
|
||
"ENV_OZONE_8H": "ozone",
|
||
"ENV_POLLEN_MAX": "pollen",
|
||
"HRV_RMSSD": "heart-rate variability (RMSSD)",
|
||
"HYDRATION": "water intake",
|
||
"CAFFEINE": "caffeine intake",
|
||
"ALCOHOL": "alcohol use",
|
||
"WORKOUT_MINUTES": "workout minutes",
|
||
"TRAINING_LOAD": "training load",
|
||
"EXERCISE_MINUTES": "exercise minutes",
|
||
"STAND_MINUTES": "standing minutes",
|
||
"MINDFUL_MINUTES": "mindful minutes",
|
||
"STATE_OF_MIND_VALENCE": "logged state of mind",
|
||
"INDOOR_CO2": "indoor CO2",
|
||
"INDOOR_TEMPERATURE": "room temperature",
|
||
"INDOOR_HUMIDITY": "room humidity"
|
||
},
|
||
"daily": {
|
||
"high": "Higher {behaviour} tends to go with {direction} next-day {outcome} in your data. It is a pattern to watch, not a cause.",
|
||
"moderate": "Higher {behaviour} looks like it goes with {direction} next-day {outcome} in your data, on the evidence so far. It is a pattern to watch, not a cause.",
|
||
"faint": "Higher {behaviour} shows at most a faint hint of {direction} next-day {outcome} in your data. It is too small to lean on and never a cause."
|
||
},
|
||
"lab": {
|
||
"default": "Higher {lab} readings line up with {direction} {outcome} over the same periods in your data, an association worth watching with your clinician, never a cause.",
|
||
"faint": "Higher {lab} readings show at most a faint hint of {direction} {outcome} over the same periods in your data. It is too small to lean on and never a cause, but worth raising with your clinician."
|
||
},
|
||
"hypothesis": {
|
||
"bpCompliance": {
|
||
"support": "Higher medication compliance lines up with lower systolic readings, a pattern worth watching.",
|
||
"surprising": "Compliance and systolic move together in your data, which is surprising. Talk to your doctor before adjusting anything.",
|
||
"none": "Compliance and systolic do not move together strongly in this window."
|
||
},
|
||
"moodPulse": {
|
||
"support": "Lower-mood days line up with higher resting pulse, a pattern worth watching.",
|
||
"surprising": "Higher-mood days line up with higher resting pulse in your data, which is surprising.",
|
||
"none": "Mood and resting pulse do not move together strongly in this window."
|
||
},
|
||
"weightWeekday": "{weekday} weights run {delta} kg {direction} your other-day average, a pattern worth watching."
|
||
},
|
||
"dailySameDay": {
|
||
"high": "Higher {behaviour} on the day and the day before tends to go with {direction} {outcome} in your data. It is a pattern to watch, not a cause.",
|
||
"moderate": "Higher {behaviour} on the day and the day before looks like it goes with {direction} {outcome} in your data, on the evidence so far. It is a pattern to watch, not a cause.",
|
||
"faint": "Higher {behaviour} on the day and the day before shows a faint hint, if anything, of {direction} {outcome} in your data. It is too small to lean on and never a cause."
|
||
},
|
||
"channelNutrient": "{nutrient} intake",
|
||
"dailyOvernight": {
|
||
"high": "Higher {behaviour} overnight tends to go with {direction} {outcome} that night in your data. It is a pattern to watch, not a cause.",
|
||
"moderate": "Higher {behaviour} overnight looks like it goes with {direction} {outcome} that night in your data, on the evidence so far. It is a pattern to watch, not a cause.",
|
||
"faint": "Higher {behaviour} overnight shows at most a faint hint of {direction} {outcome} that night in your data. It is too small to lean on and never a cause."
|
||
}
|
||
},
|
||
"noAnalysisYet": "No assessment 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",
|
||
"editMode": {
|
||
"done": "Done",
|
||
"reset": "Reset",
|
||
"resetTitle": "Reset the overview?",
|
||
"resetBody": "Section order and the sections you hid go back to defaults. Your arrangement is not stored anywhere else.",
|
||
"resetConfirm": "Reset overview",
|
||
"title": "Customize overview",
|
||
"description": "Drag to reorder, tap the eye to show or hide.",
|
||
"dragHandle": "Drag to reorder",
|
||
"show": "Show",
|
||
"hide": "Hide",
|
||
"manageInSettings": "Manage chips & detail pages in Settings",
|
||
"groupSleep": "Sleep",
|
||
"groupMood": "Mood",
|
||
"groupEvents": "Events",
|
||
"gatedHint": "Appears once data or the feature is available",
|
||
"allHiddenHint": "Every section is hidden. Show at least one to see your overview.",
|
||
"saveSuccess": "Overview layout saved",
|
||
"saveError": "Could not save your overview layout",
|
||
"resetSuccess": "Overview reset to defaults",
|
||
"emptyTitle": "Every card is hidden",
|
||
"emptyDescription": "You've hidden every section. Open customize to bring cards back."
|
||
},
|
||
"bmiEmptyTitle": "Set your height to see BMI",
|
||
"bmiEmptyDescription": "BMI needs your height. Add it under Settings → Account.",
|
||
"bmiEmptyAction": "Open account settings",
|
||
"personalRecord": {
|
||
"badge": "PR",
|
||
"tooltip": "Personal record: {value} {unit} on {date}",
|
||
"benchmark": "Typical at that age: {low} to {high} {unit} ({source})"
|
||
},
|
||
"loadError": "Failed to load insights",
|
||
"heroPersonalBaseline": "Based on your last 90 days",
|
||
"heroRegenerating": "Regenerating",
|
||
"regenerateAnalysis": "Re-run assessment",
|
||
"regenerateSuccess": "Assessment refreshed",
|
||
"narrativeTitle": "In review",
|
||
"narrativeWeek": "This week",
|
||
"narrativeMonth": "This month",
|
||
"narrativeUpdating": "Updating…",
|
||
"heroFallbackSubtitle": "A daily read of your trends, drawn straight from the numbers you've logged.",
|
||
"heroGreetingMorning": "Good morning",
|
||
"heroGreetingAfternoon": "Good afternoon",
|
||
"heroGreetingEvening": "Good evening",
|
||
"heroActionAskCoach": "Ask the coach",
|
||
"healthScore": {
|
||
"label": "Health Score",
|
||
"band": {
|
||
"green": "In the reference range",
|
||
"yellow": "Some pillars need attention",
|
||
"red": "One or more pillars are outside the reference range"
|
||
},
|
||
"insufficient": "Nothing has enough recent data to score yet. One area of health is enough to start, and the score will say which areas it rests on.",
|
||
"basis": "Based on {count} of {recommended} areas of health.",
|
||
"compositionNotice": {
|
||
"item": "{pillar} ({reason})",
|
||
"left": "No longer counting toward the score: {pillars}.",
|
||
"joined": "Now counting toward the score: {pillars}."
|
||
},
|
||
"anatomyToggle": "How this score comes about",
|
||
"notScored": "Not scored yet ({count})",
|
||
"method": "The score is the equal-weighted average of the pillars that count toward it, on a 0 to 100 scale. Each pillar is graded against a published reference band, and the weakest pillar can set the overall band. A pillar without enough recent data is left out rather than counted as a zero. The reference bands come from published sources; which pillars count is yours to choose, so the combined number is not itself a clinical standard.",
|
||
"bandSetter": "Overall band set by {pillar}",
|
||
"versionAndNoise": "Method version {version}. Weekly comparison floor: {noise} points.",
|
||
"methodVersion": "Method version {version}.",
|
||
"configured": "You chose which pillars count toward this score.",
|
||
"none": "none",
|
||
"delta": "{delta} vs the previous comparable window",
|
||
"deltaReason": {
|
||
"algorithm_changed": "No comparison because the score method changed.",
|
||
"config_changed": "No comparison because you changed what counts toward your score.",
|
||
"composition_changed": "No comparison because the included pillars changed.",
|
||
"first_eligibility_window": "No comparison because this is the first eligible window.",
|
||
"below_noise_floor": "Change is within the combined measurement noise.",
|
||
"no_previous_window": "No comparable earlier window is available.",
|
||
"no_current_score": "No comparison because the current window is not eligible."
|
||
},
|
||
"restMode": "Rest Mode active since {since}. The score is shown for context and is not penalised.",
|
||
"pillar": {
|
||
"bloodPressure": "Blood pressure",
|
||
"glycaemia": "Glycaemia",
|
||
"activity": "Activity",
|
||
"sleep": "Sleep",
|
||
"adiposity": "Adiposity",
|
||
"wellbeing": "Wellbeing",
|
||
"lipids": "Lipids"
|
||
},
|
||
"observed": "Observed: {value}",
|
||
"reference": "Reference: {value}",
|
||
"fastingObserved": "Fasting glucose: {value} {unit}",
|
||
"fastingReference": "{low} to {high} {unit} fasting",
|
||
"personalReference": "Your target: {value}",
|
||
"bpBasisAbove": "{axis} sets this score: about {offset} mmHg over its ceiling of {boundary} mmHg.",
|
||
"bpBasisBelowFloor": "{axis} sets this score: about {offset} mmHg under the low-pressure floor of {boundary} mmHg.",
|
||
"bpBasisInBand": "Both values are at or below their reference ceilings.",
|
||
"bpScale": "At the ceiling the score is 85; 100 means roughly 12 mmHg below it.",
|
||
"bpRepresentative": "Based on a recency-weighted average of the last {days} days, so it may not match any single reading.",
|
||
"source": "Source: {source}, as of {date}",
|
||
"observedActivity": "{value} steps per day",
|
||
"observedSleep": "{value} minutes per night",
|
||
"observedAdiposity": "Waist-to-height ratio {value}",
|
||
"referenceActivity": "Benefit plateaus by {high} steps per day",
|
||
"referenceSleep": "At least {low} minutes per night; longer sleep is not penalised",
|
||
"referenceAdiposity": "Waist-to-height ratio below {high}",
|
||
"referenceHba1c": "HbA1c {low} to {high}%",
|
||
"referenceDetail": "{label}: {low} to {high} ({kind}, {source})",
|
||
"openBound": "open",
|
||
"laboratoryReferenceSource": "Reporting laboratory reference ranges",
|
||
"personalTargetSource": "Personal target",
|
||
"referenceKind": {
|
||
"clinical": "Clinical threshold",
|
||
"population": "Population percentile",
|
||
"guideline": "Guideline band"
|
||
},
|
||
"reason": {
|
||
"readFailed": "Data could not be loaded",
|
||
"notTracked": "Not tracked",
|
||
"missingProfile": "Age or reference profile is missing",
|
||
"missingHeight": "Height is missing",
|
||
"incompletePanel": "A recent complete panel with reference ranges is needed",
|
||
"crisis": "Safety guidance is shown instead of a score",
|
||
"insufficientHistory": "Not enough recent eligible data",
|
||
"unavailable": "This pillar is not currently eligible"
|
||
},
|
||
"tension": "Readiness signals differ. Supportive: {positive}. Under strain: {negative}.",
|
||
"returnToBand": "{metric} has been back inside your usual range for {days} days.",
|
||
"weightGoal": {
|
||
"title": "Personal weight goal",
|
||
"value": "{current} {unit} now. Goal {min} to {max} {unit}. Distance to goal: {distance} {unit}.",
|
||
"delta": "Distance to goal changed by {delta} {unit} since the prior reading.",
|
||
"noDelta": "No earlier weight reading is available for comparison.",
|
||
"no_personal_goal": "Set a personal weight goal to see progress here.",
|
||
"weight_not_tracked": "Log a weight reading to see progress toward your goal.",
|
||
"read_failed": "Weight data could not be loaded. Try again.",
|
||
"notScored": "Weight-goal progress is personal context and does not affect the Health Score."
|
||
},
|
||
"configureLink": "Choose what counts toward your score",
|
||
"coverage": {
|
||
"recommendedMet": "Covers the three areas the score recommends",
|
||
"areas": "{present} of {required} areas of health"
|
||
},
|
||
"historyLink": "History"
|
||
},
|
||
"dailyBriefing": {
|
||
"title": "Daily Briefing",
|
||
"keyFindingsTitle": "Key findings",
|
||
"signalsTitle": "Signals of the day",
|
||
"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",
|
||
"refreshFailedHint": "Couldn't refresh the briefing. Showing the last one.",
|
||
"retryAction": "Retry",
|
||
"failedTitle": "Couldn't generate the briefing",
|
||
"failedDescription": "The AI provider timed out or returned an error. Try again, or raise the response timeout in AI settings for a slow local model.",
|
||
"failedDescriptionTimeout": "The AI request ran out of time before the briefing was ready. For a slow local model, raise the AI response timeout in Settings, then try again.",
|
||
"failedDescriptionProvider": "The AI provider rejected the request. Re-check the provider and API key in AI settings, then try again.",
|
||
"failedDescriptionRateLimit": "The AI provider is rate-limiting requests right now. Try again in a little while.",
|
||
"omittedTitle": "Briefing withheld",
|
||
"omittedUngroundedDescription": "The generated briefing referenced a figure that couldn't be verified against your data, so it wasn't shown. Try again."
|
||
},
|
||
"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."
|
||
},
|
||
"viewDetail": "View {metric} details"
|
||
},
|
||
"vo2Max": {
|
||
"cardioLinkTitle": "Cardio fitness (VO₂ max)",
|
||
"cardioLinkBody": "VO₂ max is the headline measure of aerobic fitness. The full chart and assessment live on its own page.",
|
||
"cardioLinkCta": "Open cardio fitness"
|
||
},
|
||
"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"
|
||
},
|
||
"correlationRow": {
|
||
"title": "Relationships",
|
||
"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 adherence",
|
||
"bpComplianceSubtitle": "Daily systolic against adherence in %",
|
||
"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 in your time zone.",
|
||
"errorProvider": "The Coach could not reach an Insights provider just now. Please try again in a moment.",
|
||
"errorReasoningOnly": "The model only reasoned and never wrote an answer. Try again, or choose a different model in your AI settings.",
|
||
"errorDemo": "The Coach doesn't answer in the demo.",
|
||
"errorNoProvider": "The Coach reads your logged health data and answers questions about it (not medical advice). HealthLog needs an AI provider for that. Connect your own key or a local model.",
|
||
"errorNoProviderAction": "Connect an AI provider",
|
||
"errorNetwork": "No internet connection. Try again once you're back online.",
|
||
"prefsSaveError": "Couldn't save your Coach preferences. Please try again.",
|
||
"errorCredentialExpired": "Your AI provider connection has expired. Reconnect it in Settings to keep the Coach running.",
|
||
"tagline": "Personal health coach, grounded in your data.",
|
||
"newChat": "New chat",
|
||
"docScope": {
|
||
"badge": "Document",
|
||
"chattingAbout": "Chatting about: {title}",
|
||
"chattingAboutMore": "Chatting about: {titles} and {count} more",
|
||
"notIndexedHint": "Read this document with AI first in the vault so the Coach can answer about it."
|
||
},
|
||
"actionsMenu": "Actions",
|
||
"maximizeAriaLabel": "Open in full page",
|
||
"minimizeAriaLabel": "Back to the drawer",
|
||
"send": "Send",
|
||
"stop": "Stop",
|
||
"thinking": "Thinking…",
|
||
"unverifiedFiguresNotice": "Some figures couldn't be checked against your data and were left out.",
|
||
"composerPlaceholder": "Ask me anything…",
|
||
"nudgeBubbleLabel": "New message from the Coach. Open chat",
|
||
"fabLabel": "Open the Coach",
|
||
"readAloud": "Read aloud",
|
||
"readAloudStop": "Stop reading",
|
||
"messageTimeLabel": "Message sent {time}",
|
||
"copyMessage": "Copy",
|
||
"copyMessageError": "Could not copy",
|
||
"regenerate": "Try again",
|
||
"selfContextAdopt": {
|
||
"offer": "Add this answer to your self-context?",
|
||
"confirm": "Add",
|
||
"dismiss": "Dismiss",
|
||
"done": "Added to your self-context",
|
||
"duplicate": "Already part of your self-context",
|
||
"failed": "Could not add. Please try again."
|
||
},
|
||
"rememberMessage": {
|
||
"action": "Remember",
|
||
"failed": "Could not save. Please try again.",
|
||
"alreadyKept": "The Coach already remembers this."
|
||
},
|
||
"guided": {
|
||
"offerTitle": "The Coach has {count} follow-up questions for you",
|
||
"offerTitleOne": "The Coach has a follow-up question for you",
|
||
"offerBody": "Short answers sharpen your self-context, one question at a time, right here in the chat.",
|
||
"offerStart": "Answer now",
|
||
"offerLater": "Later",
|
||
"offerDismiss": "Don't ask again",
|
||
"dismissError": "Could not dismiss the questions. Please try again.",
|
||
"progress": "Question {current} of {total}",
|
||
"skip": "Skip",
|
||
"later": "Later",
|
||
"dismissRemaining": "Don't ask again",
|
||
"answerPlaceholder": "Type your answer…",
|
||
"summaryTitle": "All set, thanks for your answers!",
|
||
"summaryAnswered": "{answered} of {total} answered",
|
||
"summaryAdopted": "{adopted} added to your self-context",
|
||
"summaryAdoptedNone": "nothing new added to your self-context",
|
||
"summaryLink": "Review your self-context"
|
||
},
|
||
"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",
|
||
"historyDeleted": "Conversation deleted",
|
||
"historyDeleteFailed": "The conversation could not be deleted.",
|
||
"rename": {
|
||
"action": "Rename conversation",
|
||
"input": "Conversation title",
|
||
"save": "Save title",
|
||
"cancel": "Cancel rename",
|
||
"error": "Conversation title could not be saved."
|
||
},
|
||
"historySearchEmpty": "No conversations match your search.",
|
||
"historyLoadingMore": "Loading more…",
|
||
"sourcesTitle": "What I can see",
|
||
"sourcesFresh": "Fresh",
|
||
"sourcesStale": "Stale",
|
||
"sourcesFooter": "The Coach reads only the data you've connected.",
|
||
"metric": {
|
||
"bp": "Blood pressure",
|
||
"weight": "Weight",
|
||
"pulse": "Pulse",
|
||
"mood": "Mood",
|
||
"compliance": "Adherence",
|
||
"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"
|
||
},
|
||
"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",
|
||
"settingsVerbosityConciseHint": "The concise tone already keeps replies short, so verbosity is pinned to Brief while it is active.",
|
||
"settingsSourcesSummary": "The Coach sees {count} of {total} data areas and looks back {window}.",
|
||
"settingsSourcesSummaryAll": "The Coach sees {count} of {total} data areas and your whole history.",
|
||
"settingsSourcesPointerLink": "Open Coach settings",
|
||
"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",
|
||
"dailyLimitTitle": "Daily limit reached",
|
||
"dailyLimitBody": "Daily limit reached. The budget refreshes at midnight in your time zone.",
|
||
"providerRateLimitTitle": "Provider rate-limited",
|
||
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min.",
|
||
"cluster": {
|
||
"cardio": {
|
||
"label": "Cardiovascular",
|
||
"hint": "BP, pulse, HRV, resting and walking HR"
|
||
},
|
||
"body": {
|
||
"label": "Body composition",
|
||
"hint": "Weight, body fat, muscle and BMI"
|
||
},
|
||
"activity": {
|
||
"label": "Activity",
|
||
"hint": "Steps, energy, distance and VO₂ max"
|
||
},
|
||
"workouts": {
|
||
"label": "Workouts",
|
||
"hint": "Runs, rides and sessions"
|
||
},
|
||
"sleep": {
|
||
"label": "Sleep",
|
||
"hint": "Duration and stages"
|
||
},
|
||
"mood": {
|
||
"label": "Mood",
|
||
"hint": "Daily mood entries"
|
||
},
|
||
"glucose": {
|
||
"label": "Glucose",
|
||
"hint": "Fasting and postprandial readings"
|
||
},
|
||
"medication": {
|
||
"label": "Medication",
|
||
"hint": "Adherence and GLP-1 context"
|
||
},
|
||
"mobility": {
|
||
"label": "Mobility & gait",
|
||
"hint": "Steadiness, asymmetry and gait"
|
||
},
|
||
"environment": {
|
||
"label": "Environment",
|
||
"hint": "Noise, daylight and skin temperature"
|
||
}
|
||
},
|
||
"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",
|
||
"sourcesMemberCountOne": "1 metric",
|
||
"sourcesMemberCountFew": "{count} metrics",
|
||
"sourcesMemberCountOther": "{count} metrics",
|
||
"lookback": {
|
||
"label": "How far back the Coach can look",
|
||
"option": {
|
||
"last7days": "{days} days",
|
||
"last30days": "{days} days",
|
||
"last90days": "{days} days",
|
||
"lastYear": "{months} months",
|
||
"allTime": "{months} months in detail, longer for labs"
|
||
},
|
||
"detailDays": "The Coach reads nothing older than {days} days, in any answer.",
|
||
"detailMonths": "The Coach reads nothing older than {months} months, in any answer.",
|
||
"detailAll": "Without a limit, the Coach reads {dailyMonths} months of readings in daily detail and older readings as monthly values up to {years} years back. For lab results it reads the latest value of the most recently measured markers and, for a marker you ask about, its {labRecent} previous results, with older ones summarised per year up to {labYears} years back; earlier years are only counted.",
|
||
"note": "Your profile, current medications, an ongoing illness and upcoming visits stay visible; summaries that need more history are shortened or left out. Answers the Coach gave earlier in older conversations may still quote older values."
|
||
},
|
||
"showConversations": "Show conversations",
|
||
"hideConversations": "Hide conversations",
|
||
"heroGreeting": "Ask me anything about your data",
|
||
"heroSubline": "Ask about your trends, medications, or readings.",
|
||
"thinkingDuration": "Thought for {seconds}s",
|
||
"thinkingExpandAria": "Show what the Coach considered",
|
||
"thinkingDetail": "Answered from your health snapshot.",
|
||
"tokensUsed": "{count} tokens",
|
||
"askAboutThis": "Ask the coach about this",
|
||
"readStrip": {
|
||
"label": "Usual range",
|
||
"baselineWithin": "Your usual range is {low}–{high} {unit}; today's {value} sits within it.",
|
||
"baselineAbove": "Your usual range is {low}–{high} {unit}; today's {value} sits above it.",
|
||
"baselineBelow": "Your usual range is {low}–{high} {unit}; today's {value} sits below it.",
|
||
"sameHoursWithin": "By this time of day you usually sit at {low}–{high} {unit}; today so far, {value} is within that.",
|
||
"sameHoursAbove": "By this time of day you usually sit at {low}–{high} {unit}; today so far, {value} is above that.",
|
||
"sameHoursBelow": "By this time of day you usually sit at {low}–{high} {unit}; today so far, {value} is below that.",
|
||
"steadyWithin": "Your readings usually sit at {low} {unit}; today's {value} matches.",
|
||
"steadyAbove": "Your readings usually sit at {low} {unit}; today's {value} is above that.",
|
||
"steadyBelow": "Your readings usually sit at {low} {unit}; today's {value} is below that.",
|
||
"latestWithin": "Your usual range is {low}–{high} {unit}; your latest reading, {date}, was {value}, within it.",
|
||
"latestAbove": "Your usual range is {low}–{high} {unit}; your latest reading, {date}, was {value}, above it.",
|
||
"latestBelow": "Your usual range is {low}–{high} {unit}; your latest reading, {date}, was {value}, below it.",
|
||
"steadyLatestWithin": "Your readings usually sit at {low} {unit}; your latest reading, {date}, was {value} and matches.",
|
||
"steadyLatestAbove": "Your readings usually sit at {low} {unit}; your latest reading, {date}, was {value}, above that.",
|
||
"steadyLatestBelow": "Your readings usually sit at {low} {unit}; your latest reading, {date}, was {value}, below that.",
|
||
"insufficient": "Still learning your usual range. Keep logging for a few more days.",
|
||
"driver": "{note}",
|
||
"loadError": "Could not load your usual range."
|
||
},
|
||
"scope": {
|
||
"prefix": "The Coach is already on {metric}"
|
||
},
|
||
"settings": "Settings",
|
||
"history": {
|
||
"groupToday": "Today",
|
||
"groupYesterday": "Yesterday",
|
||
"groupThisWeek": "This week",
|
||
"groupEarlier": "Earlier"
|
||
},
|
||
"seed": {
|
||
"bloodPressure": "Walk me through my blood pressure trend over the last 30 days. Anything I should keep an eye on?",
|
||
"weight": "How has my weight been trending lately, and is the direction something to act on?",
|
||
"bmi": "What does my BMI trend tell me, and how should I read it?",
|
||
"pulse": "Walk me through my pulse readings. Is anything out of the ordinary?",
|
||
"restingHr": "How has my resting heart rate been trending, and what does it say about my fitness?",
|
||
"hrv": "What is my heart-rate variability telling me about recovery and stress lately?",
|
||
"sleep": "Walk me through my recent sleep: duration, consistency, and anything worth changing.",
|
||
"mood": "What patterns do you see in my mood over the last few weeks?",
|
||
"medications": "How is my medication adherence looking, and is it lined up with how I've been feeling?",
|
||
"steps": "How active have I been lately based on my steps, and how does it compare to a healthy baseline?",
|
||
"activeEnergy": "What does my active-energy trend say about my activity level lately?",
|
||
"cardioFitness": "What does my cardio fitness (VO₂ max) trend mean, and how do I move it in the right direction?",
|
||
"bloodGlucose": "Walk me through my recent glucose readings. Are they in a healthy range?",
|
||
"oxygenSaturation": "What does my blood-oxygen (SpO₂) trend tell me?",
|
||
"respiratoryRate": "What does my respiratory-rate trend say about my health?",
|
||
"workouts": "Walk me through my recent workouts: load, frequency, and how I'm recovering between them.",
|
||
"recoveryPage": "Why is my recovery where it is right now, and what's driving it?",
|
||
"briefing": "Walk me through today's briefing. What should I focus on, and is anything worth acting on?",
|
||
"healthScore": "Why is my health score {score} out of 100, and what would move it the most?",
|
||
"periodWeek": "Walk me through how my last week went across my health metrics. What stands out?",
|
||
"periodMonth": "Walk me through how my last month went across my health metrics. What stands out?",
|
||
"correlationBpCompliance": "How does my medication adherence relate to my blood pressure? Walk me through what this correlation means for me.",
|
||
"correlationMoodPulse": "Is there a real link between my mood and my pulse? Help me read this correlation.",
|
||
"correlationWeightWeekday": "Does my weight follow a weekly pattern? What does this day-of-week correlation tell me?",
|
||
"recommendation": "Tell me more about this recommendation: \"{text}\" Why does it apply to me, and what should I do about it?"
|
||
},
|
||
"assessmentPrompt": "Walk me through my {metric} assessment. What does it mean and what should I do about it?",
|
||
"attach": {
|
||
"menuChooseFromDocuments": "Choose from documents",
|
||
"menuUploadNew": "Upload new document",
|
||
"trigger": "Attach documents",
|
||
"pickerTitle": "Attach documents",
|
||
"pickerDescription": "The coach reads only the documents you attach, not your health data.",
|
||
"pickerSearchPlaceholder": "Search documents…",
|
||
"pickerEmpty": "No documents in your vault yet.",
|
||
"pickerNotIndexed": "Not yet indexed",
|
||
"pickerCap": "You can attach up to {max} more.",
|
||
"pickerConfirm": "Attach ({count})",
|
||
"pillRemove": "Remove {title}",
|
||
"indexing": "Indexing…",
|
||
"indexingHint": "A document is still being indexed. You can send once it's ready.",
|
||
"fencedHint": "This conversation runs without access to your health data. The coach only reads the attached documents.",
|
||
"documentsAttachedOne": "1 document attached",
|
||
"documentsAttachedOther": "{count} documents attached",
|
||
"railBadge": "Fenced document chat",
|
||
"uploadError": "Upload failed. Please try again.",
|
||
"notFoundError": "That document link is no longer valid. Starting a normal chat instead."
|
||
},
|
||
"interrupted": {
|
||
"note": "This answer was interrupted before it finished.",
|
||
"retry": "Ask again"
|
||
},
|
||
"historyReadOnlyNote": "The Coach is not available right now, but you can still read and delete your conversations.",
|
||
"transcriptYou": "You",
|
||
"transcriptCoach": "Coach",
|
||
"errorConsent": "The Coach needs your AI consent before it can answer. You can give it in Settings, AI.",
|
||
"errorNotPermitted": "The Coach is not available inside a record someone shared with you.",
|
||
"errorUnavailable": "The Coach could not check its settings just now. Please try again in a moment.",
|
||
"errorOperatorOff": "AI is switched off on this server, so the Coach cannot answer.",
|
||
"errorCoachOff": "The Coach is switched off. You can turn it back on in Settings, Modules.",
|
||
"frame": {
|
||
"showPanel": "Show conversations",
|
||
"hidePanel": "Hide conversations",
|
||
"panelDescription": "Your conversations with the Coach, newest first.",
|
||
"rowActions": "Actions for {title}",
|
||
"rename": "Rename",
|
||
"delete": "Delete",
|
||
"modelSection": "Model",
|
||
"provider": "Answers with",
|
||
"modelManaged": "The model for this provider is set in AI settings.",
|
||
"noProvider": "No provider available",
|
||
"allSettings": "All AI settings",
|
||
"operatorCodex": "ChatGPT (shared by the operator)",
|
||
"changeModel": "Change in Settings > AI",
|
||
"saving": "Saving…",
|
||
"saveFailed": "That change could not be saved.",
|
||
"providerNotActive": "{provider} could not take over: it has no working sign-in or key. Set it up in AI settings.",
|
||
"operatorManaged": "Your server's operator manages this connection. Once one of your own providers is set up, it answers first."
|
||
},
|
||
"answer": {
|
||
"scrollToBottom": "Jump to the latest message",
|
||
"rememberDone": "Remembered",
|
||
"timeYesterday": "yesterday {time}",
|
||
"timeEarlier": "{date}, {time}",
|
||
"info": "Answer details",
|
||
"infoModel": "Model: {model}"
|
||
},
|
||
"activity": {
|
||
"thinking": "Thinking…",
|
||
"fetching": "Fetching {domain}, {window}…",
|
||
"digestOne": "Summarising {count} reading…",
|
||
"digestFew": "Summarising {count} readings…",
|
||
"digestOther": "Summarising {count} readings…",
|
||
"digestDoneOne": "{count} reading from {areas}",
|
||
"digestDoneFew": "{count} readings from {areas}",
|
||
"digestDoneOther": "{count} readings from {areas}",
|
||
"areasOne": "{count} area",
|
||
"areasFew": "{count} areas",
|
||
"areasOther": "{count} areas",
|
||
"memoryOne": "Recalls {count} thing you told it",
|
||
"memoryFew": "Recalls {count} things you told it",
|
||
"memoryOther": "Recalls {count} things you told it",
|
||
"remember": "Remembering something…",
|
||
"plan": "Drafting a plan…",
|
||
"asking": "Asking you…",
|
||
"answer": "Writing the answer…",
|
||
"stop": {
|
||
"budget": "Budget reached, answering with what it has",
|
||
"time": "Time limit reached, answering with what it has",
|
||
"cap": "Many steps, wrapping up",
|
||
"noProgress": "No new data, wrapping up"
|
||
},
|
||
"thoughtProcessOne": "Thought process ({count} step)",
|
||
"thoughtProcessFew": "Thought process ({count} steps)",
|
||
"thoughtProcessOther": "Thought process ({count} steps)",
|
||
"awaitingAnswer": "Answer needed"
|
||
},
|
||
"memory": {
|
||
"saved": "Remembered: {fact}",
|
||
"undo": "Undo",
|
||
"accept": "Yes, remember it",
|
||
"decline": "No",
|
||
"confirmed": "Got it, I'll remember.",
|
||
"declined": "Okay, I won't."
|
||
},
|
||
"plan": {
|
||
"accept": "Take on this plan",
|
||
"decline": "Not now",
|
||
"confirmed": "Noted. I'll check in with you in {days} days.",
|
||
"declined": "Okay, not now."
|
||
},
|
||
"assumption": {
|
||
"line": "Assumed: {value}",
|
||
"change": "Change"
|
||
},
|
||
"suggestedReplies": {
|
||
"groupLabel": "Suggested replies"
|
||
},
|
||
"chart": {
|
||
"compare": {
|
||
"periods": "{a} vs {b}"
|
||
}
|
||
},
|
||
"reasoning": {
|
||
"label": "Thinking depth",
|
||
"hint": "Deeper thinking means more precise answers and a little more waiting.",
|
||
"off": "Off",
|
||
"minimal": "Minimal",
|
||
"low": "Low",
|
||
"medium": "Medium",
|
||
"high": "High",
|
||
"capped": "(limited by the admin)",
|
||
"disabled": "The admin has turned deeper thinking off."
|
||
},
|
||
"memoryLink": "Memory ({count})",
|
||
"newConversation": "New conversation"
|
||
},
|
||
"relativeJustNow": "just now",
|
||
"relativeMinutesAgoOne": "{count} minute ago",
|
||
"relativeMinutesAgoOther": "{count} minutes ago",
|
||
"relativeMinutesAgoFew": "{count} minutes ago",
|
||
"relativeHoursAgoOne": "{count} hour ago",
|
||
"relativeHoursAgoOther": "{count} hours ago",
|
||
"relativeHoursAgoFew": "{count} hours ago",
|
||
"relativeDaysAgoOne": "{count} day ago",
|
||
"relativeDaysAgoOther": "{count} days ago",
|
||
"relativeDaysAgoFew": "{count} days ago",
|
||
"navOverview": "Overview",
|
||
"navCatalog": "All metrics",
|
||
"navBloodPressure": "Blood pressure",
|
||
"navWeight": "Weight",
|
||
"navPulse": "Pulse",
|
||
"navMood": "Mood",
|
||
"navMedication": "Medication",
|
||
"navNutrients": "Nutrients",
|
||
"navBmi": "BMI",
|
||
"navSleep": "Sleep",
|
||
"navHrv": "HRV",
|
||
"navRestingHr": "Resting HR",
|
||
"navOxygenSaturation": "Oxygen",
|
||
"navBodyTemperature": "Temperature",
|
||
"navSteps": "Steps",
|
||
"navActiveEnergy": "Active energy",
|
||
"navAriaLabel": "Skip to section",
|
||
"pillScrollLeft": "Scroll tabs left",
|
||
"pillScrollRight": "Scroll tabs right",
|
||
"tabStrip": {
|
||
"vitalsParent": {
|
||
"label": "Vitals",
|
||
"header": "Vital signs"
|
||
},
|
||
"bodyParent": {
|
||
"label": "Body",
|
||
"header": "Body composition"
|
||
},
|
||
"activityParent": {
|
||
"label": "Activity",
|
||
"header": "Activity & mobility"
|
||
},
|
||
"heartParent": {
|
||
"label": "Heart",
|
||
"header": "Heart health"
|
||
},
|
||
"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."
|
||
},
|
||
"coachPrefill": "I haven't logged any resting heart rate yet. Why is the daily resting value different from a spot pulse, and how do I improve it?"
|
||
},
|
||
"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 in 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"
|
||
}
|
||
},
|
||
"steps": {
|
||
"title": "Steps",
|
||
"description": "Daily step count, one row per day, sourced from Apple Health or a connected activity device.",
|
||
"chartTitle": "Steps per day",
|
||
"emptyState": {
|
||
"title": "No step data yet",
|
||
"description": "Daily step totals appear here once Apple Health or an activity device syncs a day's worth of movement."
|
||
}
|
||
},
|
||
"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": {
|
||
"loadError": "Could not load this metric right now.",
|
||
"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": "Resting pulse against an age- and sex-based reference band from CDC/NCHS population percentiles, plus a written assessment.",
|
||
"stimmungDescription": "Daily mood scores over time with a written assessment.",
|
||
"medikamenteDescription": "Per-medication adherence calendars and a written assessment.",
|
||
"bmiDescription": "BMI derived from your weight and height, with a written assessment.",
|
||
"target": {
|
||
"adjustLink": "Adjust target range"
|
||
},
|
||
"explainer": {
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"restingHrBody": "Resting heart rate is your heart rate when you are completely at rest, usually measured overnight, distinct from your pulse during activity. A lower resting rate generally points to better cardiovascular fitness, and a rising trend can be an early sign of stress or illness. As general guidance, a normal adult resting rate is 60–100 beats per minute (AHA 2024); a trained heart can sit benignly at 40–60.",
|
||
"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.",
|
||
"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.",
|
||
"bodyTemperatureBody": "Body temperature reflects your core thermal state. As general guidance, the population mean is about 36.6 °C (not 37.0 °C), with a normal oral range of roughly 35.7–37.4 °C and a fever from 38.0 °C (J Gen Intern Med 2019). It swings about 0.5 °C across the day, and sites differ by up to ~1 °C, so tag where you measured. Overnight wrist readings track relative change, not a clinical fever value.",
|
||
"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.",
|
||
"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.",
|
||
"respiratoryRateBody": "Respiratory rate is the number of breaths you take per minute. As general guidance, at rest most adults breathe 12–20 times a minute (American Lung Association); it is meaningful only truly at rest or asleep. A sustained rise of about +3 above your own nightly baseline can be an early illness signal; clinical escalation cutoffs are hospital tools, not self-alarms.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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 (WHO 2024).",
|
||
"bodyFatBody": "Body fat percentage is the share of your weight that is fat. Healthy ranges depend on sex and age, and home scales estimate it from bioimpedance, so the trend over several weeks says more than a single reading.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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. As general guidance, European clinical reference flags carotid-femoral velocity above 10 m/s (ESC/ESH 2018), but a consumer estimate is a proxy, not interchangeable with that clinical measurement.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"daylightBody": "Time in daylight is how long you spend in outdoor light each day. Regular daylight supports a healthy sleep-wake rhythm and mood (CDC 2024), and time outdoors is linked to eye health.",
|
||
"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. As general guidance for adults without diabetes, a fasting reading under {prediabetesFrom} {unit} is normal, {prediabetesFrom}–{prediabetesTo} is prediabetes, and {diabetesFrom} or above falls in the diabetes range (ADA 2024). A single high reading does not diagnose; a clinician confirms with a repeat test, and people managing diabetes use different, clinician-set targets.",
|
||
"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.",
|
||
"cardioFitnessBody": "VO₂ max is how much oxygen your body can use at peak effort, the best lab index of aerobic fitness, which wearables estimate indirectly. A higher or rising trend is a strong sign of cardiovascular health.",
|
||
"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.",
|
||
"wristTemperatureBody": "Wrist temperature is measured while you sleep and reported as the difference from your personal baseline, not an absolute value. A steady reading is normal, while a sustained rise can hint at illness, intense training, or a menstrual-cycle change.",
|
||
"fallsBody": "This counts the hard falls your wearable detects. Zero is the goal; a rising count is a mobility-risk signal worth raising with a clinician, especially for older adults (CDC STEADI 2024).",
|
||
"sixMinuteWalkBody": "This is an estimate of how far you could walk in six minutes, a long-standing clinical test of mobility and cardiopulmonary endurance. The wearable figure is a proxy, not the supervised clinical test; a steady or rising trend is the useful read.",
|
||
"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.",
|
||
"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.",
|
||
"breathingDisturbancesBody": "A wearable can estimate how often your breathing was interrupted during sleep. A lower index is better; a level flagged as elevated, especially across many nights, is worth raising with a clinician. It is a screening proxy, not a sleep-apnea diagnosis.",
|
||
"stepsBody": "Step count is the total number of steps you take each day, the simplest measure of everyday movement. A steady habit matters more than any single big day, and the round 10,000 target is a marketing slogan, not research.",
|
||
"readinessBody": "Readiness is a single daily read on how prepared your body is to take on the day, blending resting heart rate, heart-rate variability, and sleep. It is a device proxy benchmarked against your own baseline, not a clinical measure. A higher score means recovered, a lower one is a gentle cue to ease off.",
|
||
"sleepScoreBody": "Your sleep score distils a whole night into one number: duration, efficiency, regularity, and the balance of light, deep, and REM. Watch the pattern across weeks rather than chasing a perfect score on any single night.",
|
||
"recoveryBody": "Recovery reflects how well your body has bounced back, drawing on overnight signals like heart-rate variability and resting heart rate. It is a device-derived proxy read against your own baseline, not a clinical measure, and is not comparable across devices. A strong score is a green light to push; a softer one suggests your system is still rebuilding.",
|
||
"strainBody": "Strain captures how much cardiovascular and physical load you have put on your body, from workouts to an active day on your feet. It is a device-derived index judged against your own typical effort, not a clinical measure, and the headline number is not comparable across devices.",
|
||
"stressBody": "Stress here is a device heuristic derived from heart-rate-variability patterns, not a cortisol measurement or how you consciously feel, and not a clinical stress score. Read it against your own baseline; it is not comparable across devices. A lower score points to a calm, well-regulated state; a higher one is an invitation to build in recovery.",
|
||
"recoveryPageBody": "Recovery brings together the overnight signals your wearable records (recharge, strain, load and your day's heart-rate and energy totals) to show how well your body has bounced back. Read the pattern across days rather than any single number; a softer reading is an invitation to ease off, not an alarm.",
|
||
"pulsePressureBody": "Pulse pressure is the gap between your systolic and diastolic readings (systolic minus diastolic). As general guidance, about 40 mmHg is typical at rest; a wide gap above roughly 60 mmHg in middle age can reflect stiffening arteries, while a narrow gap under about 25 mmHg can accompany low stroke volume (StatPearls/NIH 2023). It is a discussion prompt, not a diagnosis.",
|
||
"meanArterialPressureBody": "Mean arterial pressure is the average pressure your organs see across a heartbeat, roughly the diastolic plus a third of the gap to systolic. As general guidance, a resting value sits around 70–100 mmHg (StatPearls/NIH 2023). The often-cited ~60 mmHg floor is an acute-care concept, not a consumer self-alarm.",
|
||
"cycleEducationBody": "Your cycle runs through four phases driven by shifting hormones, and its length and regularity are an accessible window on overall health. As general guidance, adult cycles typically run 21–35 days (clinical references cite 24–38), with bleeding around five days (ACOG 2015). The luteal phase is the steady anchor, so ovulation is best estimated by counting back from your next expected period, never a fixed 'day 14'. A predicted fertile window is an estimate that needs several recorded cycles and stays approximate, and basal body temperature confirms ovulation after the fact rather than predicting it. This is not a contraceptive method.",
|
||
"sleepHygieneBody": "A few evidence-based habits support sleep: keep consistent bed and wake times including weekends, get bright morning daylight and dim your evenings, keep the room cool, dark and quiet, and avoid afternoon caffeine, late alcohol and large late meals (CDC 2024). Regularity predicts health at least as strongly as duration, and a wearable's total sleep time is far more trustworthy than its deep, light and REM split."
|
||
},
|
||
"bpDerived": {
|
||
"pulsePressure": "Pulse pressure (the gap between your readings) is about {value} mmHg; roughly 40 is typical at rest.",
|
||
"meanArterialPressure": "Mean arterial pressure (the average your organs see) is about {value} mmHg, normally around 70–100.",
|
||
"caveat": "These are derived from your latest reading as general guidance, not a diagnosis."
|
||
},
|
||
"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",
|
||
"ecgDescription": "Single-lead ECG recordings from your device, each with the device's own result."
|
||
},
|
||
"units": {
|
||
"steps": "steps",
|
||
"flights": "flights",
|
||
"falls": "falls",
|
||
"years": "years",
|
||
"breathingEvents": "events",
|
||
"standHours": "hours",
|
||
"respiratoryRate": "breaths/min"
|
||
},
|
||
"sleep": {
|
||
"title": "Sleep",
|
||
"description": "Stage breakdown and nightly duration, drawn from Apple Health.",
|
||
"mainSleep": "Main sleep",
|
||
"totalSleep": "Total sleep",
|
||
"compositionTitle": "Stage composition",
|
||
"compositionSubtitle": "Last {nights} nights",
|
||
"compositionAriaLabel": "Sleep stage composition over {nights} nights",
|
||
"sourceDiscrepancy": {
|
||
"tooltipTitle": "Sources disagree"
|
||
},
|
||
"stages": {
|
||
"deep": "Deep",
|
||
"rem": "REM",
|
||
"core": "Core",
|
||
"asleep": "Asleep",
|
||
"awake": "Awake",
|
||
"inBed": "In bed",
|
||
"nap": "Nap",
|
||
"napCount": "{count} naps",
|
||
"unavailable": "No stage data yet. Sleep stages appear here as soon as a connected source delivers them."
|
||
},
|
||
"empty": {
|
||
"title": "No sleep data yet",
|
||
"description": "Connect a source like Apple Health or a wearable, or log sleep manually, and this view fills in automatically.",
|
||
"action": "Manage devices"
|
||
},
|
||
"debt": {
|
||
"title": "Sleep debt",
|
||
"value": "{hours}h {minutes}m short",
|
||
"caption": "Outstanding balance over the last {nights} nights",
|
||
"clearValue": "All caught up",
|
||
"clearCaption": "Nothing outstanding over the last {nights} nights",
|
||
"learning": "Still learning your sleep: {counted} nights so far, {remaining} more to read a reliable balance.",
|
||
"computedInfo": "This is HealthLog's own estimate: a rolling balance of need minus sleep over recent nights, with catch-up sleep paying it down. It can differ from a wearable's native sleep-debt figure, which uses its own need model."
|
||
},
|
||
"average": {
|
||
"title": "Average per night",
|
||
"value": "{hours}h {minutes}m",
|
||
"caption": "Mean sleep across the last {nights} nights",
|
||
"learning": "Still learning your sleep: {counted} nights so far, {remaining} more for a reliable average."
|
||
},
|
||
"chronotype": {
|
||
"title": "Chronotype",
|
||
"learning": "Still learning your rhythm: {counted} of {total} free nights. A chronotype needs a few alarm-free mornings before it means anything.",
|
||
"advancedToggle": "Advanced",
|
||
"socialJetlagValue": "{hours}h {minutes}m social jetlag",
|
||
"socialJetlagCaption": "The gap between your work-day and free-day sleep timing, like a small weekly time-zone shift.",
|
||
"msfScValue": "Corrected mid-sleep {clock}",
|
||
"msfScCaption": "Adjusted for the sleep you catch up on at the weekend (MSFsc).",
|
||
"dayTypeNote": "Free days are assumed to be weekends until day-type tracking is added.",
|
||
"band": {
|
||
"extreme_early": "Strong morning type",
|
||
"early": "Morning type",
|
||
"intermediate": "Intermediate type",
|
||
"late": "Evening type",
|
||
"extreme_late": "Strong evening type"
|
||
},
|
||
"midpointHeadline": "Your natural sleep midpoint is around {clock}."
|
||
},
|
||
"rhythm": {
|
||
"loadError": "Your sleep rhythm couldn't load just now. It'll reappear once the connection settles."
|
||
}
|
||
},
|
||
"medicationCompliance": "Medication adherence",
|
||
"dayStreak": "{count} day streak",
|
||
"dayStreakOne": "{count} day streak",
|
||
"compliance7d": "Adherence (7 days)",
|
||
"compliance30d": "Adherence (30 days)",
|
||
"taken": "taken",
|
||
"skipped": "skipped",
|
||
"missed": "missed",
|
||
"assessmentTitle": "Assessment",
|
||
"restMode": {
|
||
"title": "Rest Mode",
|
||
"body": "An illness or condition episode is active, so this reflects a recovery window. Your score isn't lowered for it.",
|
||
"bodySince": "An illness or condition episode has been active since {since}, so this reflects a recovery window. Your score isn't lowered for it."
|
||
},
|
||
"bloodPressureSectionTitle": "Blood Pressure",
|
||
"weightSectionTitle": "Weight",
|
||
"pulseSectionTitle": "Pulse",
|
||
"bmiSectionTitle": "BMI",
|
||
"complianceNoData": "No adherence data available.",
|
||
"generate": "Generate new analysis",
|
||
"moodSectionTitle": "Mood",
|
||
"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 adherence, 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 a source"
|
||
}
|
||
},
|
||
"navWorkouts": "Workouts",
|
||
"navRecovery": "Recovery",
|
||
"workouts": {
|
||
"title": "Workouts",
|
||
"description": "Recent runs, rides, walks and strength sessions, deduped across Apple Watch and Withings sources.",
|
||
"emptyState": {
|
||
"title": "No workouts yet",
|
||
"description": "Workouts sync from Apple Health on your iPhone and from Withings. You can also log one by hand."
|
||
},
|
||
"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",
|
||
"routeTitle": "Route",
|
||
"hrChartTitle": "Heart rate",
|
||
"notFound": "Workout not found.",
|
||
"hrFromPulse": "From your heart-rate data around this session",
|
||
"hrAxisMinutes": "min",
|
||
"hrAvgMarker": "Avg {bpm}",
|
||
"hrMaxMarker": "Peak {bpm}",
|
||
"hrRangeValue": "{low} to {high} bpm",
|
||
"hrRangeLabel": "Range",
|
||
"hrNoProfile": "No reading-by-reading heart-rate data covers this session.",
|
||
"sportAverageLabel": "Your recent average:",
|
||
"zonesTitle": "Effort zones",
|
||
"zonesCaption": "How your effort was distributed across heart-rate zones.",
|
||
"zonesCaptionDevice": "Time in zone as reported by your device.",
|
||
"exportGpx": "Export GPX",
|
||
"elevationTitle": "Elevation",
|
||
"splitsTitle": "Splits",
|
||
"splitsKm": "km",
|
||
"splitsTime": "Time",
|
||
"splitsPace": "Pace",
|
||
"thatDayTitle": "That day",
|
||
"daySleepTitle": "The night before",
|
||
"daySleepNone": "No sleep recorded for that night",
|
||
"daySleepAwakeningsOne": "{count} awakening",
|
||
"daySleepAwakeningsMany": "{count} awakenings",
|
||
"dayMoodTitle": "Mood that day",
|
||
"dayMoodNone": "No mood logged that day",
|
||
"sleepTrendsLink": "Sleep trends",
|
||
"moodHistoryLink": "Mood history",
|
||
"previousSessionLink": "Previous session",
|
||
"insightTitle": "Activity insight"
|
||
},
|
||
"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",
|
||
"badminton": "Badminton",
|
||
"tennis": "Tennis",
|
||
"basketball": "Basketball",
|
||
"soccer": "Soccer",
|
||
"crossTraining": "Cross training",
|
||
"mixedCardio": "Mixed cardio",
|
||
"other": "Other"
|
||
},
|
||
"loadError": "Your workouts could not be loaded",
|
||
"loadMore": "Load more workouts",
|
||
"loadingMore": "Loading more workouts",
|
||
"loadMoreError": "More workouts could not be loaded",
|
||
"countOne": "{count} workout",
|
||
"countOther": "{count} workouts",
|
||
"countFew": "{count} workouts",
|
||
"filterLabel": "Filter by sport",
|
||
"filterAll": "All sports",
|
||
"filterEmpty": "No sessions of this sport in your history.",
|
||
"manual": {
|
||
"logWorkout": "Log workout",
|
||
"sheetTitle": "Log workout",
|
||
"sheetDescription": "Enter a session by hand: what you did, when, and for how long.",
|
||
"sportLabel": "Activity",
|
||
"sportPlaceholder": "Choose an activity",
|
||
"startLabel": "Start",
|
||
"startHint": "Leave empty if you just finished: it counts back from now by the duration.",
|
||
"durationLabel": "Duration",
|
||
"distanceLabel": "Distance ({unit})",
|
||
"energyLabel": "Active energy (kcal)",
|
||
"alreadySaved": "This workout is already saved",
|
||
"saveError": "The workout could not be saved",
|
||
"deleteLabel": "Delete workout",
|
||
"deleteConfirmTitle": "Delete this workout?",
|
||
"deleteConfirmDescription": "This workout you entered by hand will be removed for good.",
|
||
"deleted": "Workout deleted",
|
||
"deleteError": "The workout could not be deleted",
|
||
"errors": {
|
||
"sportRequired": "Choose an activity.",
|
||
"startRequired": "Enter a date and time.",
|
||
"startInFuture": "The start cannot be in the future.",
|
||
"durationRequired": "Enter how long the workout lasted.",
|
||
"durationInvalid": "Enter whole hours, and minutes from 0 to 59.",
|
||
"durationTooLong": "A workout can last at most 24 hours.",
|
||
"endInFuture": "It would end in the future. Set the start to when the workout began.",
|
||
"distanceInvalid": "Enter the distance as a number within a realistic range.",
|
||
"energyInvalid": "Enter active energy as a number up to 20,000 kcal."
|
||
},
|
||
"editTitle": "Edit workout",
|
||
"editAction": "Edit",
|
||
"updated": "Workout updated"
|
||
},
|
||
"load": {
|
||
"title": "Training load",
|
||
"fitness": "Fitness",
|
||
"fatigue": "Fatigue",
|
||
"form": "Form",
|
||
"explainer": "Fitness is your heart-rate training impulse averaged over about six weeks, fatigue over about one week, and form is the difference. The numbers compare with your own past, not with other people or other apps.",
|
||
"warmingUp": "Based on {days} days so far: until six weeks are covered, fitness reads lower than it is.",
|
||
"coverage": "{rated} of the last {days} days could be rated. A day with no activity data, or with a workout that could not be scored, is left out rather than counted as rest.",
|
||
"asOf": "As of {date}, the last day that could be rated."
|
||
}
|
||
},
|
||
"bloodGlucose": {
|
||
"title": "Blood Glucose",
|
||
"description": "Your blood-glucose readings over time, in {unit}.",
|
||
"chartTitle": "Blood glucose",
|
||
"medianLabel": "Median glucose",
|
||
"emptyState": {
|
||
"title": "No glucose data yet",
|
||
"description": "Blood-glucose readings appear here once you log one or a connected device syncs."
|
||
},
|
||
"clinical": {
|
||
"title": "Glucose overview",
|
||
"subtitle": "A read on your last {days} days, from {count} readings.",
|
||
"spotCaveat": "These are spot-reading estimates from individual measurements, not a continuous-monitor profile. Read them as a direction of travel rather than a clinical verdict.",
|
||
"labsLink": "Lab results? Log a blood-draw HbA1c or fasting glucose under Labs.",
|
||
"learningTitle": "Still learning your glucose",
|
||
"learningBody": "So far that's {count} over {days}. A little more history and a fuller picture comes into focus. Keep logging, or let a connected device fill it in.",
|
||
"learningBodyEmpty": "Once a handful of readings come in (logged by you or synced from a device), your time-in-range, average, and variability take shape here.",
|
||
"readingsCount": "{count} readings",
|
||
"readingsCountOne": "1 reading",
|
||
"daysCount": "{days} days",
|
||
"daysCountOne": "1 day",
|
||
"tir": {
|
||
"title": "Time in range",
|
||
"caption": "Share of readings in each band ({low}–{high} {unit} is the target).",
|
||
"veryLow": "Very low",
|
||
"low": "Low",
|
||
"inRange": "In range",
|
||
"high": "High",
|
||
"veryHigh": "Very high",
|
||
"ariaLabel": "Time in range: {tir}% in target, {below}% below, {above}% above.",
|
||
"empty": "No readings to chart yet."
|
||
},
|
||
"gmi": {
|
||
"label": "Glucose Management Indicator",
|
||
"help": "An A1C-like estimate derived from your average glucose."
|
||
},
|
||
"eA1c": {
|
||
"label": "Estimated A1C",
|
||
"help": "An A1C estimate from your mean glucose (ADAG)."
|
||
},
|
||
"mean": {
|
||
"label": "Average glucose"
|
||
},
|
||
"cv": {
|
||
"label": "Variability",
|
||
"steady": "Steady",
|
||
"unstable": "Unstable",
|
||
"help": "Coefficient of variation. At or above 36% glucose is considered unstable; lower is steadier."
|
||
},
|
||
"advanced": {
|
||
"toggle": "Advanced indices",
|
||
"intro": "Research-grade composites for a closer look. Each folds your readings into a single risk-weighted number.",
|
||
"jIndex": {
|
||
"label": "J-index",
|
||
"help": "A single score blending your average and its spread; lower reads as tighter control."
|
||
},
|
||
"lbgi": {
|
||
"label": "Low-glucose risk (LBGI)",
|
||
"help": "Kovatchev's index weighting how often and how deeply readings dip low."
|
||
},
|
||
"hbgi": {
|
||
"label": "High-glucose risk (HBGI)",
|
||
"help": "Kovatchev's index weighting how often and how high readings climb."
|
||
},
|
||
"byContext": {
|
||
"title": "By context",
|
||
"fasting": "Fasting",
|
||
"postprandial": "After meals",
|
||
"random": "Random",
|
||
"bedtime": "Bedtime",
|
||
"unspecified": "Untagged",
|
||
"readingsShort": "{count} readings",
|
||
"readingsShortOne": "1 reading"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"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."
|
||
}
|
||
},
|
||
"bodyFat": {
|
||
"title": "Body Fat",
|
||
"description": "Your body fat percentage over time.",
|
||
"chartTitle": "Body fat",
|
||
"emptyState": {
|
||
"title": "No body-fat data yet",
|
||
"description": "Body-fat readings appear here once a body-composition scale syncs, or when you log one by hand.",
|
||
"cta": "Log body fat"
|
||
}
|
||
},
|
||
"navFatMass": "Fat mass",
|
||
"navBodyFat": "Body fat",
|
||
"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",
|
||
"emptyState": {
|
||
"title": "No walking-speed data yet",
|
||
"description": "Walking-speed readings appear here once Apple Health syncs."
|
||
}
|
||
},
|
||
"navWalkingSpeed": "Walking speed",
|
||
"mood": {
|
||
"logLink": "Log a mood entry",
|
||
"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}",
|
||
"sourceLabel": "How this was computed",
|
||
"emptyTitle": "Not enough paired data yet",
|
||
"emptyDescription": "Log mood and this metric on the same days to see a correlation.",
|
||
"pendingDescription": "{n} of {needed} paired days so far. A correlation appears once there are enough days to tell a pattern from chance.",
|
||
"noLinkTitle": "No clear link",
|
||
"noLinkDescription": "{n} paired days, and nothing stands out beyond what chance would produce.",
|
||
"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",
|
||
"title": "Stability"
|
||
},
|
||
"influence": {
|
||
"title": "Influence on mood",
|
||
"detail": "Averages {withAvg} on the {withDays} days you tagged this vs {withoutAvg} without it.",
|
||
"confidenceLow": "Low confidence",
|
||
"confidenceMedium": "Medium confidence",
|
||
"confidenceHigh": "High confidence"
|
||
},
|
||
"betterDays": {
|
||
"title": "What goes with your better days",
|
||
"description": "Tags and metrics that line up with your higher- and lower-mood days, ranked by how strongly they move together."
|
||
},
|
||
"crosstab": {
|
||
"title": "Tags and your health metrics",
|
||
"description": "How a health metric differs on the days you tagged each activity, compared with the days you did not.",
|
||
"pairLabel": "{metric} on days with {tag}",
|
||
"metricActiveEnergy": "Active energy",
|
||
"metricSleepDuration": "Sleep",
|
||
"metricNextDayRecovery": "Next-day recovery",
|
||
"metricNextDayRestingHr": "Next-day resting heart rate",
|
||
"metricNextDayHrv": "Next-day heart-rate variability",
|
||
"detailSameDay": "Averages {withAvg} on the {withDays} days you tagged this vs {withoutAvg} without it.",
|
||
"detailNextDay": "Averages {withAvg} the day after the {withDays} days you tagged this vs {withoutAvg} otherwise."
|
||
},
|
||
"factorCrosstab": {
|
||
"title": "Your rated factors and your vitals",
|
||
"description": "How a vital differs on the days you rated each factor low compared with the days you rated it high.",
|
||
"pairLabel": "{metric} on days with {factor}",
|
||
"metricSleepDuration": "Sleep",
|
||
"metricSteps": "Steps",
|
||
"metricRestingHeartRate": "Resting heart rate",
|
||
"metricHrv": "Heart-rate variability",
|
||
"metricWeight": "Weight",
|
||
"metricBloodPressureSys": "Systolic",
|
||
"detail": "Averages {lowAvg} on the {lowDays} days you rated {factor} low vs {highAvg} on the days you rated it high.",
|
||
"detailInverse": "Averages {lowAvg} on your {lowDays} worse {factor} days vs {highAvg} on your better ones."
|
||
},
|
||
"discovery": {
|
||
"title": "What stands out",
|
||
"subheading": "Discovered relationships",
|
||
"footer": "Surfaced from {tested} day-to-day pairs tested across all your metrics, after the false-discovery correction.",
|
||
"disclaimer": "Statistically filtered, but still observational: a pattern worth watching, not a cause.",
|
||
"moodUp": "Higher {factor} tends to go with higher next-day mood in your data.",
|
||
"moodDown": "Higher {factor} tends to go with lower next-day mood in your data.",
|
||
"outcomeUp": "Higher mood tends to go with higher next-day {factor} in your data.",
|
||
"outcomeDown": "Higher mood tends to go with lower next-day {factor} in your data.",
|
||
"stat": "{n} paired days, r = {r}, q = {q}",
|
||
"statLabel": "How this was computed",
|
||
"explainerLabel": "How this was computed",
|
||
"channel": {
|
||
"ALCOHOL": "alcohol use",
|
||
"WORKOUT_MINUTES": "workout minutes",
|
||
"TRAINING_LOAD": "training load"
|
||
}
|
||
},
|
||
"inTargetTitle": "In your range",
|
||
"dimensions": {
|
||
"title": "State of mind",
|
||
"none": "Nothing recorded on your state of mind yet.",
|
||
"window": "{days} days",
|
||
"noneInWindow": "nothing in this range",
|
||
"higherIsMore": "higher = {anchor}",
|
||
"notRecorded": "Not recorded: {list}."
|
||
},
|
||
"contextComparison": {
|
||
"title": "Day context and your mood",
|
||
"description": "How the mood value sat on the days recorded so far carrying this entry, compared with the other days.",
|
||
"lower": "lower",
|
||
"higher": "higher",
|
||
"statement": "On days with “{label}” the mood averaged {direction}: {withAvg} against {withoutAvg}.",
|
||
"counts": "{withDays} days with, {withoutDays} days without",
|
||
"caveat": "That shows a connection, not a cause."
|
||
},
|
||
"prognosis": {
|
||
"title": "Your self-rating",
|
||
"selfLabel": "Your rating",
|
||
"expectedLabel": "Expected on your own pattern",
|
||
"band": "Range {low} to {high}",
|
||
"statement": "On your own patterns so far, a value around {value} would have been expected for {date}. Built from {n} comparable days.",
|
||
"provisional": "Still provisional: the pattern rests on a short stretch of days.",
|
||
"notToday": "This describes {date}, not today.",
|
||
"deviationWithin": "Your own rating sits inside that range.",
|
||
"deviationAbove": "Your own rating sits {amount} points above that range.",
|
||
"deviationBelow": "Your own rating sits {amount} points below that range.",
|
||
"weightedTitle": "What weighed most in this day's comparison",
|
||
"weightedUp": "{label}: counted towards a higher expected value",
|
||
"weightedDown": "{label}: counted towards a lower expected value",
|
||
"caveat": "This is a comparison with your own past days, not a statement about how a day came to go the way it did.",
|
||
"learning": "Learning phase: {entries} of {threshold} days recorded. A comparison appears once there are enough of them.",
|
||
"noPattern": "Nothing in the {entries} days recorded so far is steady enough to compare a day against. When you also capture a day's context, more of it becomes comparable.",
|
||
"featureValue": "{field}: {value}",
|
||
"loadError": "Could not load the value expected on your own pattern."
|
||
},
|
||
"patterns": {
|
||
"title": "Patterns in your mood",
|
||
"basedOn": "Based on {subject} and {comparison} days. A pattern, not a cause.",
|
||
"previousDayHigher": "After a below-usual day, the next day tends to be better ({subject} against {comparison} after an above-usual day).",
|
||
"previousDayLower": "A below-usual day tends to carry over into the next one ({subject} against {comparison} after an above-usual day).",
|
||
"weekendHigher": "Your mood tends to be higher at the weekend ({subject} against {comparison} on weekdays).",
|
||
"weekendLower": "Your mood tends to be lower at the weekend ({subject} against {comparison} on weekdays).",
|
||
"bestWeekday": "{weekday} tends to be your best day ({subject} against {comparison} on the other days).",
|
||
"notesHigher": "On days with a note your mood tends to be higher ({subject} against {comparison} without one).",
|
||
"notesLower": "On days with a note your mood tends to be lower ({subject} against {comparison} without one).",
|
||
"delayedTagHigher": "The day after “{tag}”, your mood tends to be higher ({subject} against {comparison} otherwise).",
|
||
"delayedTagLower": "The day after “{tag}”, your mood tends to be lower ({subject} against {comparison} otherwise).",
|
||
"multipleEntriesHigher": "On days you log more than once, your mood tends to be higher ({subject} against {comparison} on single-entry days).",
|
||
"multipleEntriesLower": "On days you log more than once, your mood tends to be lower ({subject} against {comparison} on single-entry days)."
|
||
}
|
||
},
|
||
"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}",
|
||
"summaryLabelled": "{label} ({percent}%)"
|
||
},
|
||
"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 of {source} data",
|
||
"asOf": "as of {date}",
|
||
"standardLink": "Standard: {name}"
|
||
},
|
||
"vitals": {
|
||
"sectionTitle": "Your vitals",
|
||
"sectionSubtitle": "Resting cardiovascular and respiratory signals against your own baseline",
|
||
"loadingLabel": "Loading your vitals",
|
||
"loadError": "Could not load your vitals right now.",
|
||
"infoLabel": "How is this calculated?",
|
||
"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}, weighted {weight}%",
|
||
"contributorMissing": "no data",
|
||
"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"
|
||
},
|
||
"gap": {
|
||
"fewNights": "not enough nights yet ({count} of {needed})",
|
||
"noMainSleep": "latest day had only a nap"
|
||
}
|
||
},
|
||
"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"
|
||
}
|
||
},
|
||
"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.",
|
||
"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.",
|
||
"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.",
|
||
"description": "A nightly activity-load proxy from your heart-rate-weighted effort, relative to your typical effort.",
|
||
"deviceCaption": "Your device's day strain: {value} of {max}",
|
||
"deviceSource": "Until HealthLog has computed its own value overnight, the card shows your device's day strain, rescaled to 0–100."
|
||
},
|
||
"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."
|
||
},
|
||
"TRAJECTORY": {
|
||
"method": "A least-squares line fitted to your recent daily values and projected forward over a short horizon, with the textbook prediction interval that widens the further it reaches. Computed only when the recent trend is strong enough and your history is long and current enough; otherwise no line is drawn.",
|
||
"caveat": "A projection of your own recent trend, not a prediction, a target, or a clinical forecast. It holds only if the recent pattern continues; the shaded band shows how quickly that certainty fades."
|
||
},
|
||
"SAME_TIME_BASELINE": {
|
||
"method": "Your running total for today set against the median of the same local hour across your last four weeks, with a robust median ± MAD band around it. Only days with enough recorded detail count towards it, and no comparison is shown until at least fourteen of them are in hand.",
|
||
"caveat": "A comparison with your own recent history, not a target. It says where today sits against your usual pattern at this hour and nothing about whether that pattern is right for you."
|
||
}
|
||
},
|
||
"scores": {
|
||
"sectionTitle": "Your health scores",
|
||
"sectionSubtitle": "Composite recovery, stress and strain read from your connected devices",
|
||
"loadError": "Could not load your wellness scores right now.",
|
||
"loadingLabel": "Loading your health scores",
|
||
"recovery": "Recovery score",
|
||
"recoveryCrossLink": "See your wearable's recovery & strain data",
|
||
"stress": "Stress",
|
||
"strain": "Strain",
|
||
"historyTitle": "History",
|
||
"historyWindow": "Last {days} days"
|
||
},
|
||
"coincident": {
|
||
"label": "Several vitals off baseline",
|
||
"summary": "{count} of your vitals sat outside their personal range today.",
|
||
"vitals": "Outside range: {list}",
|
||
"cardTitle": "Signals of the day",
|
||
"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.",
|
||
"illnessExplained": "These shifts likely reflect the condition you logged."
|
||
},
|
||
"trajectory": {
|
||
"cardTitle": "Short-horizon projection",
|
||
"headline": "If this pattern continues: the next {days} days",
|
||
"range": "Projected around {low}–{high} {unit} in {days} days.",
|
||
"caveat": "A projection of your own recent trend, not a prediction. The shaded band widens to show how quickly the uncertainty grows.",
|
||
"insufficient": "Not enough of a clear trend to project yet. Keep tracking and a projection will appear once the recent pattern is strong enough.",
|
||
"daysNeeded": "About {count} more days of tracking needed before a projection can appear."
|
||
},
|
||
"sameTime": {
|
||
"sectionTitle": "Today so far",
|
||
"sectionSubtitle": "Your running totals against what is usual for you at this hour",
|
||
"learning": "Learning your usual day: {count} of {target} days",
|
||
"framing": "Typical by {time}: {typical} {unit}",
|
||
"comparisonLabel": "Your typical day"
|
||
}
|
||
},
|
||
"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",
|
||
"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."
|
||
}
|
||
},
|
||
"trendDescriptor": {
|
||
"rising": "Rising over 30 days ({delta}{unit}).",
|
||
"falling": "Falling over 30 days ({delta}{unit}).",
|
||
"stable": "Stable over the last 30 days.",
|
||
"moodImproved": "Mood trended slightly higher over 30 days.",
|
||
"moodDeclined": "Mood trended slightly lower over 30 days.",
|
||
"moodStable": "Mood held steady over the last 30 days."
|
||
},
|
||
"target": {
|
||
"heading": "Target"
|
||
},
|
||
"settings": {
|
||
"overviewTitle": "Arrange the overview",
|
||
"overviewDescription": "Show or hide sections and set their order on the Insights overview."
|
||
},
|
||
"pillOrder": {
|
||
"title": "Sort the navigation chips",
|
||
"description": "Drag the chips into the order you want and show or hide them via the eye icon.",
|
||
"dragHandle": "Reorder",
|
||
"saveSuccess": "Chip order saved",
|
||
"saveError": "Saving the chip order failed.",
|
||
"save": "Save",
|
||
"empty": "No navigation chips available yet.",
|
||
"detail": "Hidden detail pages are also removed from the top navigation."
|
||
},
|
||
"customize": "Customize Insights",
|
||
"regenerateRateLimited": "Refresh limit reached. Please try again later.",
|
||
"regenerateUnavailable": "No fresh analysis arrived. Please try again later.",
|
||
"regenerateError": "Still refreshing. Please try again in a moment.",
|
||
"regenerateSettling": "Your assessment is still being prepared",
|
||
"regenerateSettleFailed": "The refresh could not be completed. Please try again later.",
|
||
"deviceScore": {
|
||
"learning": "Still learning your baseline. A few more nights will fill in the trend.",
|
||
"average": "30-day average {value}",
|
||
"unitScore": "score",
|
||
"unitMinutes": "min",
|
||
"unitBpm": "bpm",
|
||
"unitKj": "kJ",
|
||
"unitLoad": "load"
|
||
},
|
||
"sleepQuality": {
|
||
"title": "Sleep quality",
|
||
"subtitle": "Nightly scores from your wearable"
|
||
},
|
||
"recovery": {
|
||
"title": "Recovery",
|
||
"description": "How well your body has bounced back: the recovery, strain and load signals your wearable records overnight.",
|
||
"scoreCrossLink": "See the composite recovery score",
|
||
"emptyTitle": "No recovery data yet",
|
||
"empty": "This page fills with the recharge, strain and load readings from WHOOP or Polar and with Oura's resilience level.",
|
||
"emptyOuraPermission": "Oura's resilience level needs the stress permission, so reconnect Oura once under Integrations and allow it.",
|
||
"emptyOuraNoResilience": "Oura is connected, and its resilience level appears here as soon as Oura provides one.",
|
||
"emptyAction": "Open integrations",
|
||
"block": {
|
||
"ansChargeExplainer": "How charged your autonomic nervous system is for the day ahead, a recharge reading drawn from your overnight heart and breathing signals.",
|
||
"dayStrainExplainer": "The day's whole-body cardiovascular load on your device's strain scale. Read it against your recovery, not as a goal on its own.",
|
||
"workoutStrainExplainer": "How demanding a single workout was on the same strain scale: the cardiovascular cost of that session.",
|
||
"cardioLoadExplainer": "A training-load proxy that tracks the acute cardiovascular load you have built up. Compare it with your own recent days.",
|
||
"averageHeartRateExplainer": "Your average heart rate across the whole day or cycle, as reported by your wearable.",
|
||
"maxHeartRateExplainer": "Your peak heart rate across the whole day or cycle, as reported by your wearable.",
|
||
"energyExpenditureKjExplainer": "The energy your body expended over the day, in kilojoules, as your device reports it natively.",
|
||
"bodyBatteryExplainer": "Your energy reserve on Garmin's 0 to 100 scale, the day's highest charge. Rest and sleep fill it, stress and activity drain it.",
|
||
"trainingReadinessExplainer": "How ready your body is for a hard session, on Garmin's 0 to 100 scale. It arrives from a bridge you set up, since Garmin does not share it directly.",
|
||
"stressLevelExplainer": "Garmin's all-day average stress level on a 0 to 100 scale, read from your heart rate variability. Lower is calmer.",
|
||
"acuteTrainingLoadExplainer": "Garmin's acute training load: the weighted load of your last seven days of activity. It arrives from a bridge you set up. Compare it with your own recent weeks."
|
||
},
|
||
"loadError": "Your recovery readings could not be loaded."
|
||
},
|
||
"bodyTempDeviation": {
|
||
"title": "Body temperature deviation",
|
||
"subtitle": "Overnight delta from your baseline"
|
||
},
|
||
"resilience": {
|
||
"explainer": "How well your body is balancing daily strain with recovery, read from your overnight signals across recent days.",
|
||
"learning": "Still learning your resilience. A few more days will settle the band.",
|
||
"band": {
|
||
"limited": "Limited",
|
||
"adequate": "Adequate",
|
||
"solid": "Solid",
|
||
"strong": "Strong",
|
||
"exceptional": "Exceptional"
|
||
},
|
||
"trend": {
|
||
"above": "Above your recent average.",
|
||
"steady": "In line with your recent average.",
|
||
"below": "Below your recent average."
|
||
}
|
||
},
|
||
"briefing": {
|
||
"memory": {
|
||
"forwardWatch": "Worth keeping an eye on {metric}.",
|
||
"forwardHolding": "Everything's holding steady for now."
|
||
}
|
||
},
|
||
"updatedTodayAt": "Updated today, {time}",
|
||
"updatedYesterday": "Updated yesterday",
|
||
"updatedOn": "Updated on {date}",
|
||
"healthStatus": {
|
||
"sectionTitle": "What's changed",
|
||
"subtitle": "Signals drifting from your usual range.",
|
||
"deviationAbove": "{vital} is above your typical range.",
|
||
"deviationBelow": "{vital} is below your typical range.",
|
||
"shiftUp": "{vital} has shifted up from your recent normal.",
|
||
"shiftDown": "{vital} has shifted down from your recent normal.",
|
||
"rangeContext": "Now {value}, usually {low}–{high}.",
|
||
"rangeContextTimeOfDay": "Now {value}, usually {low}–{high} at this time of day.",
|
||
"shiftContext": "Around {before} before, {after} since.",
|
||
"shiftDays": "Based on {before} days before and {after} since."
|
||
},
|
||
"breathingScreening": {
|
||
"sectionTitle": "Breathing during sleep",
|
||
"subtitle": "A screening signal from your sleep data.",
|
||
"classificationElevated": "Your device flagged elevated breathing disturbances.",
|
||
"classificationNotElevated": "Your device's classification is not elevated.",
|
||
"trendUp": "Trending higher than your earlier nights.",
|
||
"trendDown": "Trending lower than your earlier nights.",
|
||
"trendStable": "Holding steady against your earlier nights.",
|
||
"nights": "{count} nights tracked",
|
||
"indexLine": "recent average index {value}",
|
||
"eventsFlagged": "{count} events flagged by your device",
|
||
"disclaimer": "This is a screening signal, not a diagnosis. Discuss with a clinician."
|
||
},
|
||
"labsChanges": {
|
||
"sectionTitle": "Since your last panel",
|
||
"subtitle": "How your latest results compare with the panel before.",
|
||
"statusInRange": "in range",
|
||
"statusBelow": "below range",
|
||
"statusAbove": "above range",
|
||
"directionFlat": "no change"
|
||
},
|
||
"navGripStrength": "Grip strength",
|
||
"navPainNrs": "Pain",
|
||
"navWaistCircumference": "Waist",
|
||
"navWaistToHeight": "Waist-to-height",
|
||
"gripStrength": {
|
||
"title": "Grip strength",
|
||
"description": "Maximal handgrip force, a robust proxy for whole-body strength. Below the sex-specific cut-off (men 27 kg, women 16 kg) flags probable sarcopenia; your own trend leads the read.",
|
||
"chartTitle": "Grip strength",
|
||
"emptyState": {
|
||
"title": "No grip strength yet",
|
||
"description": "Log a reading from a hand dynamometer (record the best of a few squeezes) and the trend will appear here.",
|
||
"cta": "Log grip strength"
|
||
},
|
||
"coachPrefill": "I haven't logged any grip strength yet. What does it tell me about my muscle health, and how do I measure and improve it?"
|
||
},
|
||
"pain": {
|
||
"title": "Pain (0–10)",
|
||
"description": "Patient-reported pain intensity on the 0–10 numeric rating scale, where 0 is no pain and 10 is the worst imaginable. A sustained 2-point change is the signal to watch.",
|
||
"chartTitle": "Pain (0–10)",
|
||
"emptyState": {
|
||
"title": "No pain scores yet",
|
||
"description": "Log how your pain feels right now on the 0–10 scale and the trend will appear here.",
|
||
"cta": "Log a pain score"
|
||
},
|
||
"coachPrefill": "I haven't logged any pain scores yet. How should I track pain on the 0–10 scale, and what counts as a meaningful change?"
|
||
},
|
||
"waist": {
|
||
"title": "Waist circumference",
|
||
"description": "Waist girth in centimetres, a marker of central fat. The WHO increased-risk threshold is sex-specific (men 94 cm, women 80 cm); your own trend leads the read.",
|
||
"chartTitle": "Waist circumference",
|
||
"emptyState": {
|
||
"title": "No waist measurements yet",
|
||
"description": "Measure your waist at the midpoint between the lowest rib and the hip bone, at the end of a normal breath, and log it here.",
|
||
"cta": "Log waist circumference"
|
||
},
|
||
"coachPrefill": "I haven't logged any waist measurements yet. How do I measure my waist correctly, and what does the number mean for my health?"
|
||
},
|
||
"waistToHeight": {
|
||
"title": "Waist-to-height ratio",
|
||
"description": "Your waist divided by your height, the ancestry-robust single number. Keeping it under 0.5 (waist below half your height) is the simple target.",
|
||
"chartTitle": "Waist-to-height ratio",
|
||
"emptyState": {
|
||
"title": "No waist-to-height ratio yet",
|
||
"description": "Log a waist-to-height ratio and the trend will appear here. The rule of thumb: keep your waist under half your height.",
|
||
"cta": "Log waist-to-height ratio"
|
||
},
|
||
"coachPrefill": "I haven't logged a waist-to-height ratio yet. Why is it a useful number, and how do I keep it under 0.5?"
|
||
},
|
||
"ecg": {
|
||
"sectionTitle": "ECG recordings",
|
||
"loadError": "Could not load your ECG recordings.",
|
||
"backToList": "Back to recordings",
|
||
"clinicianNote": "If this result concerns you, discuss this recording with a clinician.",
|
||
"resultAttribution": "Recorded result: {result}, as reported by the recording device.",
|
||
"result": {
|
||
"irregular": "Atrial fibrillation detected",
|
||
"notDetected": "No signs of atrial fibrillation",
|
||
"inconclusive": "Inconclusive recording",
|
||
"none": "No result reported"
|
||
},
|
||
"meta": {
|
||
"recorded": "Recorded",
|
||
"duration": "Duration",
|
||
"lead": "Lead",
|
||
"averageHeartRate": "Average heart rate",
|
||
"samplingRate": "Sampling rate",
|
||
"leadSingle": "Single lead (Lead I)",
|
||
"durationValue": "{seconds} s",
|
||
"bpmValue": "{bpm} bpm",
|
||
"hzValue": "{hz} Hz",
|
||
"unknown": "—"
|
||
},
|
||
"waveform": {
|
||
"ariaLabel": "ECG strip recorded {date}, duration {duration}, average heart rate {heartRate}, recorded result: {result}."
|
||
},
|
||
"crossLink": {
|
||
"title": "ECG recordings",
|
||
"recordingsOne": "1 recording on file.",
|
||
"recordingsMany": "{count} recordings on file.",
|
||
"latestResult": "Latest device result: {result}.",
|
||
"cta": "View recordings"
|
||
},
|
||
"emptyTitle": "No ECG recordings yet",
|
||
"emptyDescription": "ECG recordings sync from a compatible single-lead device. Once your device uploads a recording, it appears here.",
|
||
"emptyCta": "Connect a device"
|
||
},
|
||
"intradayPulse": {
|
||
"title": "Pulse through the day",
|
||
"caption": "Averaged in 10-minute steps.",
|
||
"hourlyNote": "Showing this day's hourly average; recent days show the full 10-minute detail.",
|
||
"empty": "Not enough heart-rate readings for this day to show its shape yet.",
|
||
"coverageOne": "Based on 1 reading across {hours}h.",
|
||
"coverageMany": "Based on {count} readings across {hours}h.",
|
||
"baseline": "Resting",
|
||
"today": "Today",
|
||
"previousDay": "Previous day",
|
||
"nextDay": "Next day",
|
||
"tension": {
|
||
"morning": "A sustained elevated-at-rest stretch this morning, possibly some tension.",
|
||
"afternoon": "A sustained elevated-at-rest stretch this afternoon, possibly some tension.",
|
||
"evening": "A sustained elevated-at-rest stretch this evening, possibly some tension.",
|
||
"night": "A sustained elevated-at-rest stretch overnight, possibly some tension."
|
||
}
|
||
},
|
||
"navEcg": "ECG",
|
||
"sectionLoadError": "This section could not be loaded.",
|
||
"aiSetupHint": {
|
||
"title": "AI is optional",
|
||
"body": "Everything here works without AI. If you want a daily briefing, short notes on your readings and the Coach, you can connect an AI provider.",
|
||
"settingsBody": "HealthLog works fully without AI. Connect a provider below if you want a daily briefing, short notes on your readings and the Coach.",
|
||
"action": "Set up AI",
|
||
"dismiss": "Not now"
|
||
},
|
||
"bmiHeight": {
|
||
"coachPrefill": "I haven’t set my height yet. Why does BMI matter, and what should I know before I configure it?"
|
||
},
|
||
"medicationsEmpty": {
|
||
"coachPrefill": "I haven’t added any medications yet. What should I know before I start tracking medication compliance here?"
|
||
},
|
||
"scoreHistory": {
|
||
"healthTitle": "Health Score history",
|
||
"healthDescription": "Your Health Score day by day, as it was shown on each day.",
|
||
"emptyDescription": "No score was recorded in this range yet.",
|
||
"usualRange": "Shaded: your usual range, {lo} to {hi}.",
|
||
"seam": "The line breaks where what counts toward the score changed."
|
||
},
|
||
"bpTimeOfDay": {
|
||
"title": "By time of day",
|
||
"description": "Your average blood pressure in each part of the day, over the chart's range.",
|
||
"part": {
|
||
"morning": "Morning",
|
||
"midday": "Midday",
|
||
"evening": "Evening"
|
||
},
|
||
"filterAll": "All day",
|
||
"filterLabel": "Show in the chart",
|
||
"readingsOne": "{count} reading",
|
||
"readingsFew": "{count} readings",
|
||
"readingsOther": "{count} readings",
|
||
"notEnough": "Too few readings",
|
||
"pulse": "Pulse {value} bpm",
|
||
"difference": "Morning minus evening: {systolic}/{diastolic} mmHg.",
|
||
"differencePending": "Morning and evening are compared once each has at least {min} readings.",
|
||
"hours": "Morning {morning}, midday {midday}, evening {evening}, in your time zone.",
|
||
"hourRange": "{start}–{end}",
|
||
"emptyTitle": "No complete readings in this range",
|
||
"emptyDescription": "Readings with both a systolic and a diastolic value show up here.",
|
||
"error": "The time-of-day averages could not be loaded.",
|
||
"chartTitle": {
|
||
"morning": "Blood pressure in the morning",
|
||
"midday": "Blood pressure at midday",
|
||
"evening": "Blood pressure in the evening"
|
||
},
|
||
"statsLabel": "{series}, {part}",
|
||
"statsPart": {
|
||
"morning": "morning",
|
||
"midday": "midday",
|
||
"evening": "evening"
|
||
}
|
||
}
|
||
},
|
||
"thresholds": {
|
||
"defaultLabel": "Default",
|
||
"overrideToggleLabel": "Custom range",
|
||
"resetAction": "Reset to default",
|
||
"resetAllAction": "Reset all to default",
|
||
"resetAllTitle": "Reset every custom range?",
|
||
"resetAllBody": "Every metric goes back to its default range. The values you set are not stored anywhere else and cannot be brought back.",
|
||
"resetAllConfirm": "Reset all",
|
||
"resetTitle": "Reset this range?",
|
||
"resetBody": "The metric goes back to its default range. The values you set are not stored anywhere else and cannot be brought back.",
|
||
"resetConfirm": "Reset range",
|
||
"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.",
|
||
"cardTitle": "Ranges per metric"
|
||
},
|
||
"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",
|
||
"steps": {
|
||
"dashboardOverview": {
|
||
"title": "Your dashboard",
|
||
"body": "The dashboard pulls every module together at a glance. Long-press a tile to reorder or hide it (Settings → Dashboard layout). Each tile is only as telling as the data behind it, and the modules ahead fill them."
|
||
},
|
||
"quickAdd": {
|
||
"title": "Logged in seconds",
|
||
"body": "Use “+ Add” to log any reading in seconds: weight, blood pressure, pulse, glucose. Hidden strength: backdate readings you forgot to enter. Everything you log here feeds trends, the health score, and the AI insights."
|
||
},
|
||
"measurements": {
|
||
"title": "Readings & target ranges",
|
||
"body": "Measurements shows the history and target range for each metric. Hidden gem: set a target range per value so deviations stand out in colour. These series are the basis for the Coach’s correlations and the doctor report."
|
||
},
|
||
"medications": {
|
||
"title": "Medications & intakes",
|
||
"body": "Medications manages schedules, intakes, stock, and titration. Hidden: recurring plans (RRULE/rolling) and low-stock warnings. Your intake rate feeds the adherence pillar on the dashboard and the AI’s context."
|
||
},
|
||
"labs": {
|
||
"title": "Lab values",
|
||
"body": "Labs captures biomarkers with reference ranges: blood count, cholesterol, HbA1c. Strength: import and FHIR export. Out-of-range lab values resurface as evidence in the insights and the doctor report."
|
||
},
|
||
"illness": {
|
||
"title": "Illness journal",
|
||
"body": "The illness journal records acute episodes and chronic diagnoses with their flares. Hidden: correlate an episode with your readings, and Rest Mode that pauses reminders. That’s how the Coach understands why values drift for a while."
|
||
},
|
||
"vorsorge": {
|
||
"title": "Checkups",
|
||
"body": "Checkups remind you of screenings and vaccinations on their own interval. Tip: “Done” can create a reading or a lab result directly. Due items appear as reminders and in the doctor report."
|
||
},
|
||
"cycle": {
|
||
"title": "Cycle",
|
||
"body": "Cycle tracking logs phases and symptoms. Hidden: compare symptoms against mood and sleep. The cycle gives context for swings that would otherwise look unexplained."
|
||
},
|
||
"mood": {
|
||
"title": "Mood",
|
||
"body": "Mood captures how you feel plus tags in two seconds. Strength: your own tags. Mood trends correlate with sleep, medications, and cycle, and the Coach spots the patterns."
|
||
},
|
||
"insights": {
|
||
"title": "Insights",
|
||
"body": "Insights is the heart of it: evidence-based, dynamic analysis instead of generic tips. Every statement points at your real data. Hidden: the layout is customizable. Insights pulls together everything the modules above provide."
|
||
},
|
||
"coach": {
|
||
"title": "Coach",
|
||
"body": "The Coach answers questions about your data in a dialogue, using your history, medications, and lab values as context. Pick your AI provider yourself (your own key or local). It recomputes nothing; it reads the same numbers as the dashboard."
|
||
},
|
||
"integrations": {
|
||
"title": "Integrations",
|
||
"body": "Integrations sync Withings, WHOOP, Polar, Oura, and Apple Health automatically. Weight, sleep, and recovery fill in without manual typing and feed the insights and Coach in turn."
|
||
},
|
||
"export": {
|
||
"title": "Doctor report",
|
||
"body": "The doctor report bundles readings, medications, lab values, and checkups as PDF or FHIR for the appointment. This is where every module converges: a complete report only comes from well-kept data."
|
||
},
|
||
"achievements": {
|
||
"title": "Achievements",
|
||
"body": "Achievements reward consistency: streaks and milestones. A small motivation loop that makes sticking with it easier."
|
||
},
|
||
"wrapUp": {
|
||
"title": "That’s the tour",
|
||
"body": "This walkthrough runs once and won't reopen on its own. Everything it covered stays put, and you can turn features on or off any time under Settings → Modules."
|
||
}
|
||
}
|
||
},
|
||
"shell": {
|
||
"back": "Back",
|
||
"skip": "Skip",
|
||
"next": "Continue",
|
||
"stepOf": "Step {current} of {total}",
|
||
"stepsLabel": "Setup steps"
|
||
},
|
||
"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)",
|
||
"heightLabelFtIn": "Height (ft, in)",
|
||
"genderLabel": "Gender",
|
||
"genderNone": "Prefer not to say",
|
||
"genderMale": "Male",
|
||
"genderFemale": "Female",
|
||
"genderOther": "Other",
|
||
"dateOfBirthLabel": "Date of birth",
|
||
"dateOfBirthHint": "Used only for age-aware analytics."
|
||
},
|
||
"done": {
|
||
"title": "You're all set",
|
||
"body": "Welcome aboard. Your dashboard is ready.",
|
||
"returnCta": "Open dashboard",
|
||
"learning": "Some insights (glucose, sleep rhythm, blood-pressure trends, cycle) sharpen over the first week or two as your data builds up. Empty tiles now just mean we're still learning your baseline.",
|
||
"connectCta": "Connect a device",
|
||
"logCta": "Log your first measurement",
|
||
"importCta": "Import existing history",
|
||
"modulesCta": "Choose your modules"
|
||
},
|
||
"welcomeBack": {
|
||
"title": "Welcome back",
|
||
"cta": "Open dashboard"
|
||
},
|
||
"disclaimer": {
|
||
"acknowledge": "I understand: HealthLog is a private tracking tool, not a clinical assessment or diagnosis. If I'm worried I'll talk to my doctor, not this app.",
|
||
"learnMore": "Learn more"
|
||
},
|
||
"anamnesis": {
|
||
"title": "About your health (optional)",
|
||
"subtitle": "A little context so HealthLog reads your numbers more fairly.",
|
||
"intro": "Share as much or as little as you like. Every field is optional and you can edit it anytime in Settings.",
|
||
"conditionsLabel": "Ongoing conditions",
|
||
"conditionsPlaceholder": "e.g. high blood pressure, type 2 diabetes",
|
||
"conditionsHint": "Helps HealthLog frame your readings in context rather than flagging the expected.",
|
||
"allergiesLabel": "Allergies or intolerances",
|
||
"allergiesPlaceholder": "e.g. penicillin, lactose",
|
||
"privacyNote": "Stored encrypted and used only to give you better context. We don't ask for your medications here. Add those anytime from the Medications page."
|
||
},
|
||
"ai": {
|
||
"panelTitle": "See what insights look like",
|
||
"panelIntro": "Coach, the daily briefing and the per-metric reads turn your own numbers into plain language. Here's the shape of it, before you connect anything.",
|
||
"showSample": "See a sample briefing",
|
||
"sampleTitle": "Daily Briefing",
|
||
"sampleTag": "Example",
|
||
"sampleAriaLabel": "Example daily briefing",
|
||
"sampleBody": "Weight down 1.2 kg over two weeks. Resting pulse steady at 58 bpm. Blood pressure in range on 6 of 7 days; the one high reading followed a late, salty dinner.",
|
||
"sampleCaption": "Example only, not your own data. This is what a briefing reads like once insights are on.",
|
||
"ladderTitle": "Three ways to turn it on",
|
||
"ladderLocalTitle": "Local model: AI requests stay on your network",
|
||
"ladderLocalBody": "Point HealthLog at Ollama or LM Studio on your own machine. Free and fully private, the calm default.",
|
||
"ladderByokTitle": "Bring your own key",
|
||
"ladderByokBody": "Use your own OpenAI or Anthropic key. It runs under your account and billing, and the API tier keeps your data out of training by default.",
|
||
"ladderOauthTitle": "Sign in with a subscription",
|
||
"ladderOauthBody": "Connect a ChatGPT account. No per-token cost, but the consumer tier's terms may use content for training, so it's a deliberate choice, never the default for your health data.",
|
||
"keylessLine": "HealthLog is fully useful without AI. Your tiles, charts, trends and exports all work. AI only adds the plain-language read on top.",
|
||
"setupCta": "Set it up (about a minute)",
|
||
"sharedKeyNote": "This instance already provides a shared AI provider, so insights work for you right now, no setup needed.",
|
||
"offer": {
|
||
"title": "This instance can write your summary in plain language.",
|
||
"body": "The operator provides a provider that last worked within the past 24 hours. One tap turns the plain-language read on; your data then goes to that one provider and to nobody else.",
|
||
"cta": "Turn on plain language",
|
||
"granted": "Turned on. The first summary appears on your dashboard.",
|
||
"error": "Turning it on did not work. Give it another try in a moment."
|
||
},
|
||
"unavailable": {
|
||
"title": "This instance’s provider is not answering right now.",
|
||
"body": "HealthLog is fully useful without the plain-language read. You can add a provider of your own later under Settings."
|
||
}
|
||
},
|
||
"steps": {
|
||
"who": "Who this record is for",
|
||
"areas": "What to keep an eye on",
|
||
"medication": "Medication",
|
||
"sources": "Where readings come from",
|
||
"visit": "Doctor's visit",
|
||
"units": "Units",
|
||
"confirm": "Confirm",
|
||
"first-result": "First result",
|
||
"done": "Done"
|
||
},
|
||
"flow": {
|
||
"welcome": {
|
||
"title": "Welcome to HealthLog",
|
||
"body": "Five short questions decide what HealthLog shows you first. It takes about two minutes.",
|
||
"changeLater": "Nothing is final: every choice can be changed later under Settings.",
|
||
"setUp": "Set up",
|
||
"skip": "Skip for now",
|
||
"againBody": "Your setup is finished. Answer the questions again to change what HealthLog shows first, or go to the dashboard.",
|
||
"setUpAgain": "Set up again"
|
||
},
|
||
"who": {
|
||
"title": "Who is this record for?",
|
||
"body": "The answers that follow apply to this record.",
|
||
"options": {
|
||
"me": "Me",
|
||
"someone-else": "Someone I look after",
|
||
"both": "Both"
|
||
},
|
||
"hints": {
|
||
"someone-else": "A child or a parent, for example. Their profile is created at the end.",
|
||
"both": "Set up your own record now; the profile for the other person is offered at the end."
|
||
}
|
||
},
|
||
"areas": {
|
||
"title": "What do you want to keep an eye on?",
|
||
"body": "Pick any number. These decide which modules are switched on and what the dashboard shows first.",
|
||
"options": {
|
||
"blood-pressure": "Blood pressure",
|
||
"weight-body": "Weight and body",
|
||
"glucose": "Blood glucose",
|
||
"sleep": "Sleep and recovery",
|
||
"mood": "Mood and mental wellbeing",
|
||
"cycle": "Cycle",
|
||
"activity": "Activity and workouts",
|
||
"labs": "Lab results",
|
||
"illness": "Illnesses and symptoms"
|
||
}
|
||
},
|
||
"medication": {
|
||
"title": "Do you take medication on a schedule?",
|
||
"body": "A schedule switches on the medication module and reminders.",
|
||
"options": {
|
||
"yes": "Yes",
|
||
"no": "No",
|
||
"sometimes": "Sometimes"
|
||
}
|
||
},
|
||
"sources": {
|
||
"title": "Where do your readings come from today?",
|
||
"body": "Pick any number. One connection is offered at the end; none is required.",
|
||
"options": {
|
||
"manual": "I type them in",
|
||
"apple-health": "Apple Health on my iPhone",
|
||
"withings": "Withings",
|
||
"oura": "Oura",
|
||
"whoop": "WHOOP",
|
||
"polar": "Polar",
|
||
"fitbit": "Fitbit",
|
||
"strava": "Strava",
|
||
"nightscout": "Nightscout",
|
||
"file": "A file I already have"
|
||
},
|
||
"hints": {
|
||
"apple-health": "Synced by the iOS app, or imported from an export.",
|
||
"file": "Imported under Settings once you are done here."
|
||
}
|
||
},
|
||
"visit": {
|
||
"title": "Is there a doctor's visit coming up?",
|
||
"body": "A visit switches on the doctor report and adds preparing for it to your checklist.",
|
||
"options": {
|
||
"within-a-month": "Yes, within a month",
|
||
"later": "Later",
|
||
"no": "No"
|
||
}
|
||
},
|
||
"units": {
|
||
"title": "Which units do you use?",
|
||
"body": "Readings are stored once and shown in the unit you choose. You can change it later under Settings.",
|
||
"glucoseLegend": "Blood glucose",
|
||
"weightLegend": "Weight and height",
|
||
"options": {
|
||
"metric": "kg and cm",
|
||
"imperial": "lb and ft/in"
|
||
}
|
||
},
|
||
"confirm": {
|
||
"title": "Here is what your answers switch on",
|
||
"body": "One look, then HealthLog is set up. Nothing here is final.",
|
||
"modulesTitle": "Modules",
|
||
"switchedOn": "Switched on: {modules}.",
|
||
"nothingExtra": "Your answers switch on no extra module; the core readings are always there.",
|
||
"alwaysOn": "Always on: {modules}, and the core readings (weight, blood pressure, pulse).",
|
||
"everythingElse": "Everything else stays one click away under",
|
||
"modulesLink": "Settings, Modules",
|
||
"switchesOff": "Out of the navigation: {modules}. You can switch any of them back on under Settings, Modules.",
|
||
"glucoseUnit": "Blood glucose",
|
||
"unitPreference": "Units",
|
||
"language": "Language",
|
||
"timezone": "Time zone",
|
||
"changeInSettings": "Change these under Settings, Account",
|
||
"cta": "Confirm and continue",
|
||
"managedTitle": "The person you look after",
|
||
"managedBody": "Their record has no login of its own; you look after it from your account. A second factor or a passkey on your account is required to create it.",
|
||
"managedCreate": "Create the profile and finish",
|
||
"managedLater": "You can also create it later under Settings, Shared access.",
|
||
"finishWithoutProfile": "Finish without the profile"
|
||
},
|
||
"first-result": {
|
||
"connect-source": {
|
||
"title": "Connect {target}",
|
||
"body": "One connection, chosen from your answers. Readings then arrive on their own.",
|
||
"howTo": "The connection to {target} is made on the integrations page. Come back here afterwards; this screen notices when it is done.",
|
||
"cta": "Connect {target}",
|
||
"checking": "Checking the connection.",
|
||
"waiting": "Not connected yet.",
|
||
"openSettings": "Open Settings → Integrations",
|
||
"noDate": "unknown",
|
||
"needsCredentials": {
|
||
"title": "This instance has no {target} app on file yet.",
|
||
"detail": "Enter your own credentials under Settings → Integrations, then the connection can start."
|
||
},
|
||
"state": {
|
||
"pending_first_sync": {
|
||
"title": "{target} is connected.",
|
||
"detail": "The first sync is in progress. Readings appear on the dashboard as they arrive."
|
||
},
|
||
"fresh": {
|
||
"title": "{target} is already connected.",
|
||
"detail": "Last reading {when}. Nothing left to do here."
|
||
},
|
||
"stale": {
|
||
"title": "{target} is connected, but nothing is arriving right now.",
|
||
"detail": "Last reading {when}. The connection itself is fine."
|
||
},
|
||
"stalled": {
|
||
"title": "{target} is connected, but it has stopped syncing.",
|
||
"detail": "Last attempt {when}. Check the connection under Settings → Integrations."
|
||
},
|
||
"failing": {
|
||
"title": "{target} is connected, but the sync keeps failing.",
|
||
"detail": "Nothing has come through since {when}. Check the connection under Settings → Integrations."
|
||
},
|
||
"reauth_required": {
|
||
"title": "The connection to {target} needs renewing.",
|
||
"detail": "Sign in once more and the readings carry on."
|
||
},
|
||
"parked": {
|
||
"title": "The connection to {target} is paused.",
|
||
"detail": "Check the connection under Settings → Integrations."
|
||
}
|
||
}
|
||
},
|
||
"add-medication": {
|
||
"title": "Add your first medication",
|
||
"body": "Name, dose and schedule; the reminder follows the schedule you set.",
|
||
"howTo": "The medication is added in a few short steps. You can add more later on the medications page.",
|
||
"cta": "Add a medication",
|
||
"done": "{name} is added.",
|
||
"doneUnnamed": "Your first medication is added.",
|
||
"nextDose": "Next dose: {when}.",
|
||
"reminders": "Reminders follow the schedule you set.",
|
||
"recordOnly": "Kept as a record: no reminders, nothing falls due.",
|
||
"asNeeded": "As needed: no reminders, log a dose when you take it."
|
||
},
|
||
"log-reading": {
|
||
"title": "Enter one reading: {target}",
|
||
"body": "One reading puts the first value on your dashboard. The trend draws itself from the fifth.",
|
||
"done": "Your first reading is on its tile.",
|
||
"doneElsewhere": "Your first entry for {target} is recorded.",
|
||
"elsewhere": "{target} has its own page. Open it, make the first entry, then come back and mark it done.",
|
||
"open": "Open {target}",
|
||
"markDone": "I have made the entry"
|
||
}
|
||
},
|
||
"done": {
|
||
"tourCta": "Take a short tour",
|
||
"openRecord": "Open the record of {name}",
|
||
"createProfile": "Create the profile for the person you look after"
|
||
}
|
||
}
|
||
},
|
||
"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 adherence and get reminders right when you need them.",
|
||
"medicationCta": "Add medication",
|
||
"dataSourceTitle": "Connect a data source (optional)",
|
||
"dataSourceDescription": "Auto-sync weight, BP, sleep and more from Withings, WHOOP, Oura, Polar, Nightscout, Fitbit or Apple Health.",
|
||
"dataSourceCta": "Connect",
|
||
"notificationsTitle": "Configure notifications",
|
||
"notificationsDescription": "Choose how HealthLog should remind you: Telegram, ntfy or Web Push.",
|
||
"notificationsCta": "Open notifications",
|
||
"insightsTitle": "Turn on insights (optional)",
|
||
"insightsDescription": "Add a local model or your own AI key to unlock the daily briefing and Coach.",
|
||
"insightsCta": "Turn on insights",
|
||
"visitTitle": "Prepare for the visit",
|
||
"visitDescription": "Put the appointment on the calendar; the doctor report bundles what to bring.",
|
||
"visitCta": "Open visits",
|
||
"dataSourceNamedTitle": "Connect {source}",
|
||
"managedProfileTitle": "Create the profile you look after",
|
||
"managedProfileDescription": "Your answers were given for another person's record; it is created under Shared access.",
|
||
"managedProfileCta": "Create the profile"
|
||
}
|
||
},
|
||
"trendHints": {
|
||
"title": "First trend after 5 readings",
|
||
"remainingOne": "1 more reading to go.",
|
||
"remainingMany": "{count} more readings to go."
|
||
},
|
||
"settings": {
|
||
"oauthCallbackPreflightItem": "{provider}: callback address {configuredOrigin} differs from this app address {currentOrigin}.",
|
||
"shell": {
|
||
"sectionsNav": "Settings sections",
|
||
"groups": {
|
||
"account": "Account",
|
||
"yourData": "Your data",
|
||
"healthProfile": "Health profile",
|
||
"ai": "AI",
|
||
"connectivity": "Connectivity",
|
||
"system": "System",
|
||
"tracking": "Tracking",
|
||
"arrangement": "Arrangement",
|
||
"notifications": "Notifications",
|
||
"connections": "Connections",
|
||
"data": "Data"
|
||
},
|
||
"allSections": "All sections"
|
||
},
|
||
"sharedRecord": {
|
||
"managedSettings": {
|
||
"saveError": "Couldn't save. Please try again.",
|
||
"validationError": "Please check your entries.",
|
||
"profile": {
|
||
"title": "Profile",
|
||
"displayName": "Display name",
|
||
"height": "Height (cm)",
|
||
"dateOfBirth": "Date of birth",
|
||
"gender": "Gender",
|
||
"notSpecified": "Not specified",
|
||
"male": "Male",
|
||
"female": "Female",
|
||
"other": "Other",
|
||
"locale": "Locale",
|
||
"systemDefault": "System default",
|
||
"timezone": "Timezone",
|
||
"units": "Units",
|
||
"metric": "Metric",
|
||
"imperial": "Imperial",
|
||
"timeFormat": "Time format",
|
||
"automatic": "Automatic",
|
||
"hour12": "12-hour",
|
||
"hour24": "24-hour",
|
||
"dateFormat": "Date format",
|
||
"dateDmy": "Day / month / year",
|
||
"dateMdy": "Month / day / year",
|
||
"dateYmd": "Year / month / day"
|
||
},
|
||
"modules": {
|
||
"title": "Modules"
|
||
},
|
||
"notifications": {
|
||
"title": "Notifications",
|
||
"moodReminder": "Enable mood reminder",
|
||
"reminderHour": "Mood reminder hour",
|
||
"lowStockRunwayDays": "Low-stock runway days",
|
||
"reorderLeadDays": "Reorder lead days"
|
||
},
|
||
"thresholds": {
|
||
"title": "Targets",
|
||
"metric": "Metric",
|
||
"minimum": "Minimum",
|
||
"maximum": "Maximum"
|
||
},
|
||
"coach": {
|
||
"title": "Coach",
|
||
"disable": "Disable Coach",
|
||
"tone": "Tone",
|
||
"warm": "Warm",
|
||
"neutral": "Neutral",
|
||
"concise": "Concise",
|
||
"verbosity": "Verbosity",
|
||
"brief": "Brief",
|
||
"default": "Default",
|
||
"detailed": "Detailed",
|
||
"excludedMetrics": "Excluded metrics",
|
||
"dataClusters": "Data clusters",
|
||
"customClusters": "Use a custom cluster selection",
|
||
"metrics": {
|
||
"bp": "Blood pressure",
|
||
"weight": "Weight",
|
||
"pulse": "Pulse",
|
||
"mood": "Mood",
|
||
"compliance": "Medication adherence",
|
||
"hrv": "Heart rate variability",
|
||
"sleep": "Sleep",
|
||
"restingHr": "Resting heart rate",
|
||
"steps": "Steps",
|
||
"medications": "Medications",
|
||
"anthropometrics": "Body measurements"
|
||
},
|
||
"clusters": {
|
||
"cardio": "Cardiovascular health",
|
||
"body": "Body composition",
|
||
"activity": "Activity",
|
||
"workouts": "Workouts",
|
||
"sleep": "Sleep",
|
||
"mood": "Mood",
|
||
"glucose": "Glucose",
|
||
"medication": "Medication",
|
||
"mobility": "Mobility",
|
||
"environment": "Environment"
|
||
}
|
||
},
|
||
"insights": {
|
||
"title": "Insights",
|
||
"sections": "Overview sections",
|
||
"tiles": "Navigation tiles",
|
||
"order": "Order",
|
||
"unknownItem": "Unavailable insight",
|
||
"sectionLabels": {
|
||
"wellnessScores": "Wellness scores",
|
||
"dailyBriefing": "Daily briefing",
|
||
"vitals": "Vitals",
|
||
"trends": "Trends",
|
||
"periodReview": "Period review",
|
||
"cycleSummary": "Cycle summary",
|
||
"signals": "Signals",
|
||
"rhythmEvents": "Rhythm events",
|
||
"healthStatus": "Health status",
|
||
"breathing": "Breathing",
|
||
"labsChanges": "Lab changes",
|
||
"ecg": "ECG"
|
||
}
|
||
}
|
||
},
|
||
"unavailableTitle": "Unavailable in this shared record",
|
||
"unavailableDescription": "This Settings area is intentionally unavailable while viewing another person's record.",
|
||
"integrationStatusDescription": "Connection status for this managed record.",
|
||
"integrationStatusDetail": "Services you connect here send their data to {name}'s record, not to yours. Without a provider app of its own, the profile uses yours.",
|
||
"integrationStatusDocs": "How sharing works",
|
||
"integrationConnectsFor": "Connects for {name}",
|
||
"integrationConnectFor": "Connect for {name}",
|
||
"integrationDisconnect": "Disconnect",
|
||
"integrationDisconnectTitle": "Disconnect {provider} from {name}?",
|
||
"integrationDisconnectBody": "New data stops arriving. Everything already imported stays in {name}'s record.",
|
||
"integrationNoClientApp": "Neither {name} nor your own account has a {provider} app yet. Set one up under your own integrations first.",
|
||
"integrationConnectFailed": "Could not start connecting {provider}."
|
||
},
|
||
"sections": {
|
||
"account": {
|
||
"title": "Account",
|
||
"subtitle": "Your profile, identity, and sign-in details."
|
||
},
|
||
"integrations": {
|
||
"title": "Integrations",
|
||
"subtitle": "Connect and manage your data sources and devices.",
|
||
"connectionsHeading": "Connections",
|
||
"channelsHeading": "Delivery channels",
|
||
"channelsDescription": "Where reminders and alerts are delivered.",
|
||
"matrixLink": "Per-channel notifications"
|
||
},
|
||
"notifications": {
|
||
"title": "Notifications",
|
||
"subtitle": "Choose which reminders you receive and where they're delivered.",
|
||
"remindersHeading": "Reminders",
|
||
"matrixLink": "Per-channel notifications",
|
||
"channelsLink": "Delivery channels",
|
||
"displayHeading": "On your phone",
|
||
"elsewhere": {
|
||
"title": "Set where they belong",
|
||
"description": "These reminders are set next to what they are about.",
|
||
"doses": {
|
||
"title": "Medication doses",
|
||
"description": "Each medication's dose times and reminders are set on the medication.",
|
||
"link": "Open medications"
|
||
},
|
||
"cycle": {
|
||
"title": "Cycle",
|
||
"description": "Period and fertile-window reminders are switched per channel in the notification matrix.",
|
||
"link": "Open the notification matrix"
|
||
}
|
||
}
|
||
},
|
||
"layout": {
|
||
"title": "Arrangement",
|
||
"backToHub": "Back to Arrangement",
|
||
"dashboard": {
|
||
"title": "Dashboard",
|
||
"description": "Tile layout and order."
|
||
},
|
||
"insights": {
|
||
"title": "Insights",
|
||
"description": "Overview sections and navigation-pill order."
|
||
},
|
||
"subtitle": "Choose the order and view of your dashboard, insights and tracking lists.",
|
||
"medications": {
|
||
"title": "Medications",
|
||
"description": "List view and manual order."
|
||
},
|
||
"labs": {
|
||
"title": "Labs",
|
||
"description": "View, sort, and manual order."
|
||
},
|
||
"illness": {
|
||
"title": "Illness journal",
|
||
"description": "List view and episode order."
|
||
},
|
||
"vorsorge": {
|
||
"title": "Checkups",
|
||
"description": "List view and reminder order."
|
||
},
|
||
"documents": {
|
||
"title": "Documents",
|
||
"description": "View and month arrangement."
|
||
}
|
||
},
|
||
"dashboard": {
|
||
"subtitle": "Arrange the tiles on your dashboard."
|
||
},
|
||
"thresholds": {
|
||
"title": "Targets",
|
||
"subtitle": "Set your personal target ranges per metric."
|
||
},
|
||
"sources": {
|
||
"title": "Source priority",
|
||
"integrationsHint": "Connect or disconnect data sources on the Integrations page.",
|
||
"integrationsHintLink": "Open integrations",
|
||
"cardTitle": "Ranking per metric",
|
||
"help": "When several sources deliver the same value on the same day, the top source counts as canonical.",
|
||
"resetDefaults": "Reset to defaults",
|
||
"resetDefaultsTitle": "Reset the source order?",
|
||
"resetDefaultsBody": "Every ladder you arranged goes back to the default order, for all metrics and device types at once. This is saved immediately and cannot be brought back.",
|
||
"resetDefaultsConfirm": "Reset order",
|
||
"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",
|
||
"skinTemperature": "Skin temperature",
|
||
"respiratoryRate": "Respiratory rate",
|
||
"recovery": "Recovery",
|
||
"stress": "Stress",
|
||
"sleepDebt": "Sleep debt",
|
||
"hrvRmssd": "HRV (RMSSD)",
|
||
"bodyBattery": "Body Battery",
|
||
"stressLevel": "Stress level",
|
||
"trainingReadiness": "Training readiness",
|
||
"acuteTrainingLoad": "Acute training load"
|
||
},
|
||
"sourceLabels": {
|
||
"WITHINGS": "Withings",
|
||
"APPLE_HEALTH": "Apple Health",
|
||
"MANUAL": "Manual entry",
|
||
"IMPORT": "Import",
|
||
"WHOOP": "WHOOP",
|
||
"FITBIT": "Fitbit",
|
||
"COMPUTED": "Computed",
|
||
"NIGHTSCOUT": "Nightscout",
|
||
"POLAR": "Polar",
|
||
"OURA": "Oura",
|
||
"TELEGRAM": "Telegram",
|
||
"MCP": "MCP",
|
||
"GOOGLE_HEALTH": "Google Health",
|
||
"STRAVA": "Strava",
|
||
"EXTERNAL": "External device",
|
||
"HEALTH_CONNECT": "Health Connect",
|
||
"GARMIN": "Garmin"
|
||
},
|
||
"deviceLabels": {
|
||
"watch": "Watch",
|
||
"band": "Band",
|
||
"ring": "Ring",
|
||
"phone": "Phone",
|
||
"scale": "Scale",
|
||
"other": "Other",
|
||
"unknown": "Unknown"
|
||
},
|
||
"subtitle": "Decide which source wins when two report the same metric.",
|
||
"nutrients": {
|
||
"title": "Synced nutrient intake",
|
||
"description": "Daily totals over the last {days} days: what Apple Health synced plus the supplements you took.",
|
||
"empty": "No nutrient data has been synced yet.",
|
||
"latest": "{amount} {unit} on {date}",
|
||
"daysWithData": "{count} of {days} days",
|
||
"moduleHint": "Syncing is controlled by the Nutrient intake module.",
|
||
"moduleHintLink": "Manage modules",
|
||
"detail": "Read-only: the source app owns the numbers."
|
||
},
|
||
"helpDetail": "The others stay stored for the audit trail. Only sources you have connected or hold data from are listed.",
|
||
"noneInUse": "No source to rank yet. Connect one under Integrations or record a value."
|
||
},
|
||
"ai": {
|
||
"title": "AI provider",
|
||
"subtitle": "Choose your AI provider and bring your own key."
|
||
},
|
||
"api": {
|
||
"title": "API & tokens",
|
||
"subtitle": "Manage API endpoints and access tokens."
|
||
},
|
||
"advanced": {
|
||
"title": "Advanced",
|
||
"subtitle": "Data reset and account deletion."
|
||
},
|
||
"export": {
|
||
"title": "Export & import",
|
||
"otherOptionsHeading": "Other export options",
|
||
"downloadFailed": "Couldn't download the export. Please try again.",
|
||
"actions": {
|
||
"download": "Download"
|
||
},
|
||
"filters": {
|
||
"since": "From",
|
||
"until": "Until"
|
||
},
|
||
"cards": {
|
||
"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": "Your whole record in one JSON file.",
|
||
"scopeNote": "Document metadata and the AI-generated summary, if one exists, are included as plain text; original document files and workout GPS/sample data are not. Download those separately from the vault or the workout export.",
|
||
"encryptToggle": "Encrypt with a passphrase",
|
||
"passphrasePlaceholder": "Passphrase (min. 12 characters)",
|
||
"passphraseHelp": "Derives the archive key with Argon2id and seals it with AES-256-GCM. Save the file with a .hlx extension.",
|
||
"noRecoveryWarning": "There is no recovery. If you lose this passphrase, the archive cannot be opened. Keep it somewhere safe.",
|
||
"detail": "A portable copy of your record for you to keep and read: values in plain JSON, documents as metadata only. It is not the weekly account copy this server keeps for rolling an account back, and it cannot recreate an account on another server. Some record types are not carried yet; the file's manifest names what is in it.",
|
||
"contents": "Your measurements, medications, mood, cycle, labs, illness episodes, allergies, family history, nutrients, workouts, health profile and custom metrics in one JSON file."
|
||
}
|
||
},
|
||
"import": {
|
||
"heading": "Import",
|
||
"description": "Bring data into HealthLog from an Apple Health export, a JSON file, or a CSV. Imports skip rows that already exist, so re-running one is safe.",
|
||
"charCount": "{used} / {max} characters",
|
||
"appleHealth": {
|
||
"title": "Apple Health",
|
||
"description": "Upload the export.zip from the Health app on iPhone (Profile → Export All Health Data).",
|
||
"dropLabel": "Drop export.zip here",
|
||
"dropHint": "or click to choose a file",
|
||
"fileInputLabel": "Choose an Apple Health export.zip file",
|
||
"choose": "Choose file",
|
||
"idempotencyNote": "Re-uploading the same archive merges it and creates no duplicates. Large archives are processed in the background.",
|
||
"uploading": "Uploading…",
|
||
"uploadFailed": "Upload failed. Please try again.",
|
||
"rateLimited": "Too many uploads. Please wait a moment and try again.",
|
||
"tooLarge": "That file is too large (limit 1.5 GB).",
|
||
"failed": "The import failed.",
|
||
"failureInterrupted": "The import was interrupted before it finished, usually by a server restart or an out-of-memory stop. Your data is safe; upload the export again to retry.",
|
||
"failureInsufficientMemory": "The server's memory limit is too low for an archive this size. Ask whoever runs the server to raise the Node.js heap limit (NODE_OPTIONS=--max-old-space-size), then upload the export again.",
|
||
"rowsImported": "{count} rows imported so far",
|
||
"doneSummary": "Done: {imported} of {read} records imported, {skipped} clinical records skipped.",
|
||
"doneNothing": "Nothing was imported from that archive: 0 of {read} records landed.",
|
||
"writtenByHealthLogOne": "{count} record that HealthLog wrote into Apple Health itself was left out, because it is already in your data.",
|
||
"writtenByHealthLogOther": "{count} records that HealthLog wrote into Apple Health itself were left out, because they are already in your data.",
|
||
"writtenByHealthLogFew": "{count} records that HealthLog wrote into Apple Health itself were left out, because they are already in your data.",
|
||
"ecgResult": "ECGs: {discovered} discovered, {imported} imported, {updated} updated, {skipped} skipped, {failed} failed. ECG failures do not discard supported records imported from export.xml.",
|
||
"estimateWarning": "Cumulative totals for {count} day(s) were estimated from the largest export source. Native Apple Health statistics remain authoritative.",
|
||
"phase": {
|
||
"queued": "Queued…",
|
||
"unpacking": "Unpacking the archive…",
|
||
"parsing": "Reading the export…",
|
||
"upserting": "Importing records…"
|
||
},
|
||
"skipUnsupported": "{count} samples skipped: data types HealthLog doesn't import.",
|
||
"skipRefused": "{count} samples couldn't be written (unreadable, out of range, or the save failed).",
|
||
"skipBreakdown": "Show breakdown ({count} types)",
|
||
"skipBreakdownMore": "+ {count} more types",
|
||
"cycleSummary": "{samples} cycle samples merged into {days} day logs.",
|
||
"cycleModuleOff": "{count} cycle samples skipped because cycle tracking is off for this account.",
|
||
"cycleDaysFailed": "{count} cycle days couldn't be written: {reason}"
|
||
},
|
||
"json": {
|
||
"title": "Measurements and mood (JSON)",
|
||
"description": "Paste JSON or upload a .json file with measurements and mood entries.",
|
||
"pasteLabel": "Paste JSON",
|
||
"fileInputLabel": "Choose a JSON file to import",
|
||
"schemaHint": "Two arrays: measurements and moodEntries.",
|
||
"docsLink": "See the schema and an example.",
|
||
"uploadFile": "Upload file",
|
||
"downloadExample": "Download example",
|
||
"import": "Import",
|
||
"invalidJson": "That isn't valid JSON. Check the syntax and try again.",
|
||
"invalidPayload": "The data doesn't match the import schema.",
|
||
"rateLimited": "Too many imports this hour (limit 5). Please try again later.",
|
||
"failed": "The import failed. Please try again.",
|
||
"readFailed": "Couldn't read that file.",
|
||
"resultSummary": "Imported {measurements} measurements and {moods} mood entries, {skipped} skipped.",
|
||
"resultSuccess": "Imported {measurements} measurements and {moods} mood entries",
|
||
"droppedLinks": "Imported without these tags, because this account has none by that name: {keys}",
|
||
"keptLabels": "This account already has tags or groups with these keys under its own names, so those were kept: {keys}",
|
||
"resultNothing": "Nothing was imported. All {skipped} entries were skipped.",
|
||
"resultEmpty": "That file carried no measurements and no mood entries.",
|
||
"limitsHint": "Up to {mb} MB and up to {rows} entries in each list. It adds entries to your record; it does not restore a full backup."
|
||
},
|
||
"csv": {
|
||
"title": "CSV file",
|
||
"description": "Import measurements from a spreadsheet or meter export.",
|
||
"pasteLabel": "Paste CSV",
|
||
"fileInputLabel": "Choose a CSV file to import",
|
||
"schemaHint": "Columns: type, value, unit, measuredAt (with timezone offset), and optional glucoseContext, notes, externalId.",
|
||
"docsLink": "See the column schema and an example.",
|
||
"uploadFile": "Upload file",
|
||
"downloadExample": "Download example",
|
||
"preview": "Preview",
|
||
"import": "Import",
|
||
"empty": "Add at least one CSV row before importing.",
|
||
"rateLimited": "Too many imports this hour (limit 5). Please try again later.",
|
||
"tooLarge": "That file is too large (limit 16 MB).",
|
||
"invalidPayload": "The CSV could not be parsed. Check the header row and try again.",
|
||
"failed": "The import failed. Please try again.",
|
||
"readFailed": "Couldn't read that file.",
|
||
"previewSummary": "Preview: {inserted} would import, {skipped} skipped.",
|
||
"resultSummary": "Imported {inserted} new and updated {updated}, {skipped} skipped.",
|
||
"rowError": "Line {line}: {reason}",
|
||
"resultSuccess": "Imported {inserted} new and updated {updated}",
|
||
"resultNothing": "Nothing was imported. All {skipped} rows were skipped.",
|
||
"resultEmpty": "That file has a header but no data rows.",
|
||
"previewSuccess": "Preview: {inserted} would import",
|
||
"previewNothing": "Preview: nothing would import. All {skipped} rows would be skipped.",
|
||
"skipGroupOne": "{count} row skipped: {reason}",
|
||
"skipGroupFew": "{count} rows skipped: {reason}",
|
||
"skipGroupOther": "{count} rows skipped: {reason}",
|
||
"skipDetails": "Show every skipped row",
|
||
"reasonUnknownType": "unknown measurement type",
|
||
"reasonInvalidValue": "value is not a number",
|
||
"reasonValueOutOfRange": "value outside the plausible range",
|
||
"reasonUnknownUnit": "unit not recognised for this type",
|
||
"reasonMissingTimezoneOffset": "timestamp has no timezone offset",
|
||
"reasonInvalidTimestamp": "timestamp could not be read",
|
||
"reasonImplausibleTimestamp": "timestamp is in the future or before 1900",
|
||
"reasonUnexpectedGlucoseContext": "glucose context set on a row that is not blood glucose",
|
||
"reasonInvalidGlucoseContext": "glucose context is not one of the allowed values",
|
||
"reasonNotesTooLong": "note is too long",
|
||
"reasonExternalIdTooLong": "external ID is too long",
|
||
"reasonUnstableExternalId": "external ID is not stable across exports",
|
||
"reasonDuplicate": "already imported",
|
||
"reasonUnknown": "skipped",
|
||
"detail": "One row per reading."
|
||
},
|
||
"doseHistory": {
|
||
"title": "Medication dose history",
|
||
"description": "A dose history exported from another medication tracker, read as it comes.",
|
||
"pasteLabel": "Paste the export",
|
||
"fileInputLabel": "Choose a dose-history export file",
|
||
"uploadFile": "Choose file",
|
||
"preview": "Preview",
|
||
"import": "Import",
|
||
"empty": "Paste the export or choose a file first.",
|
||
"readFailed": "That file could not be read.",
|
||
"rateLimited": "Maximum 5 imports per hour. Try again later.",
|
||
"tooLarge": "That file is over the 16 MB limit.",
|
||
"inProgress": "A dose-history import is already running. Wait for it to finish.",
|
||
"workerUnavailable": "The background worker is not available, so nothing was imported.",
|
||
"failed": "The import failed. Nothing was written.",
|
||
"columnsHeading": "What each column does",
|
||
"jsonOnly": "JSON only",
|
||
"previewLine": "{rows} rows read, {queued} would be imported, {refused} refused",
|
||
"submittedLine": "{rows} rows read, {queued} queued for import",
|
||
"unmatched": "No medication on record matches: {names}",
|
||
"ambiguous": "Matches more than one medication: {names}",
|
||
"mirrored": "Mirrored from another app, so no dose can be added: {names}",
|
||
"unknownColumns": "Columns the importer has no rule for, left unread: {names}",
|
||
"codingsNotRead": "Rows carrying a Codings value that was not read: {count}",
|
||
"archivedRowsPresent": "Rows marked as belonging to archived medications: {count}. That flag neither skips nor reactivates them; the final result says what was added.",
|
||
"verdict": {
|
||
"honoured": "used",
|
||
"reported": "reported",
|
||
"ignored": "not read"
|
||
},
|
||
"column": {
|
||
"date": "The time the dose was actually taken. Its UTC offset is read exactly as written.",
|
||
"scheduledDate": "The slot the dose belonged to, kept apart from the time it was taken. Empty means the dose belonged to no slot.",
|
||
"medication": "Matched against a medication already on your record. Nothing is created from the file.",
|
||
"nickname": "Tried as a second name when the first one matches nothing.",
|
||
"dosage": "Recorded on the dose only where it differs from the scheduled amount.",
|
||
"scheduledDosage": "Compared against the actual amount to decide whether that dose deviated. Never stored on its own.",
|
||
"unit": "Written with the amount, spelled as the file spells it. \"count\" means multiples of the configured dose.",
|
||
"status": "\"Taken\" becomes a dose and \"Skipped\" a deliberate skip. Any other value records no decision and the row is refused.",
|
||
"archived": "Counted and reported back. A dose that happened is not undone by archiving the medication afterwards.",
|
||
"codings": "The CSV gives this column no documented encoding, so it is left alone rather than guessed at. Populated cells are counted.",
|
||
"form": "Describes the medication, not the dose.",
|
||
"start": "The date you started the medication, not the time of this dose.",
|
||
"end": "The date you stopped the medication, not the time of this dose."
|
||
},
|
||
"fatal": {
|
||
"emptyFile": "That file holds no rows.",
|
||
"missingColumns": "That file is missing a column the importer needs: Date, Medication or Status.",
|
||
"unreadableJson": "That file is not valid JSON.",
|
||
"jsonNotAnArray": "That JSON holds no list of doses.",
|
||
"jsonNoIntakeTime": "The JSON export records when a dose was due but not when it was taken, and a scheduled time will not be written as if it were the take. Export the CSV instead, which carries both.",
|
||
"tooManyRows": "That file holds more rows than one import can take. Split it and import the parts."
|
||
},
|
||
"detail": "One file covers every medication in it."
|
||
},
|
||
"healthConnect": {
|
||
"title": "Health Connect export",
|
||
"description": "Import the ZIP file the Health Connect app on Android writes when you export your data.",
|
||
"choose": "Choose ZIP file",
|
||
"uploading": "Uploading…",
|
||
"uploadFailed": "The upload failed. Please try again.",
|
||
"tooLarge": "The file is larger than this server accepts.",
|
||
"doneSummary": "{count} values imported.",
|
||
"failed": "The import failed: {reason}",
|
||
"phase": {
|
||
"queued": "Waiting to start",
|
||
"unpacking": "Unpacking the file",
|
||
"parsing": "Reading the records",
|
||
"upserting": "Saving the values",
|
||
"done": "Finished",
|
||
"failed": "Failed"
|
||
},
|
||
"steps": {
|
||
"export": "On your Android phone, open Health Connect, go to Manage data, then Export and import, and start an export.",
|
||
"cloud": "Health Connect only saves the export to a cloud storage app such as Google Drive, Dropbox or Nextcloud, never to the phone itself. Pick one there.",
|
||
"upload": "Download the ZIP file from that cloud to this device and upload it here."
|
||
},
|
||
"dropLabel": "Drop the Health Connect ZIP here",
|
||
"dropHint": "or click to choose it. Up to 1 GB.",
|
||
"fileInputLabel": "Health Connect export ZIP file",
|
||
"privacyNote": "The file is deleted from the server as soon as the import ends. Records from apps you already connect directly, such as Withings or Fitbit, are left out so nothing arrives twice. Uploading the same file again changes nothing.",
|
||
"rateLimited": "Too many uploads in a short time. Wait a minute and try again.",
|
||
"busy": "An import is already running for your account. Wait until it has finished.",
|
||
"rowsSoFar": "{count} values saved so far",
|
||
"doneNothing": "The import finished, but there was nothing new to add.",
|
||
"workouts": "Workouts",
|
||
"leftOutConnected": "{count} records from apps you already connect directly were left out.",
|
||
"nutrientsModuleOff": "Water and nutrient totals were not imported because the Nutrients module is switched off.",
|
||
"cycleModuleOff": "Period data was not imported because cycle tracking is switched off.",
|
||
"failure": {
|
||
"unsupportedVersion": "This Health Connect export is too old to read. Update Health Connect on the phone and export again.",
|
||
"notHealthConnect": "This file is not a Health Connect export. Choose the ZIP file Health Connect saved.",
|
||
"unsafeSchema": "This file does not have the structure of a Health Connect export and was not read.",
|
||
"tooLarge": "The export is larger than this server accepts.",
|
||
"stagingMissing": "The uploaded file was no longer on the server. Upload it again.",
|
||
"interrupted": "The import was interrupted by a server restart. Upload the file again."
|
||
}
|
||
}
|
||
},
|
||
"subtitle": "Export your data, or import measurements and records from other apps and files."
|
||
},
|
||
"about": {
|
||
"title": "About this app",
|
||
"subtitle": "Version, license, and project links."
|
||
},
|
||
"sharing": {
|
||
"title": "Sharing",
|
||
"subtitle": "Share read-only access to your data."
|
||
},
|
||
"insights": {
|
||
"subtitle": "Arrange your overview sections and chip order."
|
||
},
|
||
"medications": {
|
||
"subtitle": "Manage your medication list view and order."
|
||
},
|
||
"mood": {
|
||
"subtitle": "Organize your mood tags, groups, and picker order."
|
||
},
|
||
"labs": {
|
||
"subtitle": "Manage the view, sort order, and biomarkers."
|
||
},
|
||
"illness": {
|
||
"subtitle": "Manage the view and order of episodes."
|
||
},
|
||
"vorsorge": {
|
||
"subtitle": "Manage the view, order, and individual reminders."
|
||
},
|
||
"modules": {
|
||
"title": "Modules",
|
||
"saved": "Saved",
|
||
"error": "Couldn't save. Please try again.",
|
||
"toggleable": {
|
||
"title": "What you track",
|
||
"description": "Disabled modules drop out of the navigation, tiles and insights, while your data stays untouched."
|
||
},
|
||
"manageIn": "Manage in {section}",
|
||
"operatorDisabled": "Disabled server-wide",
|
||
"subtitle": "Choose which tracking areas HealthLog shows across the app.",
|
||
"backToHub": "Back to Modules",
|
||
"openModuleSettings": "Module settings",
|
||
"pages": {
|
||
"medications": {
|
||
"title": "Medications",
|
||
"description": "Injection sites the rotation leaves out."
|
||
},
|
||
"mood": {
|
||
"title": "Mood tags",
|
||
"description": "Groups, your own tags and archived tags."
|
||
},
|
||
"labs": {
|
||
"title": "Labs",
|
||
"description": "Biomarkers and on-device text recognition for lab reports."
|
||
},
|
||
"arrangementTitle": "Order and view",
|
||
"arrangementDescription": "How this list is sorted and shown lives under Arrangement.",
|
||
"openArrangement": "Open in Arrangement",
|
||
"moduleSettingsTitle": "Module settings",
|
||
"moduleSettingsDescription": "Everything beyond order and view lives on the module's page under Modules."
|
||
}
|
||
},
|
||
"gesundheitsakte": {
|
||
"title": "Health record",
|
||
"subtitle": "Export a complete, clinician-ready health record."
|
||
},
|
||
"coach": {
|
||
"title": "Coach",
|
||
"subtitle": "Tune the Coach, its proactive nudges, and its memory."
|
||
},
|
||
"security": {
|
||
"title": "Security",
|
||
"subtitle": "Two-factor authentication, recovery codes, and passkeys."
|
||
},
|
||
"privacy": {
|
||
"title": "Data & privacy",
|
||
"subtitle": "Your data, retention, encryption, and account security in one place."
|
||
},
|
||
"mcp": {
|
||
"title": "MCP connector",
|
||
"subtitle": "Connect an external assistant to your own health data."
|
||
},
|
||
"anamnesis": {
|
||
"title": "Medical history",
|
||
"subtitle": "Your medical background, lifestyle, emergency details and what the AI may read."
|
||
},
|
||
"environment": {
|
||
"title": "Location & weather",
|
||
"subtitle": "Weather, daylight, and location context.",
|
||
"disabledHint": "Turn on the Environment module to set a home location and pull in daily weather and daylight.",
|
||
"searchPlaceholder": "Search for a city",
|
||
"search": "Search",
|
||
"searchError": "Could not search for that place.",
|
||
"use": "Use",
|
||
"select": "Select",
|
||
"saveError": "Could not save your change.",
|
||
"homeSaved": "Home location saved",
|
||
"travelAdded": "Location period added.",
|
||
"travelRemoved": "Location period removed.",
|
||
"backfillQueued": "Backfill queued.",
|
||
"backfillError": "Could not start the backfill.",
|
||
"startDate": "Start date",
|
||
"endDate": "End date",
|
||
"storedDays": "{count} days of weather stored.",
|
||
"home": {
|
||
"title": "Home location",
|
||
"description": "A coarse, city-level location, never a precise track. Weather and daylight are fetched for this place on days no location period applies, from the date you set it onward.",
|
||
"current": "Current: {label}",
|
||
"none": "No home location set yet.",
|
||
"since": "Weather tracked from {date} onward. Earlier days stay empty until you add a location period."
|
||
},
|
||
"travel": {
|
||
"title": "Location periods",
|
||
"description": "Add a place and a date range, such as a trip or a stretch of earlier history. The period overrides your home for the days it covers, so weather matches where you actually were. This is how you correct the past.",
|
||
"none": "No location periods yet.",
|
||
"add": "Add {label}",
|
||
"remove": "Remove location period",
|
||
"removeConfirmTitle": "Remove this trip?",
|
||
"removeConfirmBody": "Readings taken during it stay in your record; only the trip entry goes.",
|
||
"range": "{start} to {end}",
|
||
"suggestionsIntro": "Dawarich found days abroad that no period covers yet.",
|
||
"suggestionUse": "Use",
|
||
"suggestionDismiss": "Dismiss suggestion"
|
||
},
|
||
"backfill": {
|
||
"title": "Backfill past days",
|
||
"description": "Fetch and store weather for a past date range so older days join the correlations. The start defaults to your home's effective date; to reach further back, add a location period for that range first.",
|
||
"run": "Backfill"
|
||
},
|
||
"noResults": "No matching places found.",
|
||
"fetchFailedOne": "The last background weather update failed ({when}).",
|
||
"fetchFailedFew": "The last {count} background weather updates failed, most recently {when}.",
|
||
"fetchFailedOther": "The last {count} background weather updates failed, most recently {when}.",
|
||
"airQuality": {
|
||
"title": "Air quality and pollen",
|
||
"description": "Daily air quality, pollen and UV for your location, from the CAMS model via Open-Meteo.",
|
||
"toggle": "Include air quality and pollen",
|
||
"operatorDisabled": "Air quality is turned off on this server.",
|
||
"coverage": "{count} days with air-quality data",
|
||
"pollenEuropeOnly": "Pollen data covers Europe only.",
|
||
"historyProgress": "Backfilling air quality: {done} of {total} days",
|
||
"historyComplete": "Air quality is filled in for every earlier day with entries that the source covers ({total} days). Older days stay empty.",
|
||
"attribution": "Data sources and licences",
|
||
"saveError": "The setting could not be saved.",
|
||
"latest": "Newest day ({date})",
|
||
"modelNote": "Modelled outdoor values for your area, not your personal exposure."
|
||
}
|
||
},
|
||
"score": {
|
||
"title": "Health score",
|
||
"subtitle": "Choose which pillars count toward your score.",
|
||
"card": {
|
||
"title": "What counts toward your score",
|
||
"description": "Every pillar you record counts unless you say otherwise here."
|
||
},
|
||
"threeAxes": "Recording, showing and counting are three separate things. This page changes only the last one. A pillar you switch off here keeps being recorded and keeps appearing everywhere else in HealthLog, it just stops moving the number.",
|
||
"recommendation": "Three areas of health is the recommendation, not a requirement: a selection with at least one pillar saves. A narrower score is worked out the same way and says on the card how many areas it rests on.",
|
||
"axis": {
|
||
"countsFor": "Count {pillar} toward the score"
|
||
},
|
||
"state": {
|
||
"counting": "Counting toward your score",
|
||
"waiting": "Selected, waiting for data",
|
||
"crisis": "Safety guidance is shown instead of a score. Your selection is fine.",
|
||
"readFailed": "This pillar could not be read on the last run."
|
||
},
|
||
"presets": {
|
||
"label": "Start from",
|
||
"all": "All pillars",
|
||
"current": "Your saved selection"
|
||
},
|
||
"save": "Save",
|
||
"saved": "Saved",
|
||
"error": "Couldn't save. Please try again.",
|
||
"loadFailed": "Couldn't load your selection.",
|
||
"eligibilityFailed": "Couldn't check which pillars currently have data. The switches below still work.",
|
||
"omitted": "{count} pillars are not listed because their tracking is switched off. Turn a module back on and its pillar comes back.",
|
||
"omittedLink": "Open modules",
|
||
"refusal": {
|
||
"empty": "A health score needs at least one area of health to score. Keep one selected; the score will say which areas it is built from."
|
||
},
|
||
"notice": {
|
||
"upgrade": {
|
||
"title": "What counts is now yours to choose",
|
||
"body": "Which pillars counted toward your Health Score used to follow the modules you had switched on. It is a separate choice now, and this page is where you make it. Your number did not move when this arrived: it still counts exactly what it counted before."
|
||
},
|
||
"changed": {
|
||
"title": "You changed what counts",
|
||
"body": "Since {date} your score is worked out from a different set of pillars. Days before that were worked out from the old set, so the two are not compared and the weekly change stays paused until the comparison window is clear of the change. Each pillar's own history runs straight through it.",
|
||
"bodyUndated": "Your score is worked out from a different set of pillars than it used to be. Days before the change were worked out from the old set, so the two are not compared and the weekly change stays paused until the comparison window is clear of the change. Each pillar's own history runs straight through it."
|
||
},
|
||
"composition": {
|
||
"title": "What counts changed on its own",
|
||
"left": "No longer counting toward your score: {pillars}. The number moved for that reason, not because your health did.",
|
||
"joined": "Now counting toward your score: {pillars}."
|
||
},
|
||
"dismiss": "Got it",
|
||
"dismissError": "Couldn't save that. Please try again."
|
||
}
|
||
},
|
||
"access": {
|
||
"title": "Shared access",
|
||
"subtitle": "Who can open your health record, and whose you can open."
|
||
}
|
||
},
|
||
"profile": "Profile",
|
||
"language": "Language",
|
||
"languageDescription": "Choose the display language of the application.",
|
||
"timeFormat": {
|
||
"title": "Hour format",
|
||
"description": "Controls whether times render on the 24-hour or the 12-hour (AM/PM) clock.",
|
||
"auto": "Automatic (language)",
|
||
"h24": "24-hour",
|
||
"h12": "12-hour (AM/PM)",
|
||
"saved": "Hour format saved",
|
||
"saveError": "Saving the hour format failed."
|
||
},
|
||
"dateFormat": {
|
||
"title": "Date format",
|
||
"description": "Controls the order of day, month and year when dates are shown.",
|
||
"auto": "Automatic (language)",
|
||
"dmy": "DD.MM.YYYY",
|
||
"mdy": "MM/DD/YYYY",
|
||
"ymd": "YYYY-MM-DD",
|
||
"saved": "Date format saved",
|
||
"saveError": "Saving the date format failed."
|
||
},
|
||
"username": "Username",
|
||
"height": "Height (cm)",
|
||
"heightFtIn": "Height (ft, in)",
|
||
"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",
|
||
"profilePartiallySaved": "Profile saved, but {field} could not be updated.",
|
||
"profileNothingSaved": "Nothing was saved. Fix {field} and try again.",
|
||
"profileRejection": {
|
||
"tooBig": "That value is above the range this field accepts.",
|
||
"tooSmall": "That value is below the range this field accepts.",
|
||
"invalidValue": "That is not one of the answers this field accepts.",
|
||
"invalidFormat": "That is not written in a form this field can read.",
|
||
"invalidType": "That value did not arrive in a form this field can store.",
|
||
"rateLimited": "Changed too often. Wait a little and try again.",
|
||
"other": "This value was not accepted. Check it and try again.",
|
||
"reproofRequired": "Enter your current password to change the email address.",
|
||
"reproofFailed": "That password is not correct, so the email address was not changed.",
|
||
"secondFactorRequired": "Confirm with your second factor or a passkey to change the email address."
|
||
},
|
||
"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",
|
||
"removeTitle": "Remove the profile photo?",
|
||
"removeBody": "The image is deleted from your server and your initials take its place. You would need the original file to upload it again.",
|
||
"removeConfirm": "Remove photo",
|
||
"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.",
|
||
"currentPassword": "Current password",
|
||
"newPassword": "New password",
|
||
"confirmNewPassword": "Confirm new password",
|
||
"passwordMismatch": "New passwords do not match",
|
||
"passwordUpdated": "Password updated successfully",
|
||
"passkeys": "Passkeys",
|
||
"passkeysDescription": "Passkeys allow secure login without a password.",
|
||
"passkeyReauth": {
|
||
"title": "Confirm it's you",
|
||
"description": "Verify an existing sign-in method before adding a new passkey.",
|
||
"methodLabel": "Verification method",
|
||
"methods": {
|
||
"password": "Password",
|
||
"totp": "Authenticator code",
|
||
"passkey": "Passkey",
|
||
"webauthn": "Security key",
|
||
"oidc": "Identity provider"
|
||
},
|
||
"currentPassword": "Current password",
|
||
"authenticatorCode": "Authenticator code",
|
||
"authenticatorPlaceholder": "6-digit authenticator code",
|
||
"verifyAndAdd": "Verify and add",
|
||
"factorDescription": "Verify an existing sign-in method before adding a second factor.",
|
||
"verifyAndContinue": "Verify and continue",
|
||
"oidcHint": "You sign in once more at your identity provider and come straight back to this page. Then do what you were about to do again.",
|
||
"continueToProvider": "Continue to sign-in"
|
||
},
|
||
"passkeyName": "Name",
|
||
"noPasskeys": "No passkeys registered.",
|
||
"addPasskey": "Add passkey",
|
||
"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.",
|
||
"botToken": "Bot Token",
|
||
"chatId": "Chat ID",
|
||
"enableNotifications": "Enable notifications",
|
||
"telegramStep1": "Create a bot via @BotFather in Telegram and copy the token.",
|
||
"telegramStep2": "Send /start to your bot to activate the chat.",
|
||
"telegramStep3": "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.",
|
||
"webhook": "Webhook",
|
||
"webhookDescription": "POST notifications to any URL: Discord, Slack, Gotify, Home Assistant, n8n, or any relay that takes JSON.",
|
||
"webhookEnable": "Enable webhook",
|
||
"webhookUrl": "Webhook URL",
|
||
"webhookUrlHint": "The full URL to POST to. An address on a private network needs approval from the server operator.",
|
||
"webhookHeaderName": "Header name (optional)",
|
||
"webhookHeaderValue": "Header value (optional)",
|
||
"webhookFormat": "Payload format",
|
||
"webhookFormatGeneric": "Generic JSON",
|
||
"webhookFormatGenericHint": "Paste a Discord or Slack webhook URL as it is. Home Assistant and n8n read the fields title, message, eventType and priority.",
|
||
"webhookFormatGotify": "Gotify",
|
||
"webhookFormatGotifyHint": "Use the URL ending in /message and put the application token in the header X-Gotify-Key.",
|
||
"email": "Email",
|
||
"emailDescription": "Receive alerts and reminders by email.",
|
||
"emailEnable": "Enable email",
|
||
"emailRecipient": "Recipient address",
|
||
"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",
|
||
"codexConnected": "ChatGPT connected successfully! Insights are now active.",
|
||
"codexDisconnected": "ChatGPT connection removed.",
|
||
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
|
||
"rawData": "Send detailed history",
|
||
"rawDataOnDescription": "Besides the summaries, the provider receives averages of your readings: per day for the last 90 days, per week for the year before, and per month back to 5 years, each with its date and number of readings. Single readings, your name and your email are not sent.",
|
||
"rawDataOffDescription": "Only summaries are sent: the latest value, averages, trends, minimum and maximum over fixed windows. No series of readings.",
|
||
"rawDataWarning": "Detailed history is on: every analysis also sends daily averages for the last 90 days, weekly averages for the year before, and monthly averages back to 5 years.",
|
||
"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)",
|
||
"localDescription": "Any OpenAI-compatible endpoint works here: a local model (Ollama, LM Studio) as well as a gateway such as LiteLLM, OpenRouter or vLLM. The base URL ends with /v1; the API key is optional.",
|
||
"savedPreview": "(saved {preview})",
|
||
"savedShort": "(saved)",
|
||
"saveCta": "Save",
|
||
"saved": "Saved",
|
||
"errorGeneric": "Error",
|
||
"providerChain": {
|
||
"types": {
|
||
"codex": "ChatGPT (Codex)",
|
||
"openai": "OpenAI (your key)",
|
||
"anthropic": "Anthropic (Claude)",
|
||
"local": "Local model",
|
||
"openai-compatible": "OpenAI-compatible gateway",
|
||
"admin-openai": "Admin OpenAI"
|
||
},
|
||
"title": "Fallback chain",
|
||
"description": "If the active provider fails, HealthLog tries the next enabled one in this order.",
|
||
"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",
|
||
"activeProviderLabel": "Set up a provider",
|
||
"providerSelect": {
|
||
"codex": "ChatGPT account (Codex)",
|
||
"openai": "OpenAI (your API key)",
|
||
"anthropic": "Anthropic (Claude)",
|
||
"local": "Local model (OpenAI-compatible)",
|
||
"openai-compatible": "OpenAI-compatible gateway",
|
||
"admin-openai": "Admin-provided OpenAI"
|
||
},
|
||
"compat": {
|
||
"description": "A first-class provider for any endpoint that speaks the OpenAI /v1/chat/completions API: LiteLLM, OpenRouter, vLLM or another gateway. The base URL ends with /v1, the API key is optional, and the model is whatever your gateway routes. Your OpenAI key never reaches this endpoint; this provider has its own.",
|
||
"keyLabel": "API key (optional)",
|
||
"modelHint": "The model name your gateway expects. Left blank, the model saved for your other providers is used; with neither set, this provider is skipped."
|
||
},
|
||
"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",
|
||
"disconnectTitle": "Disconnect ChatGPT?",
|
||
"disconnectBody": "The stored sign-in is dropped along with your cached insight text. Reconnecting means signing in through the device-code flow again.",
|
||
"disconnectConfirm": "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 the last fallback when no personal provider is configured. Nothing to configure here.",
|
||
"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.",
|
||
"testReasonBadRequest": "The provider rejected the request (HTTP {status}). The endpoint answered, so this is a request-shape or model-name problem, not connectivity.",
|
||
"testReasonUnreachable": "Could not reach the AI provider.",
|
||
"coachMemory": {
|
||
"title": "What the Coach remembers",
|
||
"description": "Durable facts you have told the Coach.",
|
||
"empty": "The Coach has not stored any facts yet. As you chat, it remembers durable details you share (your goals, conditions, preferences), and you can clear them here at any time.",
|
||
"learnedPrefix": "learned {when}",
|
||
"categoryPreference": "Preferences",
|
||
"categoryCondition": "Conditions",
|
||
"categoryGoal": "Goals",
|
||
"categoryConstraint": "Constraints",
|
||
"categoryContext": "Context",
|
||
"forgetAria": "Forget this fact",
|
||
"forgetTitle": "Forget this fact?",
|
||
"forgetBody": "The Coach stops using it from the next message on. There is no way to bring a forgotten fact back.",
|
||
"forgetConfirm": "Forget",
|
||
"forgetAll": "Forget everything",
|
||
"forgetAllConfirmTitle": "Forget everything the Coach remembers?",
|
||
"forgetAllConfirmBody": "This removes every stored fact. The Coach will start fresh the next time you chat. This cannot be undone.",
|
||
"forgetAllConfirmAction": "Forget everything",
|
||
"cancel": "Cancel",
|
||
"summaryNote": "The Coach may also keep a short rolling summary of each conversation. There is no per-item control for it; deleting a conversation removes its summary.",
|
||
"loadError": "Could not load what the Coach remembers.",
|
||
"forgotToast": "Fact forgotten.",
|
||
"forgotError": "Could not forget that fact. Please try again.",
|
||
"clearedToast": "Forgot {count} stored facts.",
|
||
"clearError": "Could not clear the stored facts. Please try again.",
|
||
"detail": "It uses these to keep its replies relevant. Remove anything you would rather it forgot.",
|
||
"categoryMedication": "Medications"
|
||
},
|
||
"coachReminders": {
|
||
"title": "Your reminders",
|
||
"description": "Things you asked the Coach to bring back later.",
|
||
"empty": "No reminders yet. Ask the Coach to remind you about something and it will appear here.",
|
||
"loadError": "Could not load your reminders.",
|
||
"dueHeading": "Due now",
|
||
"allHeading": "Saved",
|
||
"duePrefix": "due {when}",
|
||
"confirm": "Keep",
|
||
"markDone": "Done",
|
||
"dismiss": "Dismiss",
|
||
"deleteAria": "Delete this reminder",
|
||
"note": "Reminders are stored encrypted. Delete one any time and it is removed from what the Coach can see.",
|
||
"status": {
|
||
"proposed": "Suggested",
|
||
"active": "Saved",
|
||
"due": "Due",
|
||
"surfaced": "Surfaced",
|
||
"done": "Done",
|
||
"dismissed": "Dismissed"
|
||
},
|
||
"deleteConfirmTitle": "Delete this reminder?",
|
||
"deleteConfirmBody": "It stops being raised. Anything you have already recorded is untouched.",
|
||
"deleteConfirmAction": "Delete",
|
||
"detail": "Due ones show up here and on the Coach.",
|
||
"readOnlyNote": "The Coach is not available right now, but you can still read and delete your reminders."
|
||
},
|
||
"aboutMe": {
|
||
"title": "About me",
|
||
"description": "Personal context the Coach and the daily briefing read alongside your data.",
|
||
"placeholder": "E.g. shift work, vegetarian diet, knee injury, training for a half marathon…",
|
||
"charCount": "{used} / {max} characters",
|
||
"clear": "Clear",
|
||
"clearTitle": "Clear the about-me note?",
|
||
"clearBody": "This removes the free-text note only. Your allergies and intolerances stay exactly as they are.",
|
||
"clearConfirm": "Clear note",
|
||
"save": "Save",
|
||
"savedToast": "About-me note saved",
|
||
"clearedToast": "About-me note cleared.",
|
||
"saveError": "Could not save. Please try again.",
|
||
"loadError": "The note could not be loaded.",
|
||
"hint": "Passed to the Coach and the daily briefing as additional context. Leave empty to send nothing.",
|
||
"profileHint": "Age and gender come from your profile and are included automatically.",
|
||
"freeTextLabel": "About me (free text)",
|
||
"conditionsPlaceholder": "E.g. hypertension, type 2 diabetes…",
|
||
"allergiesPlaceholder": "E.g. lactose intolerance, penicillin allergy…",
|
||
"focusPlaceholder": "E.g. keep an eye on my blood pressure, motivate me to move more…",
|
||
"questionsTitle": "The Coach has follow-up questions",
|
||
"questionsOpenCoach": "Answer them in the Coach"
|
||
},
|
||
"responseTimeoutHeading": "Response timeout",
|
||
"responseTimeoutBody": "How long to wait for the AI to respond before giving up. Raise it for a local or self-hosted model that needs time to load on the first request. Left empty, a reply may take {seconds} s; the daily briefing allows up to {briefingSeconds} s.",
|
||
"responseTimeoutLabel": "Response timeout (seconds)",
|
||
"responseTimeoutPlaceholder": "Default ({seconds} s)",
|
||
"responseTimeoutInvalid": "Enter a number between 10 and 600 seconds.",
|
||
"autoRead": {
|
||
"title": "Read documents automatically with AI",
|
||
"subLabel": "Your AI provider reads and indexes each new document without a tap per document.",
|
||
"honesty": "When on, each document you upload is sent to your configured AI provider to be read, described, and indexed for search, with no per-document confirmation. Turning it on also reaches backwards: documents you have already uploaded that carry no summary yet are sent too, up to 200 each time you switch it on. This happens on the server and the document's contents leave this machine to that provider. If your configured provider is a subscription connection (a signed-in AI account rather than an API key), that provider's own data settings apply: subscription providers may use the content to improve their models, and no data-processing agreement covers it. Documents read by a self-hosted local model never leave your server. Off by default; turn it on only if you accept this trade for your documents.",
|
||
"confirm": "I understand, turn on",
|
||
"cancel": "Cancel",
|
||
"restingFrugal": "Paused at the frugal AI usage level: documents are read only when you ask."
|
||
},
|
||
"centralCodex": {
|
||
"title": "Use the server's shared AI access",
|
||
"subLabel": "Send AI requests through the server's shared connection, with your own providers as the fallback.",
|
||
"honesty": "The shared access is a single signed-in AI account the operator connected for everyone on this server, not your own key. Requests you make on it are trained on by the provider by default and no data-processing agreement covers them, the account's hourly and weekly limits are shared with every other user who opted in, and your own configured providers are still tried first. Turn it on only if you accept this trade.",
|
||
"confirm": "I understand, use connection",
|
||
"cancel": "Cancel"
|
||
},
|
||
"consent": {
|
||
"title": "AI consent",
|
||
"activeSince": "Given on {date}: your health data may be sent to the configured provider for the AI features.",
|
||
"withdraw": "Withdraw consent",
|
||
"confirmBody": "Unless another consent you gave still covers them, these stop straight away: the Coach and Insights where they use the AI access this server provides, and reading documents with an online model. On your own key or a local model, the Coach and Insights keep working. Unless another consent still covers Insights, the notes a model wrote for you are deleted: status notes, the daily briefing, model-written period summaries, arrival lines and workout notes. Your Coach conversations, what the Coach remembered, your plans and your document summaries stay, and you can read or delete them yourself.",
|
||
"confirmWithdraw": "Withdraw",
|
||
"grantError": "The consent could not be saved. Please try again.",
|
||
"error": "The withdrawal could not be saved. Please try again.",
|
||
"documentReading": {
|
||
"title": "Consent to reading documents",
|
||
"activeSince": "Given on {date}: documents, lab scans and medication text may go to your AI service for reading.",
|
||
"confirmBody": "Documents, lab report scans and medication descriptions are no longer sent for reading. Nothing you already have is deleted."
|
||
},
|
||
"activeSinceNamed": "Given on {date}: your health data may go to {providers} for the AI features.",
|
||
"activeUndated": "Given: your health data may be sent to the configured provider for the AI features.",
|
||
"request": {
|
||
"title": "Your agreement before AI starts",
|
||
"body": "AI on this server runs on a service the operator provides: {providers}. Nothing from your records goes there until you agree.",
|
||
"data": "Once you agree, HealthLog sends that service what the AI features need: readings such as weight, blood pressure, pulse, sleep and activity, your medications, mood, lab values and cycle entries if you keep them, what you write in your profile and to the Coach, and documents you choose to have read. The service uses it to write your daily briefing, the notes on your readings and the Coach's answers.",
|
||
"withdrawHint": "You can withdraw your agreement at any time in Settings, AI. Nothing more is sent from that moment on.",
|
||
"agree": "Agree",
|
||
"dismiss": "Not now"
|
||
}
|
||
},
|
||
"operatorOff": {
|
||
"allTitle": "AI is switched off on this server",
|
||
"allBody": "The person who runs this server has turned AI off. HealthLog keeps working with all your data; the features that need AI are simply not shown.",
|
||
"someTitle": "Some AI features are switched off on this server",
|
||
"someBody": "The person who runs this server has turned off: {switches}. Everything else, including all your data, works as usual.",
|
||
"testRefused": "AI is switched off on this server, so there is nothing to test.",
|
||
"autoRead": "Reading documents with AI is switched off on this server."
|
||
},
|
||
"coachConversations": {
|
||
"title": "Coach conversations",
|
||
"description": "Open a conversation to read it, or delete it.",
|
||
"more": "Show more",
|
||
"openAll": "Open all conversations"
|
||
},
|
||
"coachPlans": {
|
||
"title": "Coach plans",
|
||
"description": "The plans you agreed with the Coach, to read or remove.",
|
||
"open": "Open plans"
|
||
},
|
||
"reasoning": {
|
||
"label": "Reasoning",
|
||
"hint": "Reasoning models such as Gemma or Qwen think before they answer. Off leaves the whole answer budget for the answer itself.",
|
||
"options": {
|
||
"default": "Default",
|
||
"none": "Off",
|
||
"low": "Low",
|
||
"medium": "Medium",
|
||
"high": "High"
|
||
},
|
||
"coachNote": "In the Coach, the thinking depth from the Coach settings applies.",
|
||
"backgroundNote": "Background work such as the daily briefing does not use this setting: it thinks at Medium at most, lower when the operator sets a lower limit, and not at all on the Frugal usage level."
|
||
},
|
||
"providerCardDescription": "Set up each provider's key and model; the order below decides which one HealthLog asks first.",
|
||
"runtimeTitle": "Check and refresh",
|
||
"usage": {
|
||
"title": "AI usage",
|
||
"description": "How much AI work runs in the background for you, while the Coach stays the same at every level.",
|
||
"levels": {
|
||
"frugal": {
|
||
"label": "Frugal",
|
||
"hint": "Cards refresh at most once a day after a sync, a short daily briefing, documents are read only when you ask."
|
||
},
|
||
"standard": {
|
||
"label": "Standard",
|
||
"hint": "Cards refresh every few hours after a sync, the full daily briefing."
|
||
},
|
||
"full": {
|
||
"label": "Full",
|
||
"hint": "Cards refresh up to every hour after new data, as before this setting existed."
|
||
}
|
||
},
|
||
"limited": "Limited by the server operator.",
|
||
"estimate": "about {tokens} tokens a day, estimated",
|
||
"measured": "Measured: {tokens} tokens a day over the last {days} days, the Coach included. The figures per level are estimates.",
|
||
"noEstimate": "An estimate per level appears after three days of AI use.",
|
||
"capped": "You chose {choice}, which the server does not allow at the moment, so {level} applies. Your choice is kept.",
|
||
"followsDefault": "You follow the server default ({level}).",
|
||
"useDefault": "Use the server default ({level})",
|
||
"saveError": "The level could not be saved. Please try again."
|
||
},
|
||
"removeKey": {
|
||
"label": "Remove API key",
|
||
"title": "Remove the saved API key?",
|
||
"body": "HealthLog deletes the stored key and cannot recover it. Enter it again to keep using it.",
|
||
"confirm": "Remove API key",
|
||
"done": "API key removed.",
|
||
"failed": "Could not remove the API key."
|
||
}
|
||
},
|
||
"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."
|
||
},
|
||
"glucoseUnit": {
|
||
"title": "Blood glucose",
|
||
"description": "Which unit blood-glucose readings are shown in. Readings are stored the same way either way.",
|
||
"saved": "Glucose unit saved",
|
||
"saveError": "Could not save your glucose unit."
|
||
}
|
||
},
|
||
"withings": "Withings",
|
||
"withingsDescription": "Connect your Withings scale and blood-pressure monitor to sync weight, body composition, and blood pressure automatically.",
|
||
"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",
|
||
"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",
|
||
"syncOutcome": {
|
||
"empty": "Nothing new to import. Everything is up to date.",
|
||
"failed": "Nothing was saved. The next run retries it.",
|
||
"partial": "{count} measurements synchronized. Some data could not be saved; the next run retries it."
|
||
},
|
||
"withingsFullSyncResult": "{count} measurements fully synchronized",
|
||
"withingsSyncFailed": "Sync failed",
|
||
"withingsOauthConnected": "Withings connected. The first sync starts in the background.",
|
||
"withingsOauthFailed": "Withings connection failed",
|
||
"withingsOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"replay": "This confirmation link has already been used. Please start the connection again.",
|
||
"state": "The response from Withings did not match any open connection request. Please start the connection again.",
|
||
"expired": "The connection request expired. Start the connection again and complete the approval within a few minutes.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "Withings did not return an authorization code. Try again and allow access in the Withings dialog.",
|
||
"nocreds": "No Withings API credentials are stored. Save the client ID and client secret first, then connect again.",
|
||
"token": "The token exchange with Withings failed. Check the client ID and client secret and try again.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"already_linked": "This Withings account is already connected to another HealthLog profile. Sign in to Withings with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"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.",
|
||
"whoop": "WHOOP",
|
||
"whoopDescription": "Connect your WHOOP strap to sync recovery, sleep, strain, and workouts straight into HealthLog.",
|
||
"whoopCredentials": "API Credentials",
|
||
"whoopClientId": "Client ID",
|
||
"whoopClientSecret": "Client Secret",
|
||
"whoopCredentialsSaved": "Credentials saved",
|
||
"whoopCredentialsSavedPlaceholder": "Saved. Enter new to replace",
|
||
"whoopCredentialsSavedPlaceholderSecret": "Saved. Enter new to replace",
|
||
"whoopSaveCredentials": "Save",
|
||
"whoopSync": "Sync now",
|
||
"whoopFullSync": "Sync all data",
|
||
"whoopFullSyncTitle": "Full synchronization?",
|
||
"whoopFullSyncDescription": "All available WHOOP history will be fully synchronized. This may take some time depending on your history.",
|
||
"whoopSyncResult": "{count} measurements synchronized",
|
||
"whoopSyncFailed": "Sync failed",
|
||
"whoopSynchronize": "Synchronize",
|
||
"whoopDisconnect": "Disconnect",
|
||
"whoopDisconnectTitle": "Disconnect WHOOP?",
|
||
"whoopDisconnectDescription": "The connection to WHOOP will be disconnected. Previously synced data will be preserved.",
|
||
"whoopConnect": "Connect with WHOOP",
|
||
"whoopNoCredentials": "Please enter your API credentials above to connect WHOOP.",
|
||
"whoopOauthConnected": "WHOOP connected. The first sync starts in the background.",
|
||
"whoopOauthFailed": "WHOOP connection failed",
|
||
"whoopOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"state": "The response from WHOOP did not match any open connection request. Please start the connection again.",
|
||
"expired": "The connection request expired before it completed. Please start the connection again.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "WHOOP did not return an authorization code. Try again and allow access in the WHOOP dialog.",
|
||
"nocreds": "WHOOP is not configured. Add your WHOOP OAuth credentials above and try again.",
|
||
"token": "The token exchange with WHOOP failed. Please start the connection again.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"already_linked": "This WHOOP account is already connected to another HealthLog profile. Sign in to WHOOP with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"fitbit": "Fitbit",
|
||
"fitbitTag": "Fitbit & Pixel",
|
||
"fitbitDescription": "Connect Fitbit to sync your Fitbit and Pixel Watch vitals: weight, heart rate, and more.",
|
||
"fitbitExperimentalBadge": "Experimental",
|
||
"fitbitCredentials": "API Credentials",
|
||
"fitbitClientId": "Client ID",
|
||
"fitbitClientSecret": "Client Secret",
|
||
"fitbitCredentialsSaved": "Credentials saved",
|
||
"fitbitCredentialsSavedPlaceholder": "Saved. Enter new to replace",
|
||
"fitbitCredentialsSavedPlaceholderSecret": "Saved. Enter new to replace",
|
||
"fitbitSaveCredentials": "Save",
|
||
"fitbitSync": "Sync now",
|
||
"fitbitFullSync": "Sync all data",
|
||
"fitbitFullSyncTitle": "Full synchronization?",
|
||
"fitbitFullSyncDescription": "All available Fitbit history will be fully synchronized. This may take some time depending on your history.",
|
||
"fitbitSyncResult": "{count} measurements synchronized",
|
||
"fitbitSyncFailed": "Sync failed",
|
||
"fitbitSynchronize": "Synchronize",
|
||
"fitbitDisconnect": "Disconnect",
|
||
"fitbitDisconnectTitle": "Disconnect Fitbit?",
|
||
"fitbitDisconnectDescription": "The connection to Fitbit will be disconnected. Previously synced data will be preserved.",
|
||
"fitbitConnect": "Connect with Fitbit",
|
||
"fitbitNoCredentials": "Please enter your API credentials above to connect Fitbit.",
|
||
"fitbitOauthConnected": "Fitbit connected. The first sync starts in the background.",
|
||
"fitbitOauthFailed": "Fitbit connection failed",
|
||
"googleHealth": "Google Health",
|
||
"googleHealthTag": "Fitbit & Pixel",
|
||
"googleHealthBetaBadge": "Beta",
|
||
"googleHealthDescription": "Connect Fitbit, Pixel Watch and Fitbit Air through your Google account: weight, heart rate, sleep and activity. This replaces the classic Fitbit connection, which Google retires in September 2026.",
|
||
"googleHealthCredentials": "API Credentials",
|
||
"googleHealthClientId": "Client ID",
|
||
"googleHealthClientSecret": "Client Secret",
|
||
"googleHealthCredentialsSaved": "Credentials saved",
|
||
"googleHealthCredentialsSavedPlaceholder": "Saved. Enter new to replace",
|
||
"googleHealthCredentialsSavedPlaceholderSecret": "Saved. Enter new to replace",
|
||
"googleHealthSaveCredentials": "Save",
|
||
"googleHealthSync": "Sync now",
|
||
"googleHealthSyncCheckStatus": "Refresh status",
|
||
"googleHealthFullSync": "Sync all data",
|
||
"googleHealthFullSyncTitle": "Full synchronization?",
|
||
"googleHealthFullSyncDescription": "All available Google Health history will be fully synchronized. This may take some time depending on your history.",
|
||
"googleHealthSyncResult": "{count} measurements synchronized",
|
||
"googleHealthSyncFailed": "Sync failed",
|
||
"googleHealthSyncInProgress": "Sync in progress: {count} measurements saved, {completed} of {total} areas processed.",
|
||
"googleHealthResourceFailuresTitle": "These areas still need attention:",
|
||
"googleHealthResource": {
|
||
"workout": "Workouts",
|
||
"sleep": "Sleep",
|
||
"boundedMetrics": "Health measurements",
|
||
"activity": "Activity",
|
||
"heartRate": "Heart rate",
|
||
"other": "Other data"
|
||
},
|
||
"googleHealthReason": {
|
||
"collectionFailed": "Google could not provide this data. Try syncing again later.",
|
||
"tokenFailed": "The connection has expired. Reconnect Google Health.",
|
||
"upsertFailed": "The data could not be saved. Try syncing again.",
|
||
"rollupFailed": "The data was captured, but its summary is not updated yet. Try again later.",
|
||
"pageLimit": "Only part of the available history was processed. Another sync will continue it.",
|
||
"generic": "This area was not fully synchronized. Try again."
|
||
},
|
||
"googleHealthSynchronize": "Synchronize",
|
||
"googleHealthDisconnect": "Disconnect",
|
||
"googleHealthDisconnectTitle": "Disconnect Google Health?",
|
||
"googleHealthDisconnectDescription": "The connection to Google Health will be disconnected. Previously synced data will be preserved.",
|
||
"googleHealthConnect": "Connect with Google",
|
||
"googleHealthNoCredentials": "Please enter your API credentials above to connect Google Health.",
|
||
"googleHealthOauthConnected": "Google Health connected. The first sync starts in the background.",
|
||
"googleHealthOauthFailed": "Google Health connection failed",
|
||
"googleHealthOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"state": "The response from Google did not match any open connection request. Please start the connection again.",
|
||
"expired": "The connection request expired before it completed. Please start the connection again.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "Google did not return an authorization code. Try again and allow access in the Google dialog.",
|
||
"nocreds": "Google Health is not configured. Add your Google OAuth credentials above and try again.",
|
||
"token": "The token exchange with Google failed. Please start the connection again.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"already_linked": "This Google account is already connected to another HealthLog profile. Sign in to Google with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"fitbitOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"state": "The response from Fitbit did not match any open connection request. Please start the connection again.",
|
||
"expired": "The connection request expired before it completed. Please start the connection again.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "Fitbit did not return an authorization code. Try again and allow access in the Fitbit dialog.",
|
||
"nocreds": "Fitbit is not configured. Add your Fitbit OAuth credentials above and try again.",
|
||
"token": "The token exchange with Fitbit failed. Please start the connection again.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"retired": "Google has turned the Fitbit Web API off, so no new Fitbit connection can be made. Connect Google Health instead, which reads the same devices.",
|
||
"already_linked": "This Fitbit account is already connected to another HealthLog profile. Sign in to Fitbit with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"integrations": {
|
||
"withings": {
|
||
"plan": {
|
||
"link": "About the Withings API plans",
|
||
"items": {
|
||
"spo2": "SpO2",
|
||
"vascularAge": "vascular age",
|
||
"pulseWaveVelocity": "pulse wave velocity",
|
||
"vo2Max": "VO2 max",
|
||
"visceralFat": "visceral fat",
|
||
"skinTemperature": "skin temperature",
|
||
"ecg": "ECG and AFib",
|
||
"sleepScore": "sleep score",
|
||
"sleepHrv": "overnight HRV",
|
||
"sleepHeartRate": "overnight heart rate",
|
||
"sleepRespiratoryRate": "overnight breathing rate",
|
||
"sleepSpo2": "overnight SpO2",
|
||
"bodyTemperature": "body temperature",
|
||
"bodyFat": "body fat",
|
||
"fatMass": "fat mass",
|
||
"fatFreeMass": "fat-free mass",
|
||
"muscleMass": "muscle mass",
|
||
"bodyWater": "body water",
|
||
"boneMass": "bone mass",
|
||
"heartRate": "heart rate",
|
||
"bloodPressure": "blood pressure",
|
||
"weight": "weight"
|
||
}
|
||
}
|
||
},
|
||
"oura": {
|
||
"scope": {
|
||
"items": {
|
||
"vo2max": "VO2 max",
|
||
"cardio_age": "cardiovascular age",
|
||
"resilience": "resilience",
|
||
"workout": "workouts",
|
||
"heartrate": "heart rate"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"integrationPill": {
|
||
"justNow": "just now",
|
||
"minutesAgo": "{count} min ago",
|
||
"hoursAgo": "{count} h ago",
|
||
"daysAgo": "{count} d ago",
|
||
"resumeSuccess": "Integration resumed",
|
||
"resumeError": "Reconnect failed"
|
||
},
|
||
"integrationFreshness": {
|
||
"title": "Data received",
|
||
"summary": "{count} data types, newest {relative}",
|
||
"quiet": "{count} quiet",
|
||
"workouts": "Workouts",
|
||
"medicationDoses": "Medication doses"
|
||
},
|
||
"integrationFallback": {
|
||
"description": "Configured on this account without a settings card of its own."
|
||
},
|
||
"withingsViewData": "View your measurements",
|
||
"whoopViewData": "View your recovery",
|
||
"fitbitViewData": "View your sleep",
|
||
"googleHealthViewData": "View your steps",
|
||
"apiTokens": "API tokens",
|
||
"apiTokensDescription": "Review and revoke tokens for measurements, workouts, documents and medication intake.",
|
||
"measurementsToken": {
|
||
"title": "Measurement tokens",
|
||
"description": "Mint a token so a scale, a watch bridge or your home automation can add readings.",
|
||
"detail": "The token is shown once.",
|
||
"scopeNote": "It can only add new readings to your own record. It cannot read your data, change or delete anything, or create another token. Readings are marked as coming from an external device, so you can tell them apart later, and you can still correct them yourself.",
|
||
"createFailed": "The token could not be created. Please try again.",
|
||
"namePlaceholder": "Name, e.g. Home Assistant",
|
||
"appleHealth": {
|
||
"label": "Write readings to Apple Health",
|
||
"createHint": "The HealthLog app on your iPhone then adds this token's readings to Apple Health. You can change this later in the token list below.",
|
||
"toggleAria": "Write readings from {name} to Apple Health",
|
||
"updateFailed": "The Apple Health setting could not be changed. Please try again.",
|
||
"unattributed": "Readings sent before this setting existed can't be matched to a token, so they stay out of Apple Health."
|
||
}
|
||
},
|
||
"workoutsToken": {
|
||
"title": "Workout tokens",
|
||
"description": "Mint a token so a watch bridge or a sync script can add your workouts.",
|
||
"detail": "The token is shown once.",
|
||
"scopeNote": "It can only add new workouts to your own record. It cannot read your data, change or delete anything, or create another token. Workouts it adds are marked as coming from an external device, and when your phone recorded the same session, you see the phone's copy.",
|
||
"createFailed": "The token could not be created. Please try again.",
|
||
"namePlaceholder": "Name, e.g. Garmin"
|
||
},
|
||
"documentsToken": {
|
||
"title": "Document tokens",
|
||
"description": "Mint a token so Paperless-ngx, Papra or the import script can add documents to your vault.",
|
||
"detail": "The token is shown once.",
|
||
"scopeNote": "It can only add new documents to your own vault. It cannot list, open, download, change or delete anything, and it cannot create another token. What it gets back is whether a file was stored, not how you filed it.",
|
||
"createFailed": "The token could not be created. Please try again.",
|
||
"namePlaceholder": "Name, e.g. Paperless-ngx"
|
||
},
|
||
"tokenMintMovedDescription": "Tokens are issued where they apply: above for measurements, workouts and documents, or in a medication's own API endpoint for that one medication.",
|
||
"tokenCreated": "Token created. Copy it now! It won't be shown again.",
|
||
"tokenCopy": "Copy token",
|
||
"tokenCopied": "Token copied to clipboard",
|
||
"tokenCopyFailed": "Could not copy the token",
|
||
"tokenRevokeFailed": "Could not revoke the token. Please try again.",
|
||
"tokenRevoke": "Revoke token?",
|
||
"tokenRevokeAction": "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",
|
||
"dangerZone": "Delete all data",
|
||
"dangerZoneDescription": "Erases your whole health record and every integration connection.",
|
||
"dangerZoneConfirm": "Delete all data?",
|
||
"dangerZoneConfirmDescription": "This permanently deletes everything in your record: measurements, medications, mood entries, lab results, cycle entries, documents, AI conversations and every integration connection, together with everything derived from them and anything you deleted earlier. Share links you gave to a doctor stop working immediately. Your account stays, along with the credentials you sign in with and display settings such as language, timezone and units. This cannot be undone.",
|
||
"dangerZoneSuccess": "Your health record has been deleted. Your account and sign-in are unchanged.",
|
||
"dangerZoneDeleteFailed": "Deletion failed",
|
||
"finalDelete": "Delete permanently",
|
||
"deleteAccountCardTitle": "Delete account entirely",
|
||
"deleteAccountCardDescription": "Deletes your account along with passkeys, audit log, and sessions.",
|
||
"deleteAccountCta": "Delete account",
|
||
"deleteAccountConfirmTitle": "Delete account permanently?",
|
||
"deleteAccountConfirmTitleGrace": "Delete your account?",
|
||
"deleteAccountConfirmDescription": "Your account, all health data, passkeys, sessions, and audit entries will be permanently deleted. You will be signed out immediately after. Copies in this server's backups age out after their retention period.",
|
||
"deleteAccountSuccess": "Account deleted. Signing you out.",
|
||
"deleteAccountFailed": "Account could not be deleted",
|
||
"deleteAccountFinal": "Delete permanently",
|
||
"deleteAccountFinalGrace": "Delete account",
|
||
"saved": "Saved",
|
||
"savingError": "Error saving",
|
||
"about": {
|
||
"version": "App version",
|
||
"gitSha": "Build",
|
||
"builtAtLabel": "Built",
|
||
"license": "License",
|
||
"repository": "Source code",
|
||
"changelog": "Changelog",
|
||
"docs": "Documentation",
|
||
"credits": "Credits & data attributions",
|
||
"linksHeading": "Sources & docs",
|
||
"newerAvailable": "Newer version: {tag}",
|
||
"support": {
|
||
"title": "Support",
|
||
"description": "A summary for a bug report, without your name, email or health values.",
|
||
"copy": "Copy support info",
|
||
"copied": "Copied",
|
||
"copyFailed": "The support info could not be put together."
|
||
}
|
||
},
|
||
"testConnection": {
|
||
"test": "Test connection",
|
||
"saveFirst": "Save your changes first. Test uses the saved settings.",
|
||
"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",
|
||
"upstream_rejected": "The other end refused the message",
|
||
"connection_failed": "Connection failed",
|
||
"not_configured": "Not configured",
|
||
"url_not_public": "URL is not a public endpoint",
|
||
"private_origin_not_approved": "Private network target. The operator has to list this origin in NOTIFICATION_PRIVATE_ORIGINS",
|
||
"private_origin_not_grantable": "This address is link-local, a metadata or an unspecified address; no operator grant can open it. Use the address the relay listens on",
|
||
"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": "State of each channel; “Auto-disabled” means retries stopped after permanent errors.",
|
||
"emptyDescription": "Set up a channel under Settings › Integrations › Delivery channels.",
|
||
"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",
|
||
"emptyTitle": "No channels configured yet"
|
||
},
|
||
"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": "A complete record for your doctor: as a PDF, as FHIR, or both.",
|
||
"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",
|
||
"includeCharts": "Embed trend charts (PDF only)",
|
||
"fhirNote": "The structured output follows the FHIR R4 standard (ePA-compatible).",
|
||
"generate": "Generate",
|
||
"documentsLink": "Documents for this period",
|
||
"range30": "Last 30 days",
|
||
"rangeCustom": "Custom period",
|
||
"rangeCustomStart": "From",
|
||
"rangeCustomEnd": "To",
|
||
"errorGeneric": "The export could not be generated. Please try again.",
|
||
"errorRateLimit": "You have reached the export limit for this hour.",
|
||
"errorModuleDisabled": "The health record export is switched off for this account.",
|
||
"visitOffer": "An appointment is coming up on {when}: {what}.",
|
||
"visitOfferApplyWindow": "Use this window"
|
||
},
|
||
"globalExcludedInjectionSitesLabel": "Globally excluded injection sites",
|
||
"globalExcludedInjectionSitesHint": "Never offered and rejected when logging a dose, even if a medication prefers them.",
|
||
"sharing": {
|
||
"createTitle": "New share link",
|
||
"createDescription": "The link is read-only and time-boxed.",
|
||
"label": "Label",
|
||
"labelPlaceholder": "e.g. Dr. Smith, annual check-up",
|
||
"range": "Days of history",
|
||
"rangeHint": "How far back the shared window reaches.",
|
||
"expiry": "Expires in (days)",
|
||
"expiryHint": "At most {max} days.",
|
||
"expiryInvalid": "Expiry must be between 1 and {max} days.",
|
||
"create": "Create link",
|
||
"tokenCreated": "Share link created",
|
||
"copied": "Copied to clipboard",
|
||
"activeTitle": "Active links",
|
||
"noActive": "No active share links.",
|
||
"created": "Created",
|
||
"expires": "Expires",
|
||
"accessCount": "Views",
|
||
"revoke": "Revoke",
|
||
"revokeDescription": "Revoke this link immediately. Anyone holding it loses access at once. This cannot be undone.",
|
||
"statusActive": "Active",
|
||
"statusRevoked": "Revoked",
|
||
"statusExpired": "Expired",
|
||
"inactiveTitle": "Revoked and expired ({count})",
|
||
"shownOnce": "Shown once only. Capture the QR code and passphrase now; neither can be recovered later.",
|
||
"qrAlt": "QR code containing the share link and passphrase",
|
||
"linkLabel": "Link",
|
||
"passphraseLabel": "Passphrase",
|
||
"passphraseHint": "The recipient needs both the link and this passphrase. The QR code carries both.",
|
||
"copyLink": "Copy link",
|
||
"copyPassphrase": "Copy passphrase",
|
||
"protected": "Passphrase",
|
||
"attachTitle": "Attach documents",
|
||
"attachButton": "Choose documents",
|
||
"attachCount": "{count} of {max} selected",
|
||
"attachFrozen": "The document set is fixed once you create the link. Documents can't be added or removed afterwards.",
|
||
"attachRemove": "Remove {title}",
|
||
"exifNote": "Camera metadata (EXIF/GPS) is removed from JPEG, PNG and WebP images when shared. PDF, TIFF, HEIC and Office files pass through unchanged.",
|
||
"documentCount": "Attached documents: {count}",
|
||
"qrScanTitle": "Scan to open on another device",
|
||
"qrScanHint": "Point a phone camera at the code to open the shared record. The passphrase is already included.",
|
||
"pickerTitle": "Attach documents",
|
||
"pickerDescription": "Search your vault and select documents to share. Up to {max}.",
|
||
"pickerSearch": "Search documents",
|
||
"pickerEmpty": "No documents found.",
|
||
"pickerDone": "Done",
|
||
"pickerSelectedCount": "{count} of {max} selected",
|
||
"pickerMaxReached": "You've reached the maximum of {max} documents.",
|
||
"scopeTitle": "What this link contains",
|
||
"scopeInsuranceExcluded": "Insurance details are never shared through a link.",
|
||
"statusNeedsReselect": "Pick contents again",
|
||
"reselectReason": "This link served a scope that was never chosen, so it was closed. Create a new one and pick what it should contain.",
|
||
"reselectAction": "Create a replacement",
|
||
"createDetail": "The token is shown once on creation. Store it then; it cannot be recovered.",
|
||
"activeDescription": "Links you have shared, when they expire and how often they were opened.",
|
||
"revokedToast": "Link revoked.",
|
||
"revokeFailed": "Could not revoke the link."
|
||
},
|
||
"genderOther": "Other",
|
||
"nightscout": "Nightscout",
|
||
"nightscoutTag": "CGM",
|
||
"nightscoutDescription": "Connect your own Nightscout site to sync continuous glucose readings into the glucose panel.",
|
||
"nightscoutViewData": "View your glucose",
|
||
"nightscoutUrl": "Nightscout URL",
|
||
"nightscoutUrlSavedPlaceholder": "Saved. Enter a new URL to replace it",
|
||
"nightscoutToken": "API token",
|
||
"nightscoutTokenOptional": "Optional for a public site",
|
||
"nightscoutTokenSavedPlaceholder": "Saved. Enter a new token to replace it",
|
||
"nightscoutTokenHelp": "Paste an access token from your Nightscout admin tools. Leave empty if your site is publicly readable.",
|
||
"nightscoutPrivateOperatorTitle": "Private Nightscout access requires server operator approval.",
|
||
"nightscoutPrivateOperatorDescription": "Ask your server operator to approve this exact Nightscout origin.",
|
||
"nightscoutConnect": "Connect",
|
||
"nightscoutUpdate": "Save changes",
|
||
"nightscoutConnected": "Nightscout connected.",
|
||
"nightscoutConnectFailed": "Could not connect to Nightscout.",
|
||
"nightscoutSync": "Sync now",
|
||
"nightscoutSyncResult": "{count} measurements synchronized",
|
||
"nightscoutSyncFailed": "Sync failed",
|
||
"nightscoutDisconnect": "Disconnect",
|
||
"nightscoutDisconnectTitle": "Disconnect Nightscout?",
|
||
"nightscoutDisconnectDescription": "Future syncs stop. Glucose readings already imported stay in your history.",
|
||
"polar": "Polar",
|
||
"polarDescription": "Connect your Polar account to sync Nightly Recharge recovery, sleep stages, daily activity, and training sessions.",
|
||
"polarViewData": "View your sleep & recovery",
|
||
"polarCredentials": "API Credentials",
|
||
"polarClientId": "Client ID",
|
||
"polarClientSecret": "Client Secret",
|
||
"polarCredentialsSaved": "Credentials saved",
|
||
"polarCredentialsSavedPlaceholder": "Saved. Enter new to replace",
|
||
"polarSaveCredentials": "Save",
|
||
"polarUnavailable": "Polar is not configured on this server. Add your own Polar OAuth credentials above, or ask your administrator to configure the shared app.",
|
||
"polarConnect": "Connect Polar",
|
||
"polarSync": "Sync now",
|
||
"polarSyncResult": "{count} measurements synchronized",
|
||
"polarSyncFailed": "Sync failed",
|
||
"polarDisconnect": "Disconnect",
|
||
"polarDisconnectTitle": "Disconnect Polar?",
|
||
"polarDisconnectDescription": "Future syncs stop. Readings already imported stay in your history.",
|
||
"polarOauthConnected": "Polar connected. The first sync starts in the background.",
|
||
"polarOauthFailed": "Polar connection failed",
|
||
"polarOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"state": "The response from Polar did not match any open connection request. Please start the connection again.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "Polar did not return an authorization code. Try again and allow access in the Polar dialog.",
|
||
"nocreds": "Polar is not configured on this server. Ask your administrator to add the Polar OAuth credentials.",
|
||
"token": "The token exchange with Polar failed. Please start the connection again.",
|
||
"rate_limited": "Too many connection attempts. Wait a moment and try again.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"already_linked": "This Polar account is already connected to another HealthLog profile. Sign in to Polar with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"oura": "Oura",
|
||
"ouraDescription": "Connect your Oura account to sync readiness, sleep stages, heart-rate variability, and daily activity.",
|
||
"ouraViewData": "View your sleep & recovery",
|
||
"ouraCredentials": "API Credentials",
|
||
"ouraClientId": "Client ID",
|
||
"ouraClientSecret": "Client Secret",
|
||
"ouraCredentialsSaved": "Credentials saved",
|
||
"ouraCredentialsSavedPlaceholder": "Saved. Enter new to replace",
|
||
"ouraSaveCredentials": "Save",
|
||
"ouraUnavailable": "Oura is not configured on this server. Add your own Oura OAuth credentials above, or ask your administrator to configure the shared app.",
|
||
"ouraConnect": "Connect Oura",
|
||
"ouraSync": "Sync now",
|
||
"ouraSyncResult": "{count} measurements synchronized",
|
||
"ouraSyncFailed": "Sync failed",
|
||
"ouraDisconnect": "Disconnect",
|
||
"ouraDisconnectTitle": "Disconnect Oura?",
|
||
"ouraDisconnectDescription": "Future syncs stop. Readings already imported stay in your history.",
|
||
"ouraOauthConnected": "Oura connected. The first sync starts in the background.",
|
||
"ouraOauthFailed": "Oura connection failed",
|
||
"ouraOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"state": "The response from Oura did not match any open connection request. Please start the connection again.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "Oura did not return an authorization code. Try again and allow access in the Oura dialog.",
|
||
"nocreds": "Oura is not configured on this server. Ask your administrator to add the Oura OAuth credentials.",
|
||
"token": "The token exchange with Oura failed. Please start the connection again.",
|
||
"rate_limited": "Too many connection attempts. Wait a moment and try again.",
|
||
"issuer": "The sign-in answer did not come from Oura's own authorization server, so the connection was stopped for your safety. Please start the connection again. If this keeps happening, tell your administrator.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"already_linked": "This Oura account is already connected to another HealthLog profile. Sign in to Oura with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"integrationSetupGuide": "Setup guide",
|
||
"coach": {
|
||
"memory": {
|
||
"edit": "Edit",
|
||
"source": {
|
||
"user": "from you",
|
||
"coach": "from the Coach"
|
||
}
|
||
},
|
||
"state": {
|
||
"title": "Coach",
|
||
"description": "Whether the Coach button and drawer show. The switch is in Modules."
|
||
},
|
||
"nudgesMoved": "Set with your other reminders under Notifications.",
|
||
"openNudges": "Open in Notifications"
|
||
},
|
||
"integrationRedirectGuide": {
|
||
"intro": "This connects through your own {provider} developer app, about 5 minutes to set up:",
|
||
"step1": "Create an app in the {provider} developer portal.",
|
||
"step2": "Set its redirect / callback URL to:",
|
||
"step3": "Paste the client ID and client secret it gives you above."
|
||
},
|
||
"security": {
|
||
"sessionsTitle": "Active sessions",
|
||
"sessionsDescription": "Devices and browsers currently signed in to your account.",
|
||
"sessionsLoadError": "Active sessions could not be loaded.",
|
||
"sessionsEmpty": "No active sessions.",
|
||
"currentSession": "This device",
|
||
"lastActive": "Last active {time}",
|
||
"unknownLocation": "Unknown location",
|
||
"revokeSession": "Sign out",
|
||
"revokeError": "Could not complete the request. Please try again.",
|
||
"signOutEverywhere": "Sign out everywhere else",
|
||
"signOutEverywhereDone": "Signed out {count} other session(s)",
|
||
"activityTitle": "Security activity",
|
||
"activityDescription": "Recent sign-ins, security changes, and data exports on your account.",
|
||
"activityEmpty": "No security activity yet.",
|
||
"activityLoadError": "Security activity could not be loaded.",
|
||
"action": {
|
||
"newDevice": "New-device sign-in",
|
||
"loginFailed": "Failed sign-in",
|
||
"login": "Sign-in",
|
||
"passwordChange": "Password changed",
|
||
"mfa": "Two-factor change",
|
||
"sessionRevoke": "Session signed out",
|
||
"token": "API token change",
|
||
"accountDelete": "Account deleted",
|
||
"dataClear": "Data reset",
|
||
"export": "Data export",
|
||
"other": "Security event"
|
||
},
|
||
"active": "Active",
|
||
"inactive": "Inactive",
|
||
"stepUpRequired": "For your security, sign in again to change your second factor.",
|
||
"useRecoveryCode": "Use a recovery code instead",
|
||
"useAuthenticator": "Use your authenticator app instead",
|
||
"totp": {
|
||
"title": "Authenticator app",
|
||
"description": "Use a time-based code from an authenticator app as your second factor.",
|
||
"setUp": "Set up",
|
||
"step1": "Scan the QR code with your authenticator app, or enter the secret manually.",
|
||
"step2": "Enter the 6-digit code the app shows to confirm.",
|
||
"qrAlt": "QR code for authenticator app setup",
|
||
"qrUnavailable": "QR code unavailable",
|
||
"manualEntry": "Or enter this secret manually",
|
||
"enterCode": "Enter the 6-digit code",
|
||
"verify": "Verify",
|
||
"setupFailed": "Could not start setup. Please try again.",
|
||
"invalidCode": "That code is not valid. Please try again.",
|
||
"disable": "Disable",
|
||
"disableTitle": "Disable two-factor authentication",
|
||
"disableConfirm": "Enter a current code to turn off your second factor. This also deletes your recovery codes.",
|
||
"currentCode": "Current code",
|
||
"disableFailed": "Could not disable the second factor."
|
||
},
|
||
"recovery": {
|
||
"saveNow": "Save these recovery codes now",
|
||
"saveNowHint": "Each code works once. They are shown only this time. Store them somewhere safe. If you lose your authenticator, a recovery code is the only way back in.",
|
||
"download": "Download",
|
||
"remainingOne": "{count} recovery code remaining.",
|
||
"remainingOther": "{count} recovery codes remaining.",
|
||
"regenerate": "Regenerate codes",
|
||
"regenFailed": "Could not regenerate recovery codes.",
|
||
"savedIt": "I've saved them",
|
||
"regenerateTitle": "Regenerate recovery codes?",
|
||
"regenerateConfirm": "This replaces your current recovery codes. Your existing codes will stop working immediately, and a new set is shown only once."
|
||
},
|
||
"keys": {
|
||
"title": "Security keys",
|
||
"description": "Register a hardware or platform security key as a second factor.",
|
||
"empty": "No security keys registered yet.",
|
||
"add": "Add security key",
|
||
"addFailed": "Could not register the security key.",
|
||
"rename": "Rename",
|
||
"renameFailed": "Could not rename the security key.",
|
||
"remove": "Remove security key",
|
||
"removeFailed": "Could not remove the security key.",
|
||
"removeConfirm": "This security key will no longer work as a second factor.",
|
||
"lastUsed": "Last used {date}",
|
||
"neverUsed": "Never used",
|
||
"added": "added {date}",
|
||
"nameLabel": "Security key name",
|
||
"addedToast": "Security key added.",
|
||
"removedToast": "Security key removed."
|
||
},
|
||
"passkeyNudge": {
|
||
"title": "Add a passkey for faster sign-in",
|
||
"body": "Passkeys let you sign in with your fingerprint, face, or device PIN, no password to remember."
|
||
},
|
||
"trustedDevices": {
|
||
"title": "Trusted devices",
|
||
"description": "Browsers you chose to trust skip the second factor for 30 days. The password is still required. Revoke any you don't recognize.",
|
||
"loadError": "Could not load trusted devices.",
|
||
"revokeError": "Could not revoke the device. Please try again.",
|
||
"revoke": "Revoke",
|
||
"revokeAll": "Forget all devices",
|
||
"revokeAllDone": "Forgot {count} trusted device(s)",
|
||
"unnamed": "Unknown device",
|
||
"current": "This device",
|
||
"expires": "Trusted until {date}",
|
||
"revokeConfirmTitle": "Stop trusting this device?",
|
||
"revokeConfirmBody": "It will ask for your second factor again the next time you sign in from it.",
|
||
"revokeAllConfirmTitle": "Stop trusting every device?",
|
||
"revokeAllConfirmBody": "Every device will ask for your second factor again the next time you sign in from it, including this one."
|
||
},
|
||
"revokeSessionConfirmTitle": "Sign this device out?",
|
||
"revokeSessionConfirmBody": "{device} will need to sign in again. Nothing recorded on it is affected.",
|
||
"signOutEverywhereConfirmTitle": "Sign out every other device?",
|
||
"signOutEverywhereConfirmBody": "Every other device, every connected AI assistant and every API token will need to sign in or be set up again. This device stays signed in. Nothing you have recorded is affected.",
|
||
"signOutEverywhereShareLinks": "Also end the doctor share links",
|
||
"signOutEverywhereInvites": "Invitations to your record that nobody has accepted yet are withdrawn. People who already accepted keep their access; you can end it next.",
|
||
"signOutEverywhereInvitesDone": "Withdrew {count} invitation(s) nobody had accepted.",
|
||
"grantsKeptTitle": "These people can still see your record",
|
||
"grantsKeptBody": "Signing out does not end access you gave someone. End it here if you did not give it, or no longer want them to have it."
|
||
},
|
||
"privacy": {
|
||
"encryption": {
|
||
"title": "Encrypted at rest",
|
||
"summary": "Your sensitive data is encrypted at rest with {algorithm} across {columns} fields in {models} record types.",
|
||
"statement": "Your sensitive data is encrypted at rest with AES-256-GCM."
|
||
},
|
||
"stored": {
|
||
"title": "What's stored",
|
||
"measurements": "Measurements: weight, blood pressure, pulse and every other value you or a device record",
|
||
"integrations": "Integration tokens (encrypted)",
|
||
"security": "Account and security activity (sessions, sign-in log)",
|
||
"profile": "Your profile, medical history and health-record details",
|
||
"modules": "Records of each module: {list}"
|
||
},
|
||
"workoutRoutes": {
|
||
"title": "Workout routes",
|
||
"description": "Keep the GPS track of new workouts from the iPhone app and the Apple Health export.",
|
||
"detail": "Off for new accounts. A route shows where you live, work and train, so it is only kept once you turn this on. Workouts are kept either way, and no AI feature ever reads a route. Turning it off stops new routes; routes already kept stay until you delete the workout.",
|
||
"loadError": "The route setting could not be loaded."
|
||
},
|
||
"retention": {
|
||
"title": "Retention",
|
||
"description": "How long time-bound records are kept before automatic cleanup.",
|
||
"coach": "Coach conversations: kept {days} days",
|
||
"audit": "Security activity log: kept {days} days",
|
||
"delivery": "Notification delivery log: kept {days} days",
|
||
"unavailable": "Retention details are unavailable right now.",
|
||
"accountDeletion": "Deleting your account, a managed profile or all data: completed after {days} days",
|
||
"accountDeletionImmediate": "Deleting your account, a managed profile or all data: completed immediately"
|
||
},
|
||
"delete": {
|
||
"title": "Delete or reset",
|
||
"description": "Remove your account entirely, or wipe your health records while keeping the account.",
|
||
"openAdvanced": "Delete or reset",
|
||
"immediateNotice": "Deletion removes your data immediately. If this server keeps encrypted off-host backups, the copies of your data are deleted from that storage right after, or on the next nightly run if the storage is unreachable. Copies in this server's backups age out after their retention period.",
|
||
"graceNotice": "When you delete your account, it is locked immediately and erased after {days} days, together with every copy this server keeps of it, including encrypted off-host copies. Until then, an admin of this server can undo the deletion. Deleting all data works the same way: a copy of the record is kept for {days} days, so an admin can restore it. Copies in this server's backups age out after their retention period."
|
||
},
|
||
"posture": {
|
||
"title": "Privacy posture",
|
||
"description": "Control how much of your data is shared with AI features.",
|
||
"openAi": "AI privacy mode"
|
||
},
|
||
"sessions": {
|
||
"title": "Sessions and devices",
|
||
"description": "Where you are signed in, the devices that skip the second factor, and the security activity of your account.",
|
||
"open": "Open security"
|
||
}
|
||
},
|
||
"mcp": {
|
||
"enableTitle": "Remote MCP endpoint",
|
||
"enableDescription": "Let an MCP-capable assistant (Claude.ai, ChatGPT) read your health data over a scoped token.",
|
||
"endpointLabel": "Connector URL",
|
||
"connectDescription": "Paste this URL into your assistant's custom-connector setup, then authorize with the token below or sign in when prompted.",
|
||
"tokensTitle": "Connector tokens",
|
||
"tokensDescription": "Mint a token to connect an assistant, read-only unless you allow logging below.",
|
||
"scopeNote": "New tokens can only read your own records. Write access (health:write) is granted per token with the toggle below. A token can never reach admin functions.",
|
||
"writeScopeToggleLabel": "Allow logging (health:write)",
|
||
"writeScopeNote": "Adds the health:write scope so the assistant can log new measurements and mood entries to your account. Every write is confirmed first. The token still can't delete or edit existing entries, change medications, or reach REST or admin functions. Leave off for read-only access.",
|
||
"connectionsTitle": "Connected assistants",
|
||
"connectionsDescription": "Assistants you authorized through the sign-in flow.",
|
||
"noConnections": "No connected assistants.",
|
||
"connectionConnected": "Connected",
|
||
"connectionLastUsed": "Last used",
|
||
"connectionNeverUsed": "Never used",
|
||
"connectionRevoke": "Disconnect",
|
||
"connectionRevokeDescription": "This ends the assistant's access immediately and stops it from renewing. It will need to be re-authorized to reconnect.",
|
||
"connectionRevokeFailed": "Could not disconnect the assistant.",
|
||
"connectionsDetail": "Revoking a connection ends its access immediately, including its ability to refresh.",
|
||
"tokensDetail": "The token is shown once.",
|
||
"tokenNamePlaceholder": "Name, e.g. Claude Desktop",
|
||
"offKeepsTokens": "Switching it off pauses the endpoint. Your tokens and connections stay and work again once it is back on."
|
||
},
|
||
"strava": "Strava",
|
||
"stravaDescription": "Connect your Strava account to sync your activities into your workout history.",
|
||
"stravaViewData": "View your workouts",
|
||
"stravaCredentials": "API Credentials",
|
||
"stravaClientId": "Client ID",
|
||
"stravaClientSecret": "Client Secret",
|
||
"stravaCredentialsSaved": "Credentials saved",
|
||
"stravaCredentialsSavedPlaceholder": "Saved. Enter new to replace",
|
||
"stravaSaveCredentials": "Save",
|
||
"stravaUnavailable": "Strava is not configured on this server. Add your own Strava API credentials above, or ask your administrator to configure the shared app.",
|
||
"stravaConnect": "Connect Strava",
|
||
"stravaSync": "Sync now",
|
||
"stravaSyncResult": "{count} measurements synchronized",
|
||
"stravaSyncFailed": "Sync failed",
|
||
"stravaDisconnect": "Disconnect",
|
||
"stravaDisconnectTitle": "Disconnect Strava?",
|
||
"stravaDisconnectDescription": "Future syncs stop. Activities already imported stay in your history.",
|
||
"stravaOauthConnected": "Strava connected. The first sync starts in the background.",
|
||
"stravaOauthFailed": "Strava connection failed",
|
||
"stravaOauthError": {
|
||
"csrf1": "The security check failed because the browser cookie was missing. Please start the connection again in the same browser.",
|
||
"state": "The response from Strava did not match any open connection request. Please start the connection again.",
|
||
"cross_user": "The response belongs to a request from a different account. Please restart the connection from your own account.",
|
||
"nocode": "Strava did not return an authorization code. Try again and allow access in the Strava dialog.",
|
||
"nocreds": "Strava is not configured on this server. Ask your administrator to add the Strava API credentials.",
|
||
"token": "The token exchange with Strava failed. Please start the connection again.",
|
||
"rate_limited": "Too many connection attempts. Wait a moment and try again.",
|
||
"generic": "Unknown error while connecting. Please start the connection again.",
|
||
"already_linked": "This Strava account is already connected to another HealthLog profile. Sign in to Strava with the account that belongs to this profile, or disconnect it from the other profile first."
|
||
},
|
||
"appleHealth": {
|
||
"title": "Apple Health",
|
||
"description": "Live sync comes from the HealthLog iOS app, not from a web or OAuth connection.",
|
||
"status": {
|
||
"unavailable": "Apple Health status unavailable"
|
||
},
|
||
"setupTitle": "Turn on live sync",
|
||
"permissionStep": "In the HealthLog iOS app, open Settings → Apple Health and allow the health categories you want to share.",
|
||
"backgroundStep": "Keep Background App Refresh enabled. The app syncs new data automatically in the foreground and when iOS grants background time.",
|
||
"importNote": "Need older history or cannot use the iOS app? The Apple Health XML/ZIP upload is a one-shot fallback and does not enable live sync.",
|
||
"importAction": "Open one-shot import",
|
||
"progress": {
|
||
"title": "Sync progress",
|
||
"receivedLabel": "Records received",
|
||
"oldestLabel": "Oldest reading reached",
|
||
"flowing": "Data arrived within the last hour. The iPhone app is still delivering.",
|
||
"waiting": "Waiting for the iPhone app to send more data. Delivery continues when the app is open or when iOS grants it background time. A quiet stretch during the first big backfill is normal, not an error."
|
||
},
|
||
"delivery": {
|
||
"title": "Delivery",
|
||
"lastTriggerLabel": "Latest sync arrived",
|
||
"lastBackgroundLabel": "Last background sync",
|
||
"backgroundNever": "Never: every sync so far arrived with the app open",
|
||
"noSyncYet": "No sync has arrived yet, so there is nothing to report here.",
|
||
"trigger": {
|
||
"foreground": "with the app open",
|
||
"background": "in the background",
|
||
"push": "from a push wake",
|
||
"unknown": "trigger not reported by the app",
|
||
"manual": "from Sync all"
|
||
}
|
||
},
|
||
"freshness": {
|
||
"title": "By data type",
|
||
"lastReceived": "Last received {relative}",
|
||
"lastNewValue": "Last new value {relative}",
|
||
"lastBackground": "Last in background {relative}",
|
||
"lastDuplicate": "Last re-sent with nothing new {relative}",
|
||
"never": "Not received yet",
|
||
"lastBackfill": "History caught up {relative}",
|
||
"lastEnteredHere": "Last entered here {relative}"
|
||
}
|
||
},
|
||
"glucoseReference": {
|
||
"title": "Glucose reference band",
|
||
"description": "Which band your blood-glucose readings are judged against.",
|
||
"enable": "Use the diabetes goal band",
|
||
"explainer": "Off, readings are judged against the general non-diabetic reference band. On, they are judged against the tighter glycaemic goal band from the ADA Standards of Care, and the Coach grounds its glucose remarks on that band instead. Your own target overrides below still take precedence.",
|
||
"disclaimer": "This selects a reference band. It is not a diagnosis, it is never inferred from a reading, and the app takes no clinical action on it. Which targets apply to you is a question for your clinician.",
|
||
"error": "Could not save the setting."
|
||
},
|
||
"dangerZoneDetail": "Your account and the credentials you sign in with are kept.",
|
||
"deleteAccountCardDetail": "This cannot be undone.",
|
||
"passkeyStepUpRequired": "For your security, sign in again before removing a passkey.",
|
||
"setup": {
|
||
"title": "Setup",
|
||
"description": "The questions that decide what HealthLog shows first, and the getting-started checklist on the dashboard.",
|
||
"setUpAgain": "Set up again",
|
||
"showChecklist": "Show the checklist again",
|
||
"checklistShown": "The checklist is back on the dashboard.",
|
||
"checklistNothingHidden": "The checklist was not hidden; it opens on the dashboard."
|
||
},
|
||
"documentSources": {
|
||
"title": "Document archives",
|
||
"description": "Search Paperless-ngx or Papra from HealthLog and import the documents you pick.",
|
||
"explainer": "An import button appears wherever you link documents: on a visit, a vaccination and a condition, and in Documents. HealthLog keeps its own encrypted copy of each document you import, and asks your archive only when you search or import.",
|
||
"systemLabel": "Archive",
|
||
"statusConnected": "Connected",
|
||
"statusNotConnected": "Not connected",
|
||
"connectedSince": "Connected, last checked {date}",
|
||
"originRemoved": "This address is no longer on the server's list of allowed archives. Ask the administrator, or save another address.",
|
||
"baseUrl": "Address",
|
||
"allowedOrigins": "Allowed on this server: {origins}",
|
||
"organizationId": "Organization id",
|
||
"organizationHelp": "The part after /organizations/ in the Papra address bar. Papra organization ids look like org_ followed by 24 letters and digits.",
|
||
"token": "API token",
|
||
"tokenSaved": "Saved for this address. Leave empty to keep it.",
|
||
"tokenHelpPaperless": "In Paperless-ngx: My Profile, API token.",
|
||
"tokenHelpPapra": "In Papra: an API key with documents:read and tags:read.",
|
||
"save": "Save and test",
|
||
"saving": "Testing…",
|
||
"saved": "Connected. The archive answered.",
|
||
"test": "Test",
|
||
"testOk": "The archive answered in {latency} ms.",
|
||
"disconnect": "Disconnect",
|
||
"disconnectTitle": "Disconnect {name}?",
|
||
"disconnectDescription": "HealthLog forgets the address and the token. Documents you already imported stay in HealthLog.",
|
||
"unavailableExplainer": "This server no longer allows document archives, so the connection below cannot be used. You can still remove it.",
|
||
"moduleOffExplainer": "Documents are switched off, so the connection below is not used. You can still remove it.",
|
||
"tokenNewAddress": "A new address needs the API token again."
|
||
},
|
||
"emailChangePassword": "Current password (needed to change the email address)",
|
||
"reproof": {
|
||
"description": "This shares or exports your health data. Confirm it's you to continue.",
|
||
"descriptionChange": "This changes something only you should be able to change. Confirm it's you to continue.",
|
||
"signInAgain": "Sign in again, then try once more. Your account has no password or passkey to confirm here.",
|
||
"failed": "That did not work. Check what you entered and try again.",
|
||
"oidcDone": "Confirmed. For the next five minutes you can go ahead without being asked again.",
|
||
"oidcFailed": "Your identity provider could not confirm it's you. Try again."
|
||
},
|
||
"passwordTitle": "Password",
|
||
"tokenNameLabel": "Token name",
|
||
"displayCard": {
|
||
"title": "Display",
|
||
"description": "Language, units and formats, saved as soon as you change them."
|
||
},
|
||
"integrationCard": {
|
||
"state": {
|
||
"ok": "Working",
|
||
"limited": "Limited",
|
||
"degraded": "Delayed",
|
||
"actionRequired": "Action needed"
|
||
},
|
||
"reason": {
|
||
"dataArriving": "Data is arriving.",
|
||
"dataArrivingHistory": "Data is arriving. Older history is loading in the background.",
|
||
"firstSyncPending": "Connected. The first sync runs shortly.",
|
||
"planLimited": "Data is arriving. Your {provider} plan does not include {list}.",
|
||
"permissionLimited": "Data is arriving. Permission is missing for {list}.",
|
||
"providerErrors": "{provider} has not answered reliably since {since}. HealthLog keeps trying; nothing to do on your side.",
|
||
"providerErrorsNoSince": "{provider} is not answering reliably right now. HealthLog keeps trying; nothing to do on your side.",
|
||
"syncStalled": "HealthLog has not synced since {since}. That is on the server, not your device.",
|
||
"syncStalledNoSince": "HealthLog is not syncing right now. That is on the server, not your device.",
|
||
"noNewData": "No new data since {since}.",
|
||
"noNewDataNoSince": "No new data for a while.",
|
||
"noNewDataApple": "No new data since {since}. Open HealthLog on your iPhone once.",
|
||
"noNewDataAppleNoSince": "No new data for a while. Open HealthLog on your iPhone once.",
|
||
"unexpectedSilence": "Nothing has arrived since {since}, although {provider} usually delivers daily.",
|
||
"unexpectedSilenceNoSince": "Nothing is arriving, although {provider} usually delivers daily.",
|
||
"reauthRequired": "The {provider} connection has expired. Reconnect to keep data coming.",
|
||
"pausedAfterErrors": "{provider} is paused after failing since {since}.",
|
||
"pausedAfterErrorsNoSince": "{provider} is paused after repeated failures."
|
||
},
|
||
"when": {
|
||
"today": "today, {time}",
|
||
"yesterday": "yesterday, {time}",
|
||
"date": "{date}, {time}"
|
||
},
|
||
"items": {
|
||
"activity": "activity",
|
||
"sleep": "sleep"
|
||
},
|
||
"moreValuesOne": "{count} more",
|
||
"moreValuesFew": "{count} more",
|
||
"moreValuesOther": "{count} more",
|
||
"notConnected": "Not connected.",
|
||
"lastData": "Last data: {when}",
|
||
"lastDataNone": "Last data: none yet",
|
||
"reconnect": "Reconnect",
|
||
"resume": "Resume",
|
||
"menuLabel": "More actions for {provider}",
|
||
"menu": {
|
||
"credentials": "Change credentials",
|
||
"address": "Change address and token"
|
||
},
|
||
"syncing": "Syncing…",
|
||
"details": {
|
||
"title": "Details for a bug report",
|
||
"none": "none",
|
||
"state": "State",
|
||
"since": "since",
|
||
"lastSync": "Last sync",
|
||
"lastData": "Last data",
|
||
"failingParts": "failing parts",
|
||
"recentCalls": "Recent calls",
|
||
"unavailable": "Not available",
|
||
"unavailableList": "Not available: {list}",
|
||
"causePlan": "plan",
|
||
"causePermission": "permission",
|
||
"failureStreak": "Failure streak: {count} of {threshold}",
|
||
"copyFailed": "Could not copy. Select the text and copy it by hand."
|
||
},
|
||
"historyEnds": {
|
||
"horizon": "{type}: imported back to {date}. Older readings lie beyond the import limit.",
|
||
"noProgress": "{type}: imported back to {date}. Google stopped returning older readings, so the import ends there."
|
||
}
|
||
},
|
||
"dawarich": "Dawarich",
|
||
"dawarichTag": "Movement",
|
||
"dawarichDescription": "Connect your Dawarich instance to bring in daily distance, time away from home and travel days.",
|
||
"dawarichUrl": "Dawarich address",
|
||
"dawarichApiKey": "API key",
|
||
"dawarichApiKeyHelp": "You find it in Dawarich under Account. HealthLog uses it to read daily values only, never coordinates or place names.",
|
||
"dawarichConnect": "Connect",
|
||
"dawarichUpdate": "Save changes",
|
||
"dawarichConnected": "Dawarich connected. The last 30 days are loading now.",
|
||
"dawarichSync": "Fetch now",
|
||
"dawarichSyncQueued": "The last seven days will be fetched shortly.",
|
||
"dawarichSyncAlreadyQueued": "A fetch is already on its way.",
|
||
"dawarichDisconnect": "Disconnect",
|
||
"dawarichDisconnectTitle": "Disconnect Dawarich?",
|
||
"dawarichDisconnectDescription": "Future fetches stop. Days already stored stay.",
|
||
"dawarichDisconnectDelete": "Disconnect and delete days",
|
||
"dawarichDisconnectDeleteTitle": "Disconnect and delete every day?",
|
||
"dawarichDisconnectDeleteDescription": "The connection and every stored movement day are removed. This cannot be undone.",
|
||
"dawarichHomePlaceSet": "Home is set.",
|
||
"dawarichHomePlaceMissing": "Set your home so time away from home can be measured.",
|
||
"dawarichHomeCountryIs": "Home country: {country}.",
|
||
"dawarichHomeCountryMissing": "No home country yet, so no travel days.",
|
||
"dawarichDaysStored": "Days stored: {count}",
|
||
"dawarichHomePlace": "Home",
|
||
"dawarichHomePlaceChoose": "Choose a place from Dawarich",
|
||
"dawarichHomePlaceChange": "Choose home",
|
||
"dawarichHomeCountry": "Home country",
|
||
"dawarichHomeCountryHelp": "Two-letter country code, such as DE. Left empty, the country you spent most days in over the last year counts.",
|
||
"dawarichHomeSave": "Save",
|
||
"dawarichHomeSaved": "Saved.",
|
||
"dawarichErrors": {
|
||
"invalid": "That address does not work. Use the instance address without credentials.",
|
||
"privateOrigin": "This instance is on a private network. Ask the server operator to approve it.",
|
||
"credentials": "Dawarich did not accept the API key.",
|
||
"unreachable": "Dawarich cannot be reached. Check the address and that the instance is running.",
|
||
"rateLimited": "Too many attempts. Wait a moment, then try again.",
|
||
"homePlaceUnknown": "The Dawarich instance no longer knows this place.",
|
||
"notConnected": "Dawarich is not connected.",
|
||
"generic": "That did not work. Try again."
|
||
},
|
||
"fitbitRetirement": {
|
||
"ending": "Google turns the Fitbit Web API off on {date}. From then on this connection stops syncing.",
|
||
"ended": "Google turned the Fitbit Web API off on {date}. This connection no longer syncs.",
|
||
"move": "Google Health reads the same Fitbit and Pixel devices. Connect it below to keep your data coming. Google asks for your consent once more, because the Fitbit connection cannot be carried over. Everything already imported stays.",
|
||
"toCard": "Go to Google Health",
|
||
"guide": "How to connect Google Health",
|
||
"badgeEnding": "Shutting down",
|
||
"badgeEnded": "Retired"
|
||
},
|
||
"passkeyAddedToast": "Passkey added.",
|
||
"passkeyRemovedToast": "Passkey removed.",
|
||
"integrationDisconnected": "{provider} disconnected.",
|
||
"integrationDisconnectFailed": "Could not disconnect {provider}.",
|
||
"timezoneSaved": "Timezone saved.",
|
||
"moduleState": {
|
||
"on": "On",
|
||
"off": "Off",
|
||
"change": "Change in Modules"
|
||
},
|
||
"timezoneUseDevice": "Use this device's timezone ({zone})",
|
||
"dangerZoneConfirmDescriptionGrace": "This deletes everything in your record: measurements, medications, mood entries, lab results, cycle entries, documents, AI conversations and every integration connection, together with everything derived from them and anything you deleted earlier. Share links you gave to a doctor stop working immediately. Your account stays, along with the credentials you sign in with and display settings such as language, timezone and units. A copy of your record is kept for {days} days, so an admin of this server can restore it until then. After that the deletion is final.",
|
||
"deleteAccountCardDetailGrace": "Your account is locked right away and erased after {days} days. Until then, an admin of this server can undo the deletion.",
|
||
"deleteAccountConfirmDescriptionGrace": "You are signed out and your account is locked right away. After {days} days it is erased for good, with all health data, passkeys, sessions and audit entries. Until then, an admin of this server can undo the deletion. Copies in this server's backups age out after their retention period.",
|
||
"deleteAccountScheduled": "Your account is locked and will be erased on {date}. Signing you out.",
|
||
"dangerZoneSuccessGrace": "Your health record has been deleted. An admin of this server can restore it until {date}.",
|
||
"dangerZoneRestoreLimits": "Access ends too: what you share with others, what they share with you, and any Guardian role. A restore puts the record back as it is now. Anything added after the deletion is replaced, and integration connections, sharing, Guardian roles and share links do not come back; they have to be set up again.",
|
||
"garmin": "Garmin",
|
||
"garminTag": "Personal API",
|
||
"garminDescription": "Paste a Garmin Personal API key to sync sleep, HRV, Body Battery, stress, steps, weight and activities from Garmin Connect.",
|
||
"garminSync": "Sync now",
|
||
"garminSyncResult": "{count} entries synchronized",
|
||
"garminSyncFailed": "Sync failed",
|
||
"garminViewData": "View your recovery",
|
||
"garminReplaceKey": "Replace key",
|
||
"garminDisconnect": "Disconnect",
|
||
"garminDisconnectTitle": "Disconnect Garmin?",
|
||
"garminDisconnectDescription": "Future syncs stop and the key is removed from this server. Data already imported stays in your history. The key keeps working at Garmin until you revoke it there.",
|
||
"garminKeyValidUntil": "Key valid until {date}",
|
||
"garminKeyExpired": "Your Garmin key expired on {date}. Create a new key in Garmin Connect and paste it here to resume syncing.",
|
||
"garminKeyExpiresToday": "Your Garmin key expires today. Create a new key in Garmin Connect and paste it here so syncing does not stop.",
|
||
"garminKeyExpiring": "Your Garmin key expires on {date}. Create a new key in Garmin Connect and paste it here before then.",
|
||
"garminKeyExpiryUnknown": "Garmin does not say when this key expires. Replace the key and choose the validity you picked in Garmin Connect, and this card will warn you a week ahead.",
|
||
"garminConnected": "Garmin connected. The first sync is on its way.",
|
||
"garminKeyHowTo": "In Garmin Connect, open Settings, then Personal API, and create a key. Garmin shows it only once, so copy it straight away.",
|
||
"garminKeySettingsLink": "Open Garmin Connect",
|
||
"garminApiKey": "Personal API key",
|
||
"garminApiKeyPlaceholder": "Paste the key",
|
||
"garminApiKeySavedPlaceholder": "Saved. Paste a new key to replace it",
|
||
"garminKeyValidity": "Validity you picked",
|
||
"garminKeyValidityUnknown": "I don't know",
|
||
"garminKeyValidityDays": "{count} days",
|
||
"garminKeyValidityHelp": "Garmin does not report when a key expires. With the validity, this card warns you a week before the key stops working.",
|
||
"garminConnect": "Connect",
|
||
"garminUpdate": "Save changes",
|
||
"garminRegion": "Garmin service",
|
||
"garminRegionGlobal": "Garmin Connect (global)",
|
||
"garminRegionChina": "Garmin Connect China",
|
||
"garminErrors": {
|
||
"keyRefused": "Garmin did not accept this key. Check that it was copied whole, belongs to the chosen service and has not expired or been revoked.",
|
||
"rateLimited": "Garmin is limiting requests right now. Try again in a few minutes.",
|
||
"unreachable": "Garmin cannot be reached. Try again in a few minutes.",
|
||
"invalid": "That key does not look right. Paste it again, without spaces.",
|
||
"generic": "That did not work. Try again."
|
||
},
|
||
"garminKeyValidityMenu": "Key validity",
|
||
"garminValiditySaved": "Validity saved.",
|
||
"garminKeyCreatedOn": "Created on",
|
||
"garminKeyCreatedOnHelp": "The day you created the key in Garmin Connect. Leave it empty to count from the day you connected it here.",
|
||
"garminUnavailable": "Garmin does not provide this data for your account: {list}.",
|
||
"garminResource": {
|
||
"daily": "daily summaries",
|
||
"activities": "activities",
|
||
"sleep": "sleep",
|
||
"hrv": "HRV",
|
||
"weight": "weigh-ins",
|
||
"cycle": "menstrual cycle"
|
||
}
|
||
},
|
||
"admin": {
|
||
"title": "Administration",
|
||
"subtitle": "System status, users, and settings",
|
||
"settingsSaveError": "Failed to save settings",
|
||
"systemStatus": "System Status",
|
||
"systemStatusDescription": "Runtime state of this instance: database, worker, and record counts.",
|
||
"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."
|
||
},
|
||
"aiServerKey": {
|
||
"title": "AI server key",
|
||
"description": "An operator key for accounts that have not configured one of their own.",
|
||
"byokHint": "A user's own key (BYOK, ChatGPT login or local provider) always takes precedence; the server key is the last step in the provider chain.",
|
||
"consentHint": "Requests over the server key require the user's active AI consent; without a consent receipt nothing is sent.",
|
||
"baseUrlHint": "The base URL selects the API: an Anthropic URL such as https://api.anthropic.com/v1 is understood, any other host is called on the OpenAI-compatible API.",
|
||
"statusConfigured": "Configured",
|
||
"statusNotConfigured": "Not configured",
|
||
"keyLabel": "API key",
|
||
"keyPlaceholder": "sk-...",
|
||
"keyPlaceholderSet": "Stored ({preview}). Enter a new key to replace it",
|
||
"modelLabel": "Model",
|
||
"baseUrlLabel": "Base URL",
|
||
"save": "Save",
|
||
"remove": "Remove key",
|
||
"removeTitle": "Remove the server key?",
|
||
"removeBody": "Accounts without their own key lose AI features straight away. The key is not shown anywhere after it is stored, so you will need the original to put it back.",
|
||
"removeConfirm": "Remove key",
|
||
"saved": "AI server key settings saved",
|
||
"error": "Saving the AI server key failed",
|
||
"legacyGrantTitle": "ALLOW_LOCAL_AI_PRIVATE_HOSTS=true is deprecated",
|
||
"legacyGrantBody": "It still lets the server key above and AI settings saved on an admin account reach your network, and will be removed in a later release. Other accounts need their AI endpoint listed in AI_PRIVATE_ORIGINS already. Set AI_PRIVATE_ORIGINS in the server environment, restart, then remove ALLOW_LOCAL_AI_PRIVATE_HOSTS.",
|
||
"legacyGrantOrigins": "The AI base URLs saved on this instance that point at your network:",
|
||
"legacyGrantNoOrigins": "No AI base URL saved on this instance points at your network, so you can remove ALLOW_LOCAL_AI_PRIVATE_HOSTS now."
|
||
},
|
||
"providerHealth": {
|
||
"title": "AI provider health",
|
||
"description": "Delivery state of every AI provider, folded from the per-user retry ledger.",
|
||
"loading": "Loading provider health…",
|
||
"loadError": "Provider health could not be loaded.",
|
||
"empty": "No AI calls have been recorded yet.",
|
||
"trackedUsers": "{count} users tracked",
|
||
"lastOk": "last success {at}",
|
||
"lastFailure": "last failure {at}",
|
||
"lastFailureStatus": "HTTP {status}",
|
||
"statusHealthy": "Healthy",
|
||
"statusFailing": "{failing} of {tracked} failing, {run} in a row",
|
||
"typeAdminOpenai": "Server key (operator)",
|
||
"typeAdminCodex": "Central ChatGPT (operator)",
|
||
"typeOpenai": "OpenAI key (personal)",
|
||
"typeAnthropic": "Anthropic key (personal)",
|
||
"typeCodex": "ChatGPT sign-in (personal)",
|
||
"typeLocal": "Local model (personal)",
|
||
"typeGateway": "OpenAI-compatible gateway (personal)",
|
||
"spendToday": "Today, on each account's own calendar day: {total} tokens, {operator} of them on the operator's own key (accounts with spend: {accounts}).",
|
||
"statusPaused": "Paused",
|
||
"pausedHint": "Paused after repeated failures for {count} users until {at}. It is tried again automatically then.",
|
||
"modelNotServed": "The endpoint no longer offers the model {model}. Choose a model it lists in the AI settings.",
|
||
"usageLevels": "Accounts per AI usage level: {frugal} frugal, {standard} standard, {full} full."
|
||
},
|
||
"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",
|
||
"appSettingsDescription": "Global defaults for registration, language, and the timezone of new accounts.",
|
||
"registrationEnabled": "Allow registration",
|
||
"registrationEnabledDescription": "When disabled, new users cannot register.",
|
||
"registrationOpenHint": "Registration is open: anyone who can reach this instance can create an account. Close it here once everyone who needs an account has one.",
|
||
"defaultLanguage": "Default language",
|
||
"defaultLanguageDescription": "Used for new users and as fallback.",
|
||
"defaultUserTimezone": "Default timezone for new accounts",
|
||
"defaultUserTimezoneDescription": "Used for new accounts without a browser-detected zone; existing accounts keep theirs.",
|
||
"defaultUserTimezoneFallback": "Europe/Berlin (default)",
|
||
"servicesGlobal": "Channels and API",
|
||
"servicesGlobalDescription": "Disabled services are not available to any user.",
|
||
"telegramGlobal": "Allow Telegram notifications.",
|
||
"ntfyGlobal": "Allow ntfy notifications.",
|
||
"webPushGlobal": "Allow browser push notifications.",
|
||
"integrationWebPush": "Web Push",
|
||
"offlineGeoLabel": "Geo data",
|
||
"offlineGeoEnabled": "Offline (GeoLite2)",
|
||
"offlineGeoFallback": "Online ({host}). Mount GeoLite2 databases and set GEOLITE2_DIR",
|
||
"heapLimitLabel": "Heap limit",
|
||
"heapLimitValue": "{mb} MB",
|
||
"heapLimitLow": "{mb} MB, low. Set APP_MEMORY_LIMIT=1536m in .env",
|
||
"memoryBelowFloor": "Container {mb} MB, below the supported floor of {floor} MB. Set APP_MEMORY_LIMIT={floor}m in .env",
|
||
"offlineGeoOff": "Off",
|
||
"offlineGeoChosen": "Online ({host})",
|
||
"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",
|
||
"glitchtipTargetOn": "Error reports go to {host}.",
|
||
"glitchtipTargetOff": "Error reports stay on this host. Nothing is sent anywhere.",
|
||
"glitchtipTargetNoTarget": "Error tracking is on, but no target is set, so nothing is sent.",
|
||
"glitchtipUnproven": "Unproven",
|
||
"glitchtipDeliveryUnproven": "A target is set, but no report has left this host yet. Press Test to find out whether it accepts one.",
|
||
"glitchtipDeliveryStale": "No report has left this host in the last {hours} h. Press Test to check the target still accepts one.",
|
||
"glitchtipDeliveryFailed": "The last report did not get through ({reason}).",
|
||
"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",
|
||
"webPushVapidGenerate": "Generate keys",
|
||
"webPushVapidGenerating": "Generating…",
|
||
"webPushVapidGenerated": "VAPID keys generated. Save the subject to finish.",
|
||
"webPushVapidGenerateFailed": "Could not generate VAPID keys.",
|
||
"webPushVapidGenerateConfirm": "VAPID keys are already configured. Generating a new pair invalidates every browser push subscription, and each device must re-subscribe. Continue?",
|
||
"webPushVapidGenerateConfirmTitle": "Regenerate VAPID keys?",
|
||
"webPushVapidRegenerate": "Regenerate",
|
||
"configured": "Configured",
|
||
"monitoringTestSuccess": "Test event sent",
|
||
"monitoringTestFailed": "Monitoring test failed",
|
||
"assistant": {
|
||
"title": "Assistant",
|
||
"description": "Each switch stops the AI work it covers and hides its text, while data and scores keep loading.",
|
||
"master": {
|
||
"title": "Assistant enabled",
|
||
"description": "Master switch for every AI feature. When off, nothing is sent to a model and every switch below is off."
|
||
},
|
||
"coach": {
|
||
"title": "Coach",
|
||
"description": "Chat, upkeep of the Coach's memory, and AI nudges. Stored conversations stay readable and deletable."
|
||
},
|
||
"briefing": {
|
||
"title": "Daily Briefing",
|
||
"description": "The daily briefing, its opening lines elsewhere in the app, and period summaries written by a model."
|
||
},
|
||
"insightStatus": {
|
||
"title": "Status notes",
|
||
"description": "Short notes a model writes per reading and metric, workout notes and reaction lines. The largest share of token use."
|
||
},
|
||
"documentAi": {
|
||
"title": "Reading documents",
|
||
"description": "AI reading of stored documents, lab report scans and medication extraction from text. The largest share of data leaving the server."
|
||
},
|
||
"reasoning": {
|
||
"enabled": "Allow deeper thinking",
|
||
"max": "Highest thinking depth",
|
||
"description": "Models think before they answer: the Coach, the daily briefing and the period summaries. More precise, uses more tokens."
|
||
}
|
||
},
|
||
"modules": {
|
||
"title": "Module availability",
|
||
"description": "Turn a module off for the whole server.",
|
||
"saveError": "Could not update module availability.",
|
||
"detail": "Weight, blood pressure and pulse are core readings and always stay on.",
|
||
"coachFollowsSwitch": "Follows the Coach switch in the Coach section."
|
||
},
|
||
"invites": {
|
||
"title": "Invite links",
|
||
"description": "Each link admits a signup even while registration is closed.",
|
||
"create": "Create invite",
|
||
"createTitle": "Create invite",
|
||
"createDescription": "The link admits a signup even while registration is closed.",
|
||
"ttlLegend": "Valid for",
|
||
"createDays": "{days} days",
|
||
"maxUsesLabel": "Maximum uses",
|
||
"maxUsesHint": "How many signups this link admits (1–50).",
|
||
"createConfirm": "Create invite",
|
||
"createdToast": "Invite created",
|
||
"createError": "Could not create the invite.",
|
||
"tokenTitle": "Invite link",
|
||
"tokenOnceHint": "Copyable only now. Copy the link or have the QR code scanned.",
|
||
"hashExplainer": "Only a hash of the link is stored, so it cannot be shown again later. If it gets lost, revoke the invite and create a new one.",
|
||
"copyLink": "Copy link",
|
||
"copiedToast": "Link copied",
|
||
"copyError": "Copy failed.",
|
||
"qrAlt": "QR code for the invite link",
|
||
"loadError": "Could not load the invites.",
|
||
"emptyTitle": "No invites yet",
|
||
"emptyDescription": "Create an invite link to admit someone while registration is closed.",
|
||
"colStatus": "Status",
|
||
"colCreated": "Created",
|
||
"colExpires": "Expires",
|
||
"colUses": "Uses",
|
||
"colRedeemedBy": "Redeemed by",
|
||
"colActions": "Actions",
|
||
"byCreator": "by {by}",
|
||
"expiresInDaysOne": "in 1 day",
|
||
"expiresInDaysOther": "in {count} days",
|
||
"statusActive": "Active",
|
||
"statusExpired": "Expired",
|
||
"statusExhausted": "Used up",
|
||
"statusRevoked": "Revoked",
|
||
"redeemerDeleted": "deleted account",
|
||
"redeemedByMore": "{username} + {count} more",
|
||
"redemptionsTitle": "{count} redemptions",
|
||
"revoke": "Revoke",
|
||
"revokeAria": "Revoke invite",
|
||
"revokeConfirmTitle": "Revoke this invite?",
|
||
"revokeConfirmBody": "The invite link becomes invalid immediately. Accounts already registered through it remain, and the redemption history stays visible.",
|
||
"revokeConfirmAction": "Revoke",
|
||
"cancel": "Cancel",
|
||
"revokedToast": "Invite revoked.",
|
||
"revokeError": "Could not revoke the invite."
|
||
},
|
||
"userManagement": "Accounts",
|
||
"userManagementDescription": "Roles, password resets and forced logouts for every account.",
|
||
"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",
|
||
"apiTokensDescription": "All active and revoked API tokens across all accounts.",
|
||
"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.",
|
||
"loginOverviewDescription": "Sign-in and auth events across all accounts, filterable and exportable as CSV.",
|
||
"loginOverviewFilterLabel": "Filter events",
|
||
"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 every record every account holds; the accounts and their sign-in credentials are kept.",
|
||
"deleteAllConfirm": "Really delete all data?",
|
||
"deleteAllConfirmDescription": "This permanently deletes every account's records across the whole database, not a selection of tables. Kept: the user accounts and the credentials that sign into them, the instance configuration, and the delegation grants that keep managed profiles reachable. A receipt for this wipe is written to the audit log afterwards; the audit history before it goes with everything else.",
|
||
"deleteButton": "Delete all data",
|
||
"deleteAllPromptLabel": "Type {token} to continue",
|
||
"finalDelete": "Delete permanently",
|
||
"deletedResult": "Deleted {rows} rows across {tables} tables. User accounts and sign-in credentials were kept.",
|
||
"authRegister": "Registration",
|
||
"authClaim": "Profile taken over",
|
||
"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.",
|
||
"notificationHealth": {
|
||
"title": "Notification health",
|
||
"description": "Delivery results across all users over the last 24 hours.",
|
||
"empty": "No notifications sent in this window.",
|
||
"ok": "OK",
|
||
"error": "Failed",
|
||
"skipped": "Skipped",
|
||
"autoDisabled": "Auto-disabled channels"
|
||
},
|
||
"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",
|
||
"shell": {
|
||
"overview": "Overview",
|
||
"sectionsNav": "Admin sections"
|
||
},
|
||
"overview": {
|
||
"snapshotTitle": "System snapshot",
|
||
"snapshotDatabase": "Database",
|
||
"snapshotWorker": "Worker",
|
||
"snapshotStarted": "Started",
|
||
"snapshotOfflineGeo": "Geo data",
|
||
"snapshotOfflineGeoOn": "Offline (GeoLite2)",
|
||
"snapshotOfflineGeoOff": "Online ({host})",
|
||
"versionTileTitle": "Version",
|
||
"versionTileVersion": "Running version",
|
||
"versionTileBuildSha": "Build SHA",
|
||
"versionTileBuiltAt": "Built at",
|
||
"versionTileUpdateAvailable": "Update available: {tag}",
|
||
"versionTileUpToDate": "Up to date",
|
||
"versionTileCheckOff": "Update check off",
|
||
"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": "Turn notification channels and the API on or off for the whole server."
|
||
},
|
||
"integrations": {
|
||
"title": "Integrations",
|
||
"subtitle": "Configure Umami, GlitchTip, Web Push, and bug reports."
|
||
},
|
||
"coach": {
|
||
"title": "Coach",
|
||
"subtitle": "Assistant surfaces, the server key, and feedback quality in one place."
|
||
},
|
||
"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"
|
||
},
|
||
"filterLabel": "Filter 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",
|
||
"deletionPending": "Deletion on {date}",
|
||
"deletionPendingNoDate": "Deletion pending",
|
||
"undoDeletion": "Undo deletion",
|
||
"undoDeletionTitle": "Undo the deletion of {name}?",
|
||
"undoDeletionBody": "{name} asked to delete this account, and it is erased when the grace window ends. Undoing keeps the account and everything in it as it was. {name} can sign in again, but API tokens, share links and trusted devices stay revoked and have to be set up again.",
|
||
"undoDeletionBodyGuardian": "A guardian deleted the managed profile {name}, and it is erased when the grace window ends. Undoing keeps the profile and everything in it as it was, and its guardians can reach it again. Its share links and tokens stay revoked and have to be set up again.",
|
||
"undoDeletionDone": "Deletion undone for {name}",
|
||
"undoDeletionFailed": "Could not undo the deletion",
|
||
"undoDeletionBodyAdmin": "An admin deleted the account {name}, and it is erased when the grace window ends. Undoing keeps the account and everything in it as it was. {name} can sign in again, but API tokens, share links and trusted devices stay revoked and have to be set up again.",
|
||
"deleteUser": "Delete account",
|
||
"deleteUserTitle": "Delete the account {name}?",
|
||
"deleteUserBodyGrace": "{name} is signed out everywhere at once and can no longer sign in. The account and everything in it is erased on {date}. Until then you can undo the deletion here.",
|
||
"deleteUserBodyNow": "{name} and everything in the account is erased right away. This server keeps no grace window, so the deletion cannot be undone.",
|
||
"deleteUserConfirm": "Delete account",
|
||
"deleteUserScheduled": "The account {name} is locked and will be erased on {date}",
|
||
"deleteUserDone": "The account {name} was deleted",
|
||
"deleteUserFailed": "Could not delete the account"
|
||
},
|
||
"invites": {
|
||
"title": "Invites",
|
||
"subtitle": "Mint, track, and revoke registration invite links."
|
||
},
|
||
"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.",
|
||
"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",
|
||
"viewDetails": "View details for {action} at {timestamp}",
|
||
"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",
|
||
"processDetail": "Buffer is volatile and capped at 500 entries.",
|
||
"cardTitle": "Recent events",
|
||
"filterErrorId": "Error ID"
|
||
},
|
||
"backups": {
|
||
"title": "Backups",
|
||
"subtitle": "Account copies kept in this server's database, for rolling one account back on this server.",
|
||
"description": "Each account has one weekly copy, replaced every Sunday, plus any copy uploaded here and the copy taken before \"Delete all data\". A copy brings one existing account back on this server. It cannot rebuild a lost server: that takes a database dump and the encryption keys. Sizes show the encrypted copy. Download decrypts it for the admin who asks; the ciphertext stays in the database.",
|
||
"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 account rollback",
|
||
"typeManual": "Manual",
|
||
"colSize": "Size",
|
||
"colCreatedAt": "Last snapshot",
|
||
"colActions": "Actions",
|
||
"scheduleStaleTitle": "The weekly backup has stopped",
|
||
"scheduleStaleDescription": "The newest scheduled copy is {days} days old. A working weekly run never leaves one older than {threshold} days.",
|
||
"scheduleFailedTitle": "The last scheduled backup run failed",
|
||
"scheduleFailedDescription": "{when}: {reason}",
|
||
"scheduleFailedNoReason": "no reason recorded",
|
||
"scheduleRemedy": "Run a backup now and check that a fresh row appears. If it fails again, the worker log names the account it stopped on.",
|
||
"activity": {
|
||
"running": "Running since {when}.",
|
||
"interruptedTitle": "A run stopped partway and never came back",
|
||
"interruptedAccount": "{username}: started {when}, never finished",
|
||
"interruptedRemedy": "The app most likely restarted or ran out of memory while writing this copy. The next run takes these accounts last, so every other account gets its copy first. If it keeps happening, give the container more memory."
|
||
},
|
||
"download": "Download",
|
||
"downloadAria": "Download backup for {username}",
|
||
"downloadFailed": "Download failed",
|
||
"downloadStarted": "Download started",
|
||
"uploadTitle": "Upload backup",
|
||
"uploadDescription": "Check an account copy and store it beside this server's copies. A copy whose account is no longer on this server can go into another account. Restoring is a separate step.",
|
||
"uploadButton": "Upload file",
|
||
"uploadHelp": "A HealthLog backup as .json or .json.gz. The file is compressed before upload; compressed, it may be up to 512 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.",
|
||
"restoreInstanceSettingsLabel": "Also restore instance settings",
|
||
"restoreInstanceSettingsHint": "Registration, MFA requirement, default locale, module availability, notification and AI configuration, taken from the snapshot and applied to everybody on this installation. Leave it clear to restore this account alone.",
|
||
"restorePromptLabel": "Type RESTORE to continue",
|
||
"previewTitle": "What this backup contains",
|
||
"previewLoading": "Reading contents…",
|
||
"previewUnavailable": "Contents could not be read. Restoring is still possible.",
|
||
"previewStillReading": "This backup was made by an earlier version, so its contents are being read in full, which takes a while for a large record. Open this dialog again in a few minutes to see them. Restoring does not depend on it.",
|
||
"previewEmpty": "The file contains no records.",
|
||
"previewOther": "Other records",
|
||
"previewMeasurements": "Measurements",
|
||
"previewMedications": "Medications and intakes",
|
||
"previewMood": "Mood entries",
|
||
"previewLabs": "Lab results",
|
||
"previewDocuments": "Documents",
|
||
"previewWorkouts": "Workouts",
|
||
"previewCycles": "Cycle data",
|
||
"previewVisits": "Doctor visits",
|
||
"previewVaccinations": "Vaccinations",
|
||
"previewReminders": "Preventive-care reminders",
|
||
"previewCustomMetrics": "Custom metrics",
|
||
"previewHealthScores": "Score history",
|
||
"restoreConfirm": "Restore now",
|
||
"restoreInProgress": "Restoring…",
|
||
"restoreSuccess": "Restore complete",
|
||
"restoreFailed": "Restore failed",
|
||
"restoreSkippedToast": "Restore complete, {links} symptom links could not be put back",
|
||
"restoreSkippedTitle": "{links} links were not restored",
|
||
"restoreSkippedDescription": "The file references entries this installation does not know. Everything else was restored. The same list is in the audit log.",
|
||
"restoreSkippedLinks": "{count} links",
|
||
"restoreSkippedCycleSymptom": "Cycle symptom",
|
||
"restoreSkippedIllnessSymptom": "Illness symptom",
|
||
"restoreSkippedMoodFactor": "Mood factor",
|
||
"restoreSkippedMoodTag": "Mood tag",
|
||
"restoreSkippedVisitReference": "Visit reference",
|
||
"restoreSkippedVaccinationReference": "Vaccination reference",
|
||
"restoreSkippedCheckupClosure": "Checkup closure",
|
||
"restoreSkippedReminderReference": "Reminder reference",
|
||
"restoreSkippedCoachAttachment": "Coach document link",
|
||
"restoreSkippedCoachReference": "Coach reference",
|
||
"restoreSkippedDocumentConditionLink": "Document filing",
|
||
"restoreSkippedRelationLink": "Link between records",
|
||
"restoreSkippedExtractedFact": "Document fact",
|
||
"restoreSkippedFactCommitment": "Fact commitment",
|
||
"docsLink": "Documentation",
|
||
"restoreSkippedPersonalRecordReference": "Personal best provenance",
|
||
"restoreSkippedEcgReference": "ECG strip provenance",
|
||
"restoreSkippedMedicationTarget": "Medication target analyte",
|
||
"restoreSkippedScheduleRevisionLink": "Schedule era succession",
|
||
"restoreSkippedAccountSetting": "Account setting",
|
||
"restoreMissingTitle": "Restore refused: the file is incomplete",
|
||
"restoreMissingDescription": "The file's own manifest says it carries the section below, and it does not. Nothing was changed: a restore replaces a whole class of records, so putting back a section that is not in the file would have emptied it.",
|
||
"restoreMissingRemedy": "Use one of this server's account copies or an off-host copy, or export the account again and upload the new file. A section the manifest declares as omitted is a different thing and restores normally.",
|
||
"restoreMissingDocuments": "Documents",
|
||
"restoreMissingWorkouts": "Workouts",
|
||
"restoreMissingMentalHealth": "Mental-health screeners",
|
||
"restoreMissingConsent": "Consent receipts",
|
||
"offhost": {
|
||
"title": "Off-host copies",
|
||
"description": "When this host last put each account's encrypted copy in your bucket.",
|
||
"loadError": "Could not load the off-host status.",
|
||
"notConfiguredTitle": "Off-host backup is not configured",
|
||
"notConfiguredDescription": "No bucket and no key are set, so no backup leaves this host. Set BACKUP_S3_ENDPOINT, BACKUP_S3_BUCKET, BACKUP_S3_ACCESS_KEY, BACKUP_S3_SECRET_KEY and BACKUP_ENCRYPTION_KEY to turn the nightly upload on.",
|
||
"stateFresh": "Fresh",
|
||
"stateDue": "Due",
|
||
"stateStale": "Stale",
|
||
"stateNever": "Never",
|
||
"stateUnknown": "No record yet",
|
||
"neverDetail": "Nothing has landed for this account. Last checked {when}.",
|
||
"unknownDetail": "No nightly run has recorded this account yet.",
|
||
"age": "{hours} h ago",
|
||
"scheduleNote": "The upload runs every {hours} h. Fresh means inside one run, due means one run produced nothing, stale means two did not.",
|
||
"lifecycleConfigured": "The bucket deletes copies after {days} days by its own lifecycle rule.",
|
||
"lifecycleMissing": "The bucket has no lifecycle rule, so every nightly copy is kept forever. Add a rule that expires objects after BACKUP_RETENTION_DAYS.",
|
||
"lifecycleUnknown": "Whether the bucket deletes old copies could not be read: the credential may not read its lifecycle rule. Check that a rule expires objects after BACKUP_RETENTION_DAYS.",
|
||
"pendingDeletions": "Copies of {count} deleted or wiped accounts are still in the bucket and are being removed.",
|
||
"pendingDeletionsFailing": "Copies of {count} deleted or wiped accounts are still in the bucket because it refused to delete them ({error}). Give the credential DeleteObject; the deletion is retried every night."
|
||
},
|
||
"restoreStarted": "Restore started. Its progress shows above the list.",
|
||
"restoreActive": "A restore of this account is already running. Wait for it to finish.",
|
||
"restoreJobQueuedTitle": "Restore of {username} is waiting to start",
|
||
"restoreJobQueuedNote": "It starts as soon as the background worker picks it up.",
|
||
"restoreJobWaitingBackupNote": "Waiting for the backup that is running on the server. A restore never runs beside one, and it starts about a minute after the backup finishes.",
|
||
"restoreJobWaitingBusyNote": "Waiting for a large job on the server to finish, such as an import or a nightly pass. It starts about a minute after that.",
|
||
"restoreJobQueuedSince": "Queued at {when}.",
|
||
"restoreJobRunningTitle": "Restoring {username}",
|
||
"restoreJobRunningNote": "The account keeps showing its current data until the restore finishes. You can leave this page; the restore continues on the server.",
|
||
"restoreJobResumed": "Started again after the server restarted.",
|
||
"restoreJobPhaseValidating": "Checking the backup file: {checked} readings checked",
|
||
"restoreJobPhaseClearing": "Clearing the account's current data",
|
||
"restoreJobPhaseMeasurements": "Writing readings: {done} of {total}",
|
||
"restoreJobPhaseSections": "Writing the other records: {done} of {total} sections",
|
||
"restoreJobPhaseRebuilding": "Rebuilding charts and summaries",
|
||
"restoreJobSucceededTitle": "Restore of {username} finished",
|
||
"restoreJobSucceededDescription": "{count} records restored. Finished {when}.",
|
||
"restoreJobFailedTitle": "Restore of {username} did not complete",
|
||
"restoreJobFailedKept": "Nothing was changed. The backup is kept, so you can start the restore again from its row without uploading it again.",
|
||
"restoreFailureNotFound": "The backup was deleted before the restore could read it.",
|
||
"restoreFailureChanged": "The backup was replaced by a newer copy while the restore waited. Check the new copy, then start the restore again.",
|
||
"restoreFailureUndecryptable": "The backup could not be decrypted. The key that wrote it is no longer configured, or the stored copy was changed.",
|
||
"restoreFailureSchema": "The backup file is not a valid HealthLog backup.",
|
||
"restoreFailureVersion": "The backup was written by a newer version of HealthLog. Update this server first.",
|
||
"restoreFailureOwnerMismatch": "The file inside the backup belongs to a different account than the backup row.",
|
||
"restoreFailureOwnerMissing": "The account this backup belongs to no longer exists.",
|
||
"restoreFailureSectionMissing": "The file is incomplete: its manifest names a section it does not carry.",
|
||
"restoreFailureDocument": "The file carries documents without their content, as a portable export does. Use one of this server's account copies or an off-host copy instead.",
|
||
"restoreFailureTimeBudget": "This backup is too large to restore within the background job's time limit.",
|
||
"restoreFailureTransaction": "The database refused the restore part-way, so everything was rolled back. The server log names the error.",
|
||
"restoreFailureCauseTimeout": "The restore ran longer than the database allowed, so everything was rolled back. If the database host was busy, start the restore again when it is quieter. The server log names the step.",
|
||
"restoreFailureCauseLock": "The restore waited on records another process was changing, so everything was rolled back. Start the restore again.",
|
||
"restoreFailureCauseConstraint": "The database rejected a record in the backup, so everything was rolled back. The server log names the table and the rule.",
|
||
"restoreFailureCauseStorage": "The database ran out of disk space or memory during the restore, so everything was rolled back. Free up space on the database host, then start the restore again.",
|
||
"restoreFailureCauseConnection": "The connection to the database was lost during the restore, so everything was rolled back. Check that the database is running, then start the restore again.",
|
||
"restoreFailureInterrupted": "The restore stopped when the server restarted, and was rolled back. If it stops again, the server is likely running out of memory.",
|
||
"restoreFailureNotStarted": "The background worker did not pick the restore up. Check that the worker is running.",
|
||
"restoreFailureEnqueue": "The restore could not be handed to the background worker. Check that the worker is running.",
|
||
"restoreFailureAfterCommit": "The data was restored, but a step after it failed. Charts may take until the next nightly run to catch up.",
|
||
"restoreFailureUnexpected": "The restore stopped on an unexpected error and was rolled back. The server log names the error.",
|
||
"restoreFailureKeyMissing": "The backup needs encryption key {keys}, which this server cannot open it with. Add the key back to ENCRYPTION_KEYS, restart, and start the restore again.",
|
||
"restoreFailureForeignReference": "The file points at records that belong to another account. Nothing was written.",
|
||
"restoreFailureRowsElsewhere": "The records in this file are already in another account on this server: the same file was restored there before. A file can be restored into one account only. Nothing was written.",
|
||
"previewKeyMissing": "This backup cannot be restored on this server: it needs encryption key {keys}. Add the key back to ENCRYPTION_KEYS and restart first.",
|
||
"restoreSkippedSymptomEpisodeReference": "Symptom entry linked to an illness the file does not contain (kept without the link)",
|
||
"restoreSkippedCycleCiphertext": "Cycle note or label sealed with a key this server does not hold (day or symptom kept without it)",
|
||
"restoreSkippedMoodLabelCiphertext": "Mood tag or group name sealed with a key this server does not hold (kept without its name)",
|
||
"restoreSkippedVisitCiphertext": "Visit or practitioner text sealed with a key this server does not hold (kept without it)",
|
||
"restoreSkippedVaccinationCiphertext": "Vaccination note sealed with a key this server does not hold (dose kept without it)",
|
||
"restoreSkippedEnvironmentLocationCiphertext": "Location of an environment period or day sealed with a key this server does not hold (kept sealed, those days are not refreshed)",
|
||
"typePreWipe": "Before all data was deleted",
|
||
"retentionNote": "The weekly copy is replaced every Sunday. A copy taken before \"Delete all data\" is deleted after {days} days. Uploaded copies stay until their account is erased.",
|
||
"retentionNoteNoGrace": "The weekly copy is replaced every Sunday. Uploaded copies stay until their account is erased.",
|
||
"database": {
|
||
"title": "Database dump",
|
||
"lastGood": "Last good dump {when}, {size}, {where}.",
|
||
"whereBoth": "kept on this server and off-host",
|
||
"whereLocal": "kept on this server",
|
||
"whereOffhost": "off-host only",
|
||
"none": "No database dump yet. The first one runs tonight.",
|
||
"failedTitle": "The last database dump failed",
|
||
"failedDescription": "{when}: {reason}",
|
||
"disabled": "Database dumps are switched off (DB_BACKUP_ENABLED=false). Back the database up another way.",
|
||
"noDirectoryOffhost": "This server cannot write to {dir}, so dumps go off-host only and none is kept here. Mount the backups volume.",
|
||
"noDirectory": "This server cannot write to {dir} and no off-host bucket is set, so no database dump can be taken. Mount the backups volume.",
|
||
"retentionLocal": "Deleted accounts stay in the dumps until those age out: the newest {nights} nightly dumps are kept on this server, and the dump taken before the latest update stays until the next update.",
|
||
"retentionOffhost": "Off-host copies are removed after {days} days by the bucket's lifecycle rule.",
|
||
"retentionOffhostMissing": "No lifecycle rule in the bucket covers database/, so dumps there, and the deleted accounts inside them, are never removed. Add a rule for that prefix.",
|
||
"notPersistentOffhost": "{dir} is not on persistent storage (it sits inside the container rather than on a mounted volume, or in memory), so a dump written there would be lost at the next update. Dumps go off-host only: none is kept here and none is taken before a migration. Mount the backups volume.",
|
||
"notPersistent": "{dir} is not on persistent storage (it sits inside the container rather than on a mounted volume, or in memory) and no off-host bucket is set, so no database dump is kept anywhere. Mount the backups volume.",
|
||
"offhostFailedTitle": "The newest database dump did not reach the off-host bucket",
|
||
"offhostLastUpload": "The newest dump in the bucket is from {when}.",
|
||
"offhostNeverUploaded": "No database dump has reached the bucket yet."
|
||
},
|
||
"restorePreWipeLimits": "This copy was taken before the account's data was deleted, and restoring it undoes that deletion as far as a copy can: whatever the account added since is replaced, and integration connections, sharing and Guardian access, and share links do not come back.",
|
||
"target": {
|
||
"title": "Restore into another account",
|
||
"description": "{file} belongs to an account that is no longer on this server. Choose the account its records go into. A restore replaces an account's records, so only an account without records can take them. The file is uploaded once more.",
|
||
"choiceLabel": "Where the records go",
|
||
"newAccount": "New account",
|
||
"existingAccount": "Existing account",
|
||
"usernameLabel": "Username for the new account",
|
||
"usernameInvalid": "3 to 30 letters, digits, _ or -, not starting with \"managed-\".",
|
||
"newAccountHint": "The account is created without a password or email. Before you hand it over, set its first password with Reset password under Users.",
|
||
"accountLabel": "Account",
|
||
"accountPlaceholder": "Choose an account",
|
||
"checking": "Checking the account…",
|
||
"eligible": "This account holds no records yet and can take the copy.",
|
||
"confirmLabel": "Type {username} to confirm",
|
||
"submit": "Upload into this account",
|
||
"submitting": "Uploading…",
|
||
"success": "Backup stored for {username} ({count} records). Restore it from its row.",
|
||
"failureHoldsRecords": "This account already holds records. A restore replaces records instead of adding to them, so choose an account without records or create a new one.",
|
||
"failureManagedProfile": "This account is a managed profile. The people who look after it run it, so a copy cannot go into it.",
|
||
"failurePendingDeletion": "This account is pending deletion. Undo the deletion first, or choose another account.",
|
||
"failureAdminAccount": "This is an admin account. Another person's records cannot go into it. Choose an ordinary account or create a new one.",
|
||
"failureNotFound": "This account no longer exists.",
|
||
"failureUnconfirmed": "Type the account's username exactly to confirm.",
|
||
"failureUsernameTaken": "This username is already taken.",
|
||
"failureOwnerExists": "The account this file belongs to is on this server, and the file restores into that account. Upload it again without choosing an account."
|
||
}
|
||
},
|
||
"danger-zone": {
|
||
"title": "Danger zone",
|
||
"subtitle": "Destructive system-wide operations."
|
||
},
|
||
"about": {
|
||
"title": "About",
|
||
"subtitle": "Version, license, and update status."
|
||
},
|
||
"module-availability": {
|
||
"title": "Modules",
|
||
"subtitle": "Turn modules on or off for every account on this server."
|
||
},
|
||
"encryption": {
|
||
"title": "Encryption",
|
||
"subtitle": "Encryption coverage and key-rotation status for data at rest.",
|
||
"loadError": "Failed to load encryption status.",
|
||
"coverageTitle": "Coverage",
|
||
"coverageDescription": "How many encrypted rows sit under each key id.",
|
||
"activeKeyId": "Active key id",
|
||
"configuredKeys": "Configured keys",
|
||
"totalRows": "Encrypted rows",
|
||
"staleRows": "Rows not on the active key",
|
||
"safeToDropLegacy": "Safe to drop the legacy key",
|
||
"rotationIncomplete": "{count} rows still need rotation",
|
||
"rotationTitle": "Key rotation",
|
||
"rotationDescription": "Re-encrypt every encrypted column to the active key.",
|
||
"rotationState": "State",
|
||
"lastRun": "Last run: scanned {scanned}, rotated {rotated}, errors {errors}.",
|
||
"rotateNow": "Rotate now",
|
||
"rotateConfirmTitle": "Re-encrypt the whole record?",
|
||
"rotateConfirmDescription": "Re-encrypts every encrypted column to the active key. It never adds or drops a key and is safe to re-run. This can take a while on large accounts.",
|
||
"cancel": "Cancel",
|
||
"rotateConfirm": "Start rotation",
|
||
"rotateEnqueued": "Rotation started.",
|
||
"rotateFailed": "Could not start the rotation.",
|
||
"stepUpNeeded": "A fresh second factor is required. Confirm your second factor, or use the command-line tool if you have no second factor enrolled.",
|
||
"cliNote": "A second factor is required to use this button. Without one, run scripts/rotate-encryption-key.ts from a source checkout of this release; the steps are in docs/ops/encryption-key-rotation.md.",
|
||
"columnsTitle": "Per-column coverage",
|
||
"columnsDescription": "Each encrypted column with its row counts on the active key versus older keys.",
|
||
"colColumn": "Column",
|
||
"colTotal": "Total",
|
||
"colActive": "On active key",
|
||
"colStale": "Stale",
|
||
"state": {
|
||
"idle": "Idle",
|
||
"running": "Running",
|
||
"completed": "Completed",
|
||
"failed": "Failed"
|
||
},
|
||
"coverageDetail": "Only key ids and counts are shown, never key material.",
|
||
"backupsTitle": "Keys the backups still need",
|
||
"backupsDescription": "A retired key stays needed while any backup below still lists it.",
|
||
"backupsStoredLine": "Key {key}: {count} stored copies, the oldest from {when}",
|
||
"backupsUnrecordedLine": "{count} stored copies were written before backups recorded their keys (the oldest on {when}). They may need any key that existed then: keep every old key until they are replaced or deleted.",
|
||
"backupsOffhostLine": "Key {key}: the last off-host copy that needs it went into the bucket on {when}; needed there until {until}",
|
||
"backupsOffhostLineUnknown": "Key {key}: the last off-host copy that needs it went into the bucket on {when}. The bucket's expiry is unknown, so keep the key until you know that copy is gone.",
|
||
"backupsNone": "No backup has recorded the keys it needs yet.",
|
||
"backupsStillNeed": "Every row is rotated, but backups still need {keys}",
|
||
"backupsUnrecordedBadge": "Every row is rotated, but older backups may still need a retired key",
|
||
"backupsDetail": "Rotation re-encrypts every row, but a backup keeps the key its content was written under, and restoring it needs that key. Keep a retired key in ENCRYPTION_KEYS until nothing below lists it.",
|
||
"columnsShow": "Show the table ({count} with rows)",
|
||
"columnsHide": "Hide the table",
|
||
"columnsShowAll": "Show all {count} columns",
|
||
"columnsShowWithRows": "Only columns with rows",
|
||
"columnsNoneWithRows": "No encrypted column holds rows yet.",
|
||
"backupsDumpLocalLine": "Key {key}: {count} database dumps on this server were written under it; it is needed until retention removes them.",
|
||
"backupsDumpOffhostLine": "Key {key}: the newest database dump written under it went into the bucket on {when}; needed there until {until}",
|
||
"backupsDumpOffhostLineUnknown": "Key {key}: the newest database dump written under it went into the bucket on {when}. How long the bucket keeps database/ is unknown, so keep the key until you know that dump is gone."
|
||
},
|
||
"maintenance": {
|
||
"title": "Measurement table maintenance",
|
||
"description": "Gives back the space old sync leftovers held, once the cleanup has run.",
|
||
"body": "It vacuums the measurements table and then rebuilds its indexes, one at a time. Reading and saving keep working while it runs. Pick a quiet hour, and have free disk for one more copy of the largest index.",
|
||
"tableSize": "Table with indexes",
|
||
"indexSize": "Indexes",
|
||
"loading": "Checking where the maintenance stands…",
|
||
"loadError": "Could not read the maintenance status.",
|
||
"unavailable": "No background worker is connected, so the maintenance cannot run here.",
|
||
"purgePending": "The cleanup of old sync leftovers is still running. The maintenance can start once it has finished.",
|
||
"state": {
|
||
"idle": "Not run yet.",
|
||
"queued": "Waiting for the background worker.",
|
||
"running": "Running since {since}. This can take a while on a large instance.",
|
||
"completed": "Finished on {at}.",
|
||
"refusedPurge": "Did not start, because the cleanup was still running. Start it again once the cleanup has finished.",
|
||
"alreadyRunning": "Did not start, because another run was already working.",
|
||
"failed": "Stopped on {at}. The app log names the step, and the runbook explains what to check."
|
||
},
|
||
"start": "Start maintenance",
|
||
"confirmTitle": "Start the maintenance now?",
|
||
"confirmBody": "It runs in the background, one step at a time, and can take a while. If you have not taken a backup today, take one first.",
|
||
"confirm": "Start",
|
||
"cancel": "Cancel",
|
||
"started": "Maintenance started.",
|
||
"alreadyQueued": "A maintenance run is already queued or running.",
|
||
"startFailed": "Could not start the maintenance."
|
||
},
|
||
"pulseDayMean": {
|
||
"title": "Pulse day mean",
|
||
"description": "How hours with only a few readings count toward a day's pulse.",
|
||
"body": "Up to now every hour with a reading counts the same, so a single stray reading can move a whole day. The weighted method lets an hour count fully from three readings on, and a lone reading a third. Run the dry run first to see how many days would change. Applying recalculates the stored pulse days in the background.",
|
||
"method": {
|
||
"hourly": "Every hour equal",
|
||
"weighted": "Sparse hours weighted"
|
||
},
|
||
"loading": "Checking the pulse day mean…",
|
||
"loadError": "Could not read the pulse day-mean status.",
|
||
"state": {
|
||
"idle": "No dry run yet.",
|
||
"queued": "The dry run is waiting for the background worker.",
|
||
"running": "The dry run is in progress.",
|
||
"done": "Dry run finished on {at}.",
|
||
"failed": "The dry run stopped. The app log names the cause; start it again."
|
||
},
|
||
"result": {
|
||
"days": "Days compared",
|
||
"changed": "Days moving more than 1 bpm",
|
||
"max": "Largest change",
|
||
"maxValue": "{value} bpm",
|
||
"bucket": "{range} bpm",
|
||
"account": "Account {account}",
|
||
"accountDays": "{changed} of {days} days move"
|
||
},
|
||
"appliedAt": "Weighted method applied on {at}.",
|
||
"dryRun": "Dry run",
|
||
"apply": "Apply",
|
||
"confirmTitle": "Apply the weighted pulse day mean?",
|
||
"confirmBody": "Every account's pulse days are then computed with sparse hours weighted. The stored pulse days are recalculated in the background, which can take a while on a large instance.",
|
||
"confirm": "Apply",
|
||
"cancel": "Cancel",
|
||
"dryRunStarted": "Dry run started.",
|
||
"applied": "Weighted method applied. The pulse days are being recalculated.",
|
||
"appliedNoRebuild": "Weighted method applied. Another run is still working, so apply again once it has finished to recalculate the pulse days.",
|
||
"error": {
|
||
"busy": "A dry run or recalculation is still running. Try again once it has finished.",
|
||
"dryRunRequired": "Run a dry run first. Applying needs one that finished in the last seven days.",
|
||
"generic": "The request did not go through."
|
||
},
|
||
"rebuild": {
|
||
"queued": "The recalculation is waiting for the background worker.",
|
||
"running": "The pulse days are being recalculated.",
|
||
"done": "Pulse days recalculated on {at} for {accounts} accounts.",
|
||
"failed": "The recalculation stopped. The app log names the cause; run it again."
|
||
},
|
||
"rebuildAgain": "Recalculate again",
|
||
"rebuildStarted": "Recalculation started."
|
||
}
|
||
},
|
||
"carrier": "Carrier",
|
||
"mfaRequired": "Require a second factor",
|
||
"mfaRequiredDescription": "Accounts without a second factor are sent to set one up after a web sign-in; API and native (Bearer) access stays open.",
|
||
"mfaEnforcedOn": "MFA on",
|
||
"mfaEnforcedOff": "MFA off",
|
||
"mfaEnforcedOnHint": "A second factor is required for this user. Click to stop requiring it.",
|
||
"mfaEnforcedOffHint": "Require a second factor for this user.",
|
||
"copyIp": "Copy IP address",
|
||
"ipCopied": "IP address copied",
|
||
"copyFailed": "Could not copy.",
|
||
"documentMaxFile": "Document upload limit",
|
||
"documentMaxFileDescription": "Per-file size cap for the document vault (1–100 MB).",
|
||
"documentQuota": "Document storage quota",
|
||
"documentQuotaDescription": "Default per-account document storage (0.1–1024 GB).",
|
||
"userDocumentQuota": "Document quota override",
|
||
"userDocumentQuotaDefault": "Default",
|
||
"userDocumentQuotaHint": "Leave empty to use the instance default.",
|
||
"centralCodex": {
|
||
"title": "Shared AI connection",
|
||
"description": "Connect one signed-in ChatGPT account that any user on this server can opt into for AI features.",
|
||
"honesty": "This is a single shared, signed-in AI account, not an API key. Every user who opts in sends requests through it, so the account's hourly and weekly limits are shared across all of them, and the same limits already feed the Coach. Subscription providers may use the content to improve their models and no data-processing agreement covers it, so it is never the default and stays below no-training providers for document reads. Only connect an account you are comfortable sharing this way.",
|
||
"statusConnected": "Connected",
|
||
"statusDisconnected": "Not connected",
|
||
"statusExpired": "Expired",
|
||
"connectButton": "Connect a ChatGPT account",
|
||
"disconnectButton": "Disconnect",
|
||
"disconnectTitle": "Disconnect the shared AI account?",
|
||
"disconnectBody": "Every user on this server who relies on the shared connection loses AI features until someone links an account again. The stored sign-in cannot be recovered.",
|
||
"disconnectConfirm": "Disconnect",
|
||
"connectedSince": "Connected since {when}",
|
||
"connected": "Shared AI connection linked",
|
||
"disconnected": "Shared AI connection removed",
|
||
"error": "Something went wrong. Please try again"
|
||
},
|
||
"failingJobs": {
|
||
"title": "Background jobs",
|
||
"description": "Queues whose jobs gave up after exhausting their retries.",
|
||
"none": "No job has failed in the last {hours} hours.",
|
||
"unavailable": "No job queue to read. This deployment runs without the background worker.",
|
||
"countOne": "{count} failure",
|
||
"countFew": "{count} failures",
|
||
"countOther": "{count} failures",
|
||
"lastFailed": "Last failure {when}"
|
||
},
|
||
"deleteAllDetail": "User accounts will be preserved.",
|
||
"cardError": {
|
||
"title": "This part of the page could not be shown",
|
||
"description": "The rest of the page still works; try again or reload if it keeps failing."
|
||
},
|
||
"keyMismatch": {
|
||
"title": "HealthLog cannot open its data",
|
||
"body": "The encryption key this server was started with is not the key its database was written with. To protect your data, HealthLog does not serve anything until this is fixed.",
|
||
"fixTitle": "How to fix it",
|
||
"fixRestore": "Put the original ENCRYPTION_KEY (or ENCRYPTION_KEYS entry) back into the server's settings.",
|
||
"fixDatabase": "Or point DATABASE_URL at the database that belongs to this key.",
|
||
"fixFresh": "Or start fresh with an empty database. The old data and its backups can only be read with the old key.",
|
||
"restartNote": "Restart HealthLog after the change.",
|
||
"lastResort": "Last resort, only if you are certain the key is right and none of the three applies: set {setting} and restart. HealthLog then serves anyway and only logs the finding. This disables a safety check: with a wrong key every encrypted value fails and new data is written under that key.",
|
||
"codes": "For the operator: API requests answer 503 with error code {code}, and /api/health reports reason {reason}."
|
||
},
|
||
"loginOverviewCardTitle": "Sign-in events",
|
||
"userColumn": "User",
|
||
"supportReport": {
|
||
"title": "Support report",
|
||
"description": "A summary of this instance for a bug report, without emails, IDs or values.",
|
||
"body": "Accounts appear as “Account 1”, “Account 2” and so on. Read the report before you share it.",
|
||
"copy": "Copy",
|
||
"copied": "Copied",
|
||
"download": "Download",
|
||
"loadError": "The support report could not be created."
|
||
},
|
||
"aiUsage": {
|
||
"title": "AI usage levels",
|
||
"description": "The highest level accounts may choose and the level they start at.",
|
||
"maxLabel": "Highest level",
|
||
"defaultLabel": "Default level",
|
||
"defaultAboveCeiling": "The default level cannot be above the highest level.",
|
||
"gapLabel": "Hours between card refreshes after a sync (Standard)",
|
||
"gapHint": "Whole hours from 1 to 48. Leave empty to use AI_SYNC_REGEN_GAP_HOURS, else 6. In effect now: {hours} h."
|
||
},
|
||
"recoveryKit": {
|
||
"title": "Recovery kit",
|
||
"description": "Every key a restore of this server needs, by id and fingerprint.",
|
||
"intro": "Keep a copy of each key below outside this server, for example in a password manager. Without them, neither a database dump nor a backup copy can be read again, and HealthLog refuses to start if a key it needs is missing.",
|
||
"loading": "Loading the recovery kit…",
|
||
"loadError": "Could not load the recovery kit.",
|
||
"badgeDue": "To do",
|
||
"badgeDone": "Saved",
|
||
"keyId": "Id",
|
||
"fingerprint": "Fingerprint",
|
||
"noFingerprint": "Not on this server",
|
||
"kind": {
|
||
"application": "Application key {id}",
|
||
"backup": "Off-host backup key",
|
||
"backupPrevious": "Previous off-host backup key",
|
||
"token": "Token key"
|
||
},
|
||
"need": {
|
||
"active": "Encrypts new data.",
|
||
"configured": "Held by this server.",
|
||
"storedCopies": "Needed by {count} stored copies.",
|
||
"offhostUntil": "Needed by off-host copies until {date}.",
|
||
"offhostUnknown": "Needed by off-host copies for as long as the bucket keeps them.",
|
||
"backupActive": "Seals every new off-host copy.",
|
||
"backupPrevious": "Opens off-host copies written before the last key change.",
|
||
"token": "Signs sessions, tokens and share links. Without it everyone is signed out, but no data is lost.",
|
||
"localDumps": "Needed by {count} database dumps on this server.",
|
||
"offhostDumpsUntil": "Needed by off-host database dumps until {date}.",
|
||
"offhostDumpsUnknown": "Needed by off-host database dumps for as long as the bucket keeps them."
|
||
},
|
||
"source": "Set in {variable}.",
|
||
"status": {
|
||
"confirmed": "Saved",
|
||
"new": "Not saved yet",
|
||
"notConfigured": "Not on this server",
|
||
"unreadable": "Not a valid key"
|
||
},
|
||
"notConfiguredHint": "A backup still needs this key and this server does not hold it. Only a copy you keep elsewhere can read those backups. Confirm the kit once you have that copy.",
|
||
"unreadableHint": "The variable is set but does not hold a valid key. Fix it before you rely on the off-host copies.",
|
||
"fingerprintHint": "A fingerprint is the first 12 characters of the SHA-256 hash of a key. It identifies the key without revealing it, so you can compare it with your copy.",
|
||
"whereTitle": "Where the keys are set",
|
||
"platform": {
|
||
"composeLabel": "Compose",
|
||
"composeWhere": "The keys are in the .env file next to docker-compose.yml: ENCRYPTION_KEY or ENCRYPTION_KEYS, API_TOKEN_HMAC_KEY and, with off-host copies, BACKUP_ENCRYPTION_KEY.",
|
||
"truenasLabel": "TrueNAS",
|
||
"truenasWhere": "Open Apps, select HealthLog and choose Edit. The keys are under HealthLog Configuration; in an app installed via YAML, they are ENCRYPTION_KEY, API_TOKEN_HMAC_KEY and BACKUP_ENCRYPTION_KEY in the environment settings.",
|
||
"coolifyLabel": "Coolify",
|
||
"coolifyWhere": "Open the application in Coolify and copy ENCRYPTION_KEY, API_TOKEN_HMAC_KEY and BACKUP_ENCRYPTION_KEY from its Environment Variables.",
|
||
"unraidLabel": "Unraid",
|
||
"unraidWhere": "On the Docker tab, edit the HealthLog container and copy ENCRYPTION_KEY, API_TOKEN_HMAC_KEY and BACKUP_ENCRYPTION_KEY from the template, or from the .env of your Compose Manager stack.",
|
||
"portainerLabel": "Portainer",
|
||
"portainerWhere": "Open the HealthLog stack in Portainer and copy ENCRYPTION_KEY, API_TOKEN_HMAC_KEY and BACKUP_ENCRYPTION_KEY from its environment variables."
|
||
},
|
||
"restoreTitle": "Restoring this server",
|
||
"restoreBody": "Install HealthLog with the same keys, restore the newest database dump into an empty database, then start the app. The guide walks through each step.",
|
||
"restoreLink": "Disaster recovery guide",
|
||
"checkLabel": "Check my copy",
|
||
"checkKeyLabel": "Key to check",
|
||
"checkValueLabel": "Your copy of the key",
|
||
"checkButton": "Check",
|
||
"checkNote": "The key you paste is compared with the one this server holds and then discarded. It is never stored or logged.",
|
||
"checkInsecureNote": "This page is not served over https://, so the key you paste crosses the network unencrypted, just like your password does. It is compared and discarded, never stored or logged.",
|
||
"checkMatches": "Your copy matches this key.",
|
||
"checkNoMatch": "Your copy does not match this key. Check that you copied the whole value.",
|
||
"checkFailed": "The check failed.",
|
||
"confirmButton": "I have a copy of every key",
|
||
"confirmed": "Recovery kit confirmed.",
|
||
"confirmFailed": "Could not save the confirmation.",
|
||
"stale": "The kit changed since this page loaded. Check the keys it lists now, then confirm again.",
|
||
"confirmedAt": "Confirmed on {date}.",
|
||
"confirmedAtBy": "Confirmed on {date} by {who}.",
|
||
"dueAgain": "The kit was confirmed on {date}. It now also lists {keys}, which that confirmation did not cover. Save a copy of each and confirm again."
|
||
},
|
||
"recoveryReadiness": {
|
||
"title": "Recovery readiness",
|
||
"description": "Whether this server could be put back after a loss, judged from every backup it makes.",
|
||
"loading": "Checking the backups…",
|
||
"loadError": "Could not load the recovery readiness.",
|
||
"state": {
|
||
"ok": "Ready",
|
||
"attention": "Needs attention",
|
||
"failing": "At risk"
|
||
},
|
||
"signal": {
|
||
"database_dump": "Database dump",
|
||
"weekly_copy": "Weekly account copies",
|
||
"offhost_copies": "Off-host copies",
|
||
"restore_drill": "Restore drill",
|
||
"offhost_setup": "Off-host backup",
|
||
"recovery_kit": "Recovery kit",
|
||
"dump_retention": "Dumps in the bucket"
|
||
},
|
||
"at": {
|
||
"database_dump": "Newest dump: {date}",
|
||
"weekly_copy": "Oldest account copy: {date}",
|
||
"offhost_copies": "Least recent off-host copy: {date}",
|
||
"restore_drill": "Last drill: {date}",
|
||
"recovery_kit": "Confirmed: {date}"
|
||
},
|
||
"dueBy": "Due by {date}",
|
||
"fix": {
|
||
"database_dump": "Open backups",
|
||
"weekly_copy": "Open backups",
|
||
"offhost_copies": "Open backups",
|
||
"restore_drill": "Open backups",
|
||
"offhost_setup": "Open backups",
|
||
"recovery_kit": "Open the kit",
|
||
"dump_retention": "Open backups"
|
||
},
|
||
"reason": {
|
||
"database_dump": {
|
||
"not_available": "This version does not schedule a database dump.",
|
||
"disabled": "The scheduled database dump is switched off, so no copy can rebuild this server. To turn it back on, remove DB_BACKUP_ENABLED or set it to true, then restart HealthLog.",
|
||
"unreadable": "The status of the database dump could not be read.",
|
||
"never_succeeded": "No database dump has succeeded yet, and the last attempt failed.",
|
||
"never_ran": "No database dump has been written in the {hours} hours since dumps were switched on.",
|
||
"first_pending": "The first database dump has not run yet.",
|
||
"stale": "The newest database dump is {hours} hours old.",
|
||
"last_failed": "The last database dump failed. The one before it is still recent.",
|
||
"fresh": "The newest database dump is recent.",
|
||
"nowhere_to_write": "The dump directory {directory} cannot be written to and no off-host bucket is set up, so no dump can be kept.",
|
||
"not_persistent": "The dump directory {directory} is not on persistent storage and no off-host bucket is set up, so every dump would be lost at the next update. Mount the backups volume.",
|
||
"fresh_offhost_only": "The newest database dump is recent and in the off-host bucket. None is kept on this server, because {directory} is not on persistent storage, and none is taken before a migration.",
|
||
"offhost_failed": "The newest database dump is kept on this server, but its upload to the off-host bucket failed.",
|
||
"offhost_stale": "No database dump has reached the off-host bucket for {hours} hours: the uploads keep failing. If this server is lost, there is no recent dump to rebuild it from.",
|
||
"offhost_never": "No database dump has ever reached the off-host bucket: the upload fails. If this server is lost, there is no dump to rebuild it from."
|
||
},
|
||
"weekly_copy": {
|
||
"no_accounts": "There are no accounts to copy yet.",
|
||
"stale": "The oldest weekly copy is {days} days old. Accounts behind: {accounts}.",
|
||
"never": "An account has had no weekly copy for {days} days. Accounts behind: {accounts}.",
|
||
"first_pending": "The first weekly copy is made early on Sunday.",
|
||
"fresh": "Every account has a copy from the last week."
|
||
},
|
||
"offhost_copies": {
|
||
"not_configured": "No off-host bucket is set up.",
|
||
"stale": "Off-host copies are more than two nights behind. Accounts behind: {accounts}.",
|
||
"first_pending": "The nightly off-host run has not reached any account yet.",
|
||
"fresh": "Every account has a recent copy in the off-host bucket."
|
||
},
|
||
"restore_drill": {
|
||
"not_configured": "The drill reads the off-host bucket, which is not set up.",
|
||
"not_run_yet": "The monthly restore drill has not run yet.",
|
||
"failed": "The last restore drill failed: {failed} of {checked} copies could not be read back.",
|
||
"failed_run": "The last restore drill could not finish.",
|
||
"passed": "The last restore drill read back {checked} copies.",
|
||
"nothing_checked": "The last restore drill stopped on its time limit before it read back a single copy, so it proved nothing."
|
||
},
|
||
"offhost_setup": {
|
||
"configured": "Copies leave this server every night.",
|
||
"no_admin": "There is no admin account yet.",
|
||
"not_configured": "No off-host bucket is set up, so every copy lives on this server only.",
|
||
"not_configured_grace": "No off-host bucket is set up yet, so every copy lives on this server only."
|
||
},
|
||
"recovery_kit": {
|
||
"confirmed": "A copy of every key a restore needs is kept.",
|
||
"out_of_date": "The recovery kit now also lists {keys}, which the last confirmation did not cover. Nothing is broken: save a copy and confirm the kit again.",
|
||
"no_admin": "There is no admin account yet.",
|
||
"not_confirmed": "Nobody has confirmed a copy of the keys a restore needs: {keys}.",
|
||
"not_confirmed_grace": "Save a copy of the keys a restore needs: {keys}."
|
||
},
|
||
"dump_retention": {
|
||
"not_configured": "No off-host bucket is set up.",
|
||
"no_offhost_dumps": "No database dump goes to the bucket.",
|
||
"missing": "No lifecycle rule in the bucket covers database/, so dumps there, and the deleted accounts inside them, are never removed. Add a rule for that prefix.",
|
||
"configured": "The bucket removes dumps after {days} days.",
|
||
"unknown": "The bucket does not say whether a rule removes old dumps. Check that a lifecycle rule covers database/."
|
||
}
|
||
},
|
||
"recovered": {
|
||
"database_dump": "The database dump is recent again.",
|
||
"weekly_copy": "Every account has a recent weekly copy again.",
|
||
"offhost_copies": "Every account has a recent off-host copy again.",
|
||
"restore_drill": "The restore drill passed again.",
|
||
"offhost_setup": "Off-host copies are set up now.",
|
||
"recovery_kit": "The recovery kit is confirmed again.",
|
||
"dump_retention": "A lifecycle rule in the bucket covers the database dumps now."
|
||
}
|
||
}
|
||
},
|
||
"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}",
|
||
"metricDaysOne": "{count} day",
|
||
"metricDaysFew": "{count} days",
|
||
"metricDaysOther": "{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."
|
||
},
|
||
"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."
|
||
},
|
||
"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 for 1 day",
|
||
"description": "Reach at least 80% 30-day adherence for 1 day."
|
||
},
|
||
"bmiGreen1": {
|
||
"title": "BMI green for 1 day",
|
||
"description": "Keep your BMI in the normal range for 1 day."
|
||
},
|
||
"bpGreen1": {
|
||
"title": "BP green for 1 day",
|
||
"description": "Keep your blood pressure in the normal range for 1 day."
|
||
},
|
||
"pulseGreen1": {
|
||
"title": "Pulse green for 1 day",
|
||
"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 for 7 days",
|
||
"description": "Reach at least 80% 30-day adherence for 7 consecutive days."
|
||
},
|
||
"bmiGreen7": {
|
||
"title": "BMI green for 7 days",
|
||
"description": "Keep your BMI in the normal range for 7 consecutive days."
|
||
},
|
||
"bpGreen7": {
|
||
"title": "BP green for 7 days",
|
||
"description": "Keep your blood pressure in the normal range for 7 consecutive days."
|
||
},
|
||
"pulseGreen7": {
|
||
"title": "Pulse green for 7 days",
|
||
"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 for 30 days",
|
||
"description": "Reach at least 80% 30-day adherence for 30 consecutive days."
|
||
},
|
||
"bmiGreen30": {
|
||
"title": "BMI green for 30 days",
|
||
"description": "Keep your BMI in the normal range for 30 consecutive days."
|
||
},
|
||
"bpGreen30": {
|
||
"title": "BP green for 30 days",
|
||
"description": "Keep your blood pressure in the normal range for 30 consecutive days."
|
||
},
|
||
"pulseGreen30": {
|
||
"title": "Pulse green for 30 days",
|
||
"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 for 180 days",
|
||
"description": "Reach at least 80% 30-day adherence for 180 consecutive days."
|
||
},
|
||
"bmiGreen180": {
|
||
"title": "BMI green for 180 days",
|
||
"description": "Keep your BMI in the normal range for 180 consecutive days."
|
||
},
|
||
"bpGreen180": {
|
||
"title": "BP green for 180 days",
|
||
"description": "Keep your blood pressure in the normal range for 180 consecutive days."
|
||
},
|
||
"pulseGreen180": {
|
||
"title": "Pulse green for 180 days",
|
||
"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 for 360 days",
|
||
"description": "Reach at least 80% 30-day adherence for 360 consecutive days."
|
||
},
|
||
"bmiGreen360": {
|
||
"title": "BMI green for 360 days",
|
||
"description": "Keep your BMI in the normal range for 360 consecutive days."
|
||
},
|
||
"bpGreen360": {
|
||
"title": "BP green for 360 days",
|
||
"description": "Keep your blood pressure in the normal range for 360 consecutive days."
|
||
},
|
||
"pulseGreen360": {
|
||
"title": "Pulse green for 360 days",
|
||
"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."
|
||
},
|
||
"missFree7": {
|
||
"title": "No dose missed in 7 days",
|
||
"description": "7 consecutive days without a missed dose."
|
||
},
|
||
"missFree30": {
|
||
"title": "No dose missed in 30 days",
|
||
"description": "30 consecutive days without a missed dose."
|
||
},
|
||
"missFree90": {
|
||
"title": "No dose missed in 90 days",
|
||
"description": "90 consecutive days without a missed dose."
|
||
},
|
||
"measurementWeeks4": {
|
||
"title": "Measuring routine",
|
||
"description": "4 consecutive weeks with measurements on at least 5 days each."
|
||
},
|
||
"selfContextComplete": {
|
||
"title": "Self-report maintained",
|
||
"description": "All four self-report fields filled in. The Coach knows your context."
|
||
},
|
||
"sleepLog7": {
|
||
"title": "Sleep log for 7 days",
|
||
"description": "Sleep data recorded on 7 consecutive days."
|
||
}
|
||
},
|
||
"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."
|
||
}
|
||
},
|
||
"notifications": {
|
||
"title": "Notifications",
|
||
"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 → Integrations 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 lookup at {host}, so every login IP address leaves this server. To resolve them locally instead, download the GeoLite2-City and GeoLite2-ASN databases with a free MaxMind account, mount the directory into the container, and point GEOLITE2_DIR at it. Steps: {docsUrl}",
|
||
"tlsPinChangedTitle": "TLS leaf certificate changed: {host}",
|
||
"tlsPinChangedBody": "The TLS leaf served by {host} now has SPKI pin {servedPin}, which is not in the known pin set. Pinned clients (the native app) will fail to connect once the old pin is gone. Re-extract the new leaf pin, add it to TLS_LEAF_SPKI_PINS and the native client's pin set, and ship a build before this certificate expires on {validTo}. See docs/ops/tls-cert-pin.md.",
|
||
"accountErasureRefusedTitle": "Account could not be erased: {username}",
|
||
"accountErasureRefusedBody": "The deletion window of {username} has ended, but the account is the last active guardian of a managed profile, so it was not erased. It stays locked. Add another guardian to the profile, delete the profile, or undo the deletion in Administration, Users.",
|
||
"accountErasureFailedBody": "The deletion window of {username} has ended, but erasing the account failed. It stays locked and is tried again every hour, after the other accounts due. The failing jobs card in Administration has the error."
|
||
},
|
||
"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.",
|
||
"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",
|
||
"detail": "Routes only through channels you've already configured (Telegram, ntfy, Web Push, Apple Push) and stays silent once you've logged today."
|
||
},
|
||
"coachNudge": {
|
||
"title": "Proactive Coach",
|
||
"description": "Reaches out when your data suggests a look at the Coach.",
|
||
"toggleAria": "Toggle proactive Coach nudges",
|
||
"statusOn": "Active",
|
||
"statusOff": "Off",
|
||
"groupsLabel": "Topics",
|
||
"groupMedication": "Medication",
|
||
"groupMedicationDesc": "Patchy intakes over the past week.",
|
||
"groupVitals": "Vitals",
|
||
"groupVitalsDesc": "Blood pressure, recovery, weight trend, sleep.",
|
||
"groupRoutine": "Routine",
|
||
"groupRoutineDesc": "Abrupt tracking stops and self-context check-ups.",
|
||
"frequencyLabel": "Frequency",
|
||
"frequencyWeekly": "At most once a week",
|
||
"frequencyBiweekly": "At most every two weeks",
|
||
"frequencyAria": "Select nudge frequency",
|
||
"enabledToast": "Proactive Coach nudges enabled.",
|
||
"disabledToast": "Proactive Coach nudges disabled.",
|
||
"saveError": "Could not save. Please try again later.",
|
||
"aiComposedLabel": "Let the Coach phrase the nudge",
|
||
"aiComposedDesc": "When a provider is available, the proactive nudge is written by the model instead of the fixed template. Off by default.",
|
||
"aiComposedAria": "Toggle AI-composed proactive nudge"
|
||
},
|
||
"lowStock": {
|
||
"title": "Low-stock alert",
|
||
"description": "Reports daily when a supply covers fewer days than this threshold.",
|
||
"toggleAria": "Toggle low-stock alerts",
|
||
"statusOn": "Active",
|
||
"statusOff": "Off",
|
||
"daysLabel": "Notify below (days)",
|
||
"daysAria": "Select the low-stock threshold in days",
|
||
"leadLabel": "Reorder lead time (days)",
|
||
"leadAria": "Reorder lead time in days",
|
||
"leadHelp": "The alert fires this many days plus one dose-interval earlier so a refill arrives before your last dose. A single medication can override this on its supply tab.",
|
||
"leadSavedToast": "Reorder lead time saved",
|
||
"savedToast": "Low-stock threshold saved",
|
||
"enabledToast": "Low-stock alerts enabled.",
|
||
"disabledToast": "Low-stock alerts disabled.",
|
||
"saveError": "Could not save. Please try again.",
|
||
"medicationsLink": "Go to your medications",
|
||
"detail": "One notification per shortage; it re-arms after a refill."
|
||
},
|
||
"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 adherence",
|
||
"eventComplianceLowDesc": "Sent when your adherence 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.",
|
||
"eventCyclePeriodSoon": "Period coming up",
|
||
"eventCyclePeriodSoonDesc": "Sent a couple of days before your predicted next period.",
|
||
"eventCyclePeriodConfirm": "Did your period start?",
|
||
"eventCyclePeriodConfirmDesc": "A gentle check-in on or after the predicted start while no period is logged.",
|
||
"eventCycleFertileSoon": "Fertile window coming up",
|
||
"eventCycleFertileSoonDesc": "Sent a few days before your estimated fertile window when your goal is trying to conceive.",
|
||
"eventMedicationLowStock": "Medication stock low",
|
||
"eventMedicationLowStockDesc": "When a tracked medication supply covers fewer days than your low-stock threshold",
|
||
"eventCoachNudge": "Coach nudge",
|
||
"eventCoachNudgeDesc": "Occasional prompt from your Coach when your recent trends warrant a check-in.",
|
||
"eventMeasurementReminder": "Measurement reminder",
|
||
"eventMeasurementReminderDesc": "Sent when a tracked measurement is due.",
|
||
"eventMedicationIntakeSync": "Medication intake sync",
|
||
"eventMedicationIntakeSyncDesc": "Cross-device update when a dose is logged, taken or skipped.",
|
||
"eventDailyBriefing": "Daily briefing",
|
||
"eventDailyBriefingDesc": "One calm morning summary of your day's read. Off until you turn it on.",
|
||
"eventSecurityAlert": "New sign-in",
|
||
"eventSecurityAlertDesc": "Sent when your account is used on a device or from a place we have not seen before.",
|
||
"eventSharedRecordIntake": "Someone you shared your record with marks a dose",
|
||
"eventSharedRecordIntakeDesc": "Only sent when another person does it, never for your own entries.",
|
||
"security": {
|
||
"newDeviceTitle": "New sign-in to your account",
|
||
"newDeviceBody": "A new sign-in from {device} ({location}). If this wasn't you, change your password immediately.",
|
||
"unknownLocation": "unknown location"
|
||
},
|
||
"sharedRecordIntake": {
|
||
"title": "{name} marked a dose",
|
||
"bodyTaken": "{medication}: marked as taken by {name}.",
|
||
"bodySkipped": "{medication}: marked as skipped by {name}."
|
||
},
|
||
"loginRequired": "Please sign in to manage notifications.",
|
||
"someChannelsGloballyDisabled": "One or more channels are turned off in Settings and won’t receive notifications.",
|
||
"reminderSettingsLink": "Reminder settings",
|
||
"channelsLink": "Channels",
|
||
"handover": {
|
||
"claimedTitle": "{name} now has their own account",
|
||
"claimedEnd": "{name} took over their health record. Your access has ended.",
|
||
"claimedRead": "{name} took over their health record. You can still view it, but no longer change it.",
|
||
"claimedManage": "{name} took over their health record. You can still manage it until they decide otherwise.",
|
||
"changedTitle": "{name} changed your access",
|
||
"changedEnd": "Your access to the health record of {name} has ended.",
|
||
"changedRead": "You can now view the health record of {name}, but not change it.",
|
||
"changedManage": "You can manage the health record of {name}.",
|
||
"unnamed": {
|
||
"claimedTitle": "The person you looked after now has their own account",
|
||
"claimedEnd": "The person you looked after took over their health record. Your access has ended.",
|
||
"claimedRead": "The person you looked after took over their health record. You can still view it, but no longer change it.",
|
||
"claimedManage": "The person you looked after took over their health record. You can still manage it until they decide otherwise.",
|
||
"changedTitle": "Your access to a health record changed",
|
||
"changedEnd": "Your access to the health record of the person you looked after has ended.",
|
||
"changedRead": "You can now view the health record of the person you looked after, but not change it.",
|
||
"changedManage": "You can manage the health record of the person you looked after."
|
||
}
|
||
},
|
||
"links": {
|
||
"open": "Open in HealthLog"
|
||
},
|
||
"quickActions": {
|
||
"moodGood": "Good",
|
||
"moodOkay": "Okay",
|
||
"moodBad": "Bad"
|
||
},
|
||
"content": {
|
||
"title": "Health figures in notifications",
|
||
"description": "Whether a notification may show values such as your morning score.",
|
||
"detail": "Off, a notification only says what it is about, so a lock screen shows no health figures. On, it adds the figures, for example the morning score in the briefing. Tapping a notification opens the right place in the app either way.",
|
||
"toggleAria": "Show health figures in notifications",
|
||
"statusDetailed": "Figures shown",
|
||
"statusGeneric": "Without figures",
|
||
"detailedToast": "Notifications now include health figures.",
|
||
"genericToast": "Notifications no longer include health figures.",
|
||
"saveError": "Could not save. Please try again later."
|
||
},
|
||
"checkupReminders": {
|
||
"title": "Checkup reminders",
|
||
"description": "Switch individual checkup reminders on or off."
|
||
},
|
||
"eventBackupHealth": "Backup health",
|
||
"eventBackupHealthDesc": "When a backup stops, falls behind or recovers. Sent to admins only.",
|
||
"recoveryReadiness": {
|
||
"titleAttention": "Backups need attention",
|
||
"titleFailing": "Backups are at risk",
|
||
"titleReminder": "Backups are still at risk",
|
||
"titleRecovered": "Backups are back to normal"
|
||
},
|
||
"systemJobAlert": {
|
||
"titleFailing": "Background job failing: {queue}",
|
||
"titleReminder": "Background job still failing: {queue}",
|
||
"titleRecovered": "Background job working again: {queue}",
|
||
"bodyFailing": "The background job {queue} has failed {failures} times in a row and is listed on the admin status page. Last error: {error}",
|
||
"bodyRecovered": "The background job {queue} has run successfully again."
|
||
}
|
||
},
|
||
"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",
|
||
"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"
|
||
}
|
||
},
|
||
"edit": {
|
||
"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",
|
||
"resetTitle": "Reset this target?",
|
||
"resetBody": "The range goes back to the default. The values you set are not stored anywhere else and cannot be brought back.",
|
||
"resetBodyBp": "Both the systolic and the diastolic range go back to the default. The values you set are not stored anywhere else and cannot be brought back.",
|
||
"resetConfirm": "Reset target",
|
||
"saveSuccess": "Target range updated",
|
||
"saveError": "Could not save the target range",
|
||
"resetSuccess": "Target range reset to default",
|
||
"validationOrder": "The minimum must be lower than the maximum.",
|
||
"validationBounds": "Enter values within the allowed range shown below."
|
||
},
|
||
"currentValue": "Current: {value} {unit}",
|
||
"targetRangeValue": "Target: {min}–{max} {unit}",
|
||
"sourceLabel": "Source: {source}",
|
||
"sourceNames": {
|
||
"moodEntries": "Mood entries",
|
||
"sevenDays": "7 days"
|
||
},
|
||
"inTarget": "Within target range",
|
||
"aboveTarget": "{delta} {unit} above target",
|
||
"belowTarget": "{delta} {unit} below target",
|
||
"systolic": "Systolic",
|
||
"diastolic": "Diastolic",
|
||
"glucoseFasting": "Glucose (fasting)",
|
||
"glucosePostprandial": "Glucose (post-meal)",
|
||
"glucoseRandom": "Glucose (random)",
|
||
"glucoseBedtime": "Glucose (bedtime)",
|
||
"glucoseUnspecified": "Glucose (untagged)",
|
||
"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",
|
||
"belowTypicalRange": "Below typical range",
|
||
"elevated": "Elevated",
|
||
"aboveTypicalRange": "Above typical range",
|
||
"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.",
|
||
"moodLogged": "Logged: {score}/5",
|
||
"moodNotePrompt": "Add a short note (optional).",
|
||
"moodNoteSaved": "Note saved.",
|
||
"moodNoteExpired": "That prompt has expired.",
|
||
"remindLater": "Reminder postponed for {duration}.",
|
||
"measurementDone": "Marked as done.",
|
||
"measurementNotFound": "Reminder not found.",
|
||
"buttonMoodNote": "Note…",
|
||
"buttonLater": "Later",
|
||
"buttonDone": "Done",
|
||
"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 <name>: 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",
|
||
"measureValuePrompt": "Reply with the value to log it (optional).",
|
||
"buttonMeasureValue": "Value…",
|
||
"measureValueSaved": "Reading saved.",
|
||
"measureValueInvalid": "Reply with a number to log a reading.",
|
||
"measureValueOutOfRange": "That value is outside the plausible range.",
|
||
"measureValueExpired": "That prompt has expired."
|
||
},
|
||
"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"
|
||
},
|
||
"lowStockReminders": {
|
||
"title": "Low supply: {medName}",
|
||
"bodyToday": "{medName}: {units} units left, less than one day of supply.",
|
||
"bodyReorder": "{medName}: {units} units left. Supply runs out around {runsOutOn}. Reorder by {reorderBy}.",
|
||
"bodyLastDose": "{medName}: {units} units left, about your final dose. Supply runs out around {runsOutOn}.",
|
||
"bodyExpired": "{medName}: no usable supply left. {units} units are marked expired.",
|
||
"bodyAsNeeded": "{medName}: only {units} units left. Reorder before you need the next dose."
|
||
},
|
||
"moodReminders": {
|
||
"dailyTitle": "Log your mood",
|
||
"dailyBody": "How are you feeling today?"
|
||
},
|
||
"coachNudges": {
|
||
"greetingMorning": "Good morning",
|
||
"greetingMorningNamed": "Good morning, {name}",
|
||
"greetingHey": "Hey there",
|
||
"greetingHeyNamed": "Hey {name}",
|
||
"complianceBody": "Your medication routine slipped a little this week. If you like, we can look at what would make it easier to keep up.",
|
||
"bpBody": "Your blood pressure has been running a touch above your usual range this week. Whenever you're ready, I'm happy to look at it with you.",
|
||
"scoreBody": "Your recovery has been easing off over the last few days. If you're curious what's behind it, I'm here to talk it through.",
|
||
"selfContextBody": "It's been a while since your self-description was updated. When you have a moment, refreshing it helps me understand you better.",
|
||
"weightBody": "Your weight has drifted a little from your target range lately. If you'd like, we can take stock together, calmly.",
|
||
"sleepDebtBody": "Several of your nights came up short this week. If you want, we can look for a pattern together.",
|
||
"measurementGapBody": "Your log has been quiet for about a week. Whenever it suits you, a quick check-in helps you pick things back up.",
|
||
"focusNote": "It also ties into what you said you wanted to keep an eye on.",
|
||
"reminderSurfacedTitle": "The reminder you asked for",
|
||
"reminderSurfacedLeadOne": "You asked me to bring this back to you today:",
|
||
"reminderSurfacedLeadMany": "You asked me to bring {count} things back to you today:",
|
||
"questionConditions": "Do you have any chronic conditions the Coach should know about?",
|
||
"questionFocus": "Is there anything specific the Coach should pay attention to?",
|
||
"questionAllergies": "Do you have any allergies or intolerances?",
|
||
"questionAboutMe": "Want to tell the Coach a bit about yourself: routines, goals, context?"
|
||
},
|
||
"clinicianView": {
|
||
"title": "Shared health record",
|
||
"period": "Reporting period: {start}–{end}",
|
||
"expires": "This link expires on {date}.",
|
||
"provenance": "This is a read-only summary shared by the person it belongs to, exported from their self-tracked HealthLog data. Values are self-recorded and may include device-synced readings; treat them as patient-reported, not as a clinical examination.",
|
||
"labs": "Lab values",
|
||
"medications": "Medications & adherence",
|
||
"bmi": "Body mass index (BMI)",
|
||
"statSummary": "latest {latest} (avg {avg}, range {min}–{max})",
|
||
"statSummaryWithUnit": "latest {latest} {unit} (avg {avg} {unit}, range {min}–{max} {unit})",
|
||
"adherence": "{rate} adherence",
|
||
"noAdherence": "—",
|
||
"glucose": {
|
||
"FASTING": "Glucose (fasting)",
|
||
"POSTPRANDIAL": "Glucose (postprandial)",
|
||
"RANDOM": "Glucose (random)",
|
||
"BEDTIME": "Glucose (bedtime)"
|
||
},
|
||
"wellness": {
|
||
"title": "Wellness scores",
|
||
"disclaimer": "Descriptive scores (0–100) computed from tracked signals. These are not a clinical assessment and not a diagnosis.",
|
||
"recovery": "Recovery score",
|
||
"stress": "Stress score",
|
||
"strain": "Strain score",
|
||
"score": "Wellness score"
|
||
},
|
||
"footer": "Shared from HealthLog, a self-hosted personal health tracker.",
|
||
"unlock": {
|
||
"title": "Enter passphrase",
|
||
"description": "This shared health record is protected. Enter the passphrase you were given to view it.",
|
||
"label": "Passphrase",
|
||
"error": "That passphrase is not correct.",
|
||
"submit": "Unlock"
|
||
},
|
||
"loadError": {
|
||
"title": "This shared view could not be loaded",
|
||
"description": "Something went wrong while opening this shared health record. The link may have expired, or there was a temporary problem. Try again, or ask the person who shared it for a new link.",
|
||
"retry": "Try again"
|
||
},
|
||
"documents": {
|
||
"title": "Documents",
|
||
"untitled": "Untitled document",
|
||
"download": "Download",
|
||
"attachmentHint": "This file downloads to your device (no in-page preview).",
|
||
"exifNote": "Camera metadata (EXIF/GPS) has been removed from shared JPEG, PNG and WebP images."
|
||
},
|
||
"downloadPdf": "Download as PDF",
|
||
"downloadFhir": "Download as FHIR",
|
||
"bmiSection": "Body mass index",
|
||
"sectionEmpty": "Included in this link, but nothing is recorded here.",
|
||
"sectionUnavailable": "Included in this link, but this part of the record is switched off in the account it comes from, so it holds no data.",
|
||
"lastInjection": "Last injection",
|
||
"identity": {
|
||
"name": "Name"
|
||
},
|
||
"doses": {
|
||
"title": "Logged doses",
|
||
"showing": "Showing the {shown} most recent of {total} logged doses."
|
||
},
|
||
"course": "Course {n}",
|
||
"courseRange": "{start} to {end}",
|
||
"courseSince": "since {start}",
|
||
"unavailable": {
|
||
"title": "Link expired or invalid",
|
||
"description": "This share link has expired, was revoked, or is incomplete. Ask the person who shared it for a new link."
|
||
}
|
||
},
|
||
"cycle": {
|
||
"symptomCategory": {
|
||
"physical": "Physical",
|
||
"emotional": "Emotional",
|
||
"digestive": "Digestive",
|
||
"custom": "Custom"
|
||
},
|
||
"symptom": {
|
||
"cramps": "Cramps",
|
||
"headache": "Headache",
|
||
"bloating": "Bloating",
|
||
"acne": "Acne",
|
||
"breastTenderness": "Breast tenderness",
|
||
"fatigue": "Fatigue",
|
||
"backPain": "Back pain",
|
||
"insomnia": "Insomnia",
|
||
"libidoHigh": "High libido",
|
||
"libidoLow": "Low libido",
|
||
"moodSwings": "Mood swings",
|
||
"foodCravings": "Food cravings",
|
||
"nausea": "Nausea",
|
||
"diarrhea": "Diarrhea",
|
||
"constipation": "Constipation",
|
||
"custom": {
|
||
"add": "Add symptom",
|
||
"label": "Name",
|
||
"labelPlaceholder": "e.g. Dizziness",
|
||
"icon": "Icon",
|
||
"limitReached": "Custom symptom limit reached.",
|
||
"remove": "Remove {label}",
|
||
"removeTitle": "Remove this symptom?",
|
||
"removeBody": "“{label}” disappears from the symptom list. Days you already tagged with it keep it, but you cannot pick it again.",
|
||
"removeConfirm": "Remove",
|
||
"fallbackLabel": "Custom symptom"
|
||
}
|
||
},
|
||
"prediction": {
|
||
"disclaimer": "Predictions are estimates from your logged data, not medical advice or contraception. Accuracy improves as you log more cycles."
|
||
},
|
||
"insights": {
|
||
"headline": {
|
||
"title": "Your cycle and your body",
|
||
"restingHeartRate": "Your resting heart rate runs about {delta} {dir} in your luteal phase than your follicular phase.",
|
||
"heartRateVariability": "Your heart-rate variability runs about {delta} {dir} in your luteal phase than your follicular phase.",
|
||
"generic": "Your {metric} runs about {delta} {dir} in your luteal phase than your follicular phase.",
|
||
"dirHigher": "higher",
|
||
"dirLower": "lower",
|
||
"empty": "Not enough cycles and readings yet to surface a phase pattern. Keep logging; this fills in as your history grows."
|
||
},
|
||
"crosstab": {
|
||
"description": "How each measurement compares between your luteal and follicular phases, on your own data.",
|
||
"pairLabel": "{metric}: luteal vs follicular",
|
||
"detail": "Luteal {lutealAvg} ({lutealDays} days) vs follicular {follicularAvg} ({follicularDays} days).",
|
||
"metricRestingHeartRate": "Resting heart rate",
|
||
"metricHrv": "Heart-rate variability",
|
||
"metricSleepDuration": "Sleep duration",
|
||
"metricSteps": "Steps",
|
||
"metricWeight": "Weight",
|
||
"metricBasalBodyTemp": "Basal body temperature",
|
||
"metricWristTemperature": "Overnight wrist temperature",
|
||
"metricSkinTemperature": "Skin temperature",
|
||
"metricBloodGlucose": "Blood glucose",
|
||
"metricMood": "Mood"
|
||
},
|
||
"title": "Cycle insights",
|
||
"symptomPatternsTitle": "Symptom patterns by phase",
|
||
"symptomPatternsEmpty": "Log symptoms across a cycle to see which phase they cluster in.",
|
||
"symptomMostlyIn": "Mostly in {phase} ({count}/{total} days)"
|
||
},
|
||
"phaseEducation": {
|
||
"title": "What's happening now",
|
||
"whatsHappening": {
|
||
"MENSTRUAL": "Your period is the start of a new cycle, as the uterine lining sheds. Energy and mood often feel lower in these first days.",
|
||
"FOLLICULAR": "After your period, oestrogen gradually rises as the body prepares an egg. Many people notice steadier energy through this stretch.",
|
||
"OVULATORY": "Around mid-cycle an egg is released and fertility peaks for a short window. This phase is the briefest of the four.",
|
||
"LUTEAL": "After ovulation, progesterone rises and the body settles in. In the days before your next period some people notice premenstrual changes."
|
||
},
|
||
"context": {
|
||
"MENSTRUAL": "Hormone levels are at their lowest, which is why these days can feel like a quiet reset. Some people notice cramps, lighter sleep or a wish to slow down; others sail through with little change. All of that sits within the normal range, and how it feels can shift from one cycle to the next.",
|
||
"FOLLICULAR": "With oestrogen on the rise, many people describe these days as bright and open: sleep often comes more easily and the mind feels clearer. Basal body temperature usually stays in its lower band until just before ovulation. The length of this phase varies most from person to person, and from cycle to cycle.",
|
||
"OVULATORY": "Oestrogen peaks just before the egg is released, often alongside a brief lift in mood and a small rise in basal body temperature in the day or two that follow. Cervical fluid tends to become clearer and more stretchy around this window. A short twinge on one side is something some people notice; many feel nothing at all, and both are perfectly normal.",
|
||
"LUTEAL": "Progesterone leads the second half and basal body temperature usually settles a little higher than earlier in the cycle. Some people notice shifts in sleep, appetite, mood or energy as the days go on, while others feel steady throughout. The pattern is personal, and it often looks different from one month to the next."
|
||
},
|
||
"commonHere": "You often notice this here",
|
||
"stillLearning": "Still learning your cycle. Keep logging and this fills in with patterns from your own days."
|
||
},
|
||
"insightsSummary": {
|
||
"title": "Your cycle",
|
||
"currentDay": "Day {day} of your cycle",
|
||
"noActiveCycle": "No active cycle yet",
|
||
"viewDetails": "View cycle insights"
|
||
},
|
||
"wellnessRing": {
|
||
"label": "Cycle",
|
||
"loadError": "Could not load your cycle."
|
||
},
|
||
"disclaimer": "These predictions are descriptive estimates from your logged data, not a contraceptive method and not medical advice. They never indicate that it is safe to have unprotected sex. For contraception or any medical decision, consult a healthcare professional.",
|
||
"title": "Your cycle",
|
||
"subtitle": "Log your period and symptoms, see what comes next.",
|
||
"tabs": {
|
||
"calendar": "Calendar",
|
||
"predictions": "Predictions",
|
||
"insights": "Insights",
|
||
"settings": "Settings"
|
||
},
|
||
"logToday": "Log today",
|
||
"startedPeriod": "Started my period today",
|
||
"endedPeriod": "Ended my period today",
|
||
"phase": {
|
||
"MENSTRUAL": "Menstrual",
|
||
"FOLLICULAR": "Follicular",
|
||
"OVULATORY": "Ovulatory",
|
||
"LUTEAL": "Luteal",
|
||
"none": "No phase",
|
||
"label": "Phase"
|
||
},
|
||
"flow": {
|
||
"NONE": "None",
|
||
"SPOTTING": "Spotting",
|
||
"LIGHT": "Light",
|
||
"MEDIUM": "Medium",
|
||
"HEAVY": "Heavy",
|
||
"label": "Flow"
|
||
},
|
||
"ovulationTest": {
|
||
"NEGATIVE": "Negative",
|
||
"POSITIVE_LH_SURGE": "LH surge",
|
||
"ESTROGEN_SURGE": "Estrogen surge",
|
||
"INDETERMINATE": "Indeterminate",
|
||
"label": "Ovulation test"
|
||
},
|
||
"mucus": {
|
||
"DRY": "Dry",
|
||
"STICKY": "Sticky",
|
||
"CREAMY": "Creamy",
|
||
"WATERY": "Watery",
|
||
"EGG_WHITE": "Egg white",
|
||
"label": "Cervical mucus"
|
||
},
|
||
"cervixPosition": {
|
||
"LOW": "Low",
|
||
"HIGH": "High"
|
||
},
|
||
"cervixFirmness": {
|
||
"FIRM": "Firm",
|
||
"SOFT": "Soft"
|
||
},
|
||
"cervixOpening": {
|
||
"CLOSED": "Closed",
|
||
"OPEN": "Open"
|
||
},
|
||
"goal": {
|
||
"GENERAL_HEALTH": "General health",
|
||
"AVOID_PREGNANCY": "Avoiding pregnancy",
|
||
"TRYING_TO_CONCEIVE": "Trying to conceive",
|
||
"PERIMENOPAUSE": "Perimenopause",
|
||
"OFF": "Tracking off",
|
||
"label": "What are you tracking for?",
|
||
"description": "This shapes the language and which predictions you see. Fertile-window guidance shows only when you are trying to conceive."
|
||
},
|
||
"ring": {
|
||
"dayOfCycle": "Day {day}",
|
||
"dayUnknown": "—",
|
||
"ariaPhase": "Cycle day {day}, {phase} phase",
|
||
"ariaUnknown": "No active cycle yet",
|
||
"caption": "of your cycle",
|
||
"firstPeriodCta": "Log my first period",
|
||
"periodOverdue": "Your period is later than usual. The day count pauses until the next period is logged.",
|
||
"periodOverdueDays": "Your period is {days} days later than usual. The day count pauses until the next period is logged.",
|
||
"logPeriodCta": "Log period"
|
||
},
|
||
"calendar": {
|
||
"legendPeriod": "Logged period",
|
||
"legendPredicted": "Predicted period",
|
||
"legendFertile": "Fertile window",
|
||
"legendOvulation": "Ovulation",
|
||
"legendSymptoms": "Symptoms logged",
|
||
"prevMonth": "Previous month",
|
||
"nextMonth": "Next month",
|
||
"loading": "Loading your calendar…",
|
||
"learning": "Learning your cycle. Log at least three full cycles and the fertile window, ovulation and phases fill in. Until then the calendar shows only what you've logged.",
|
||
"legendSymptom": "Symptoms",
|
||
"legendOvulationConfirmed": "Confirmed ovulation",
|
||
"flowSpotting": "spotting",
|
||
"flowLight": "light",
|
||
"flowMedium": "medium",
|
||
"flowHeavy": "heavy",
|
||
"legendIntercourse": "Intercourse",
|
||
"legendOtherEntries": "Other entries"
|
||
},
|
||
"predictions": {
|
||
"title": "What comes next",
|
||
"nextPeriod": "Next period",
|
||
"nextPeriodWindow": "{low}–{high}",
|
||
"fertileWindow": "Fertile window",
|
||
"ovulation": "Estimated ovulation",
|
||
"confidenceHigh": "High",
|
||
"confidenceMedium": "Medium",
|
||
"confidenceLow": "Low",
|
||
"stillLearning": "Still learning",
|
||
"stillLearningBody": "Log at least three full cycles and your predictions sharpen. Until then this is a rough estimate.",
|
||
"rawMode": "Prediction is off",
|
||
"rawModeBody": "You turned predictions off. Only your logged data is shown, with no forecast.",
|
||
"none": "No prediction yet. Log a period to get started.",
|
||
"ovulationConfirmed": "Ovulation (confirmed)"
|
||
},
|
||
"history": {
|
||
"title": "Your cycles",
|
||
"avgLength": "Average length",
|
||
"variability": "Variability",
|
||
"avgPeriodLength": "Average period",
|
||
"regularity": "Regularity",
|
||
"regularityREGULAR": "Regular",
|
||
"regularityIRREGULAR": "Irregular",
|
||
"regularityLEARNING": "Learning",
|
||
"days": "{count} days",
|
||
"daysPlusMinus": "± {count} days",
|
||
"none": "No cycles recorded yet.",
|
||
"recentCycles": "Recent cycles",
|
||
"ongoing": "ongoing",
|
||
"periodDays": "period {count} d",
|
||
"ovulationChip": "Ovulation",
|
||
"chartTitle": "Cycle length over time",
|
||
"chartCaption": "Each bar is one cycle: the rose base is your period, the rest is the cycle length.",
|
||
"chartAria": "Cycle-length chart of your last {count} cycles, averaging {avg} days, classified as {regularity}.",
|
||
"legendPeriodSegment": "Period days",
|
||
"legendRestSegment": "Rest of cycle"
|
||
},
|
||
"sheet": {
|
||
"title": "Log your day",
|
||
"description": "Flow, symptoms and notes for this day.",
|
||
"flow": "Flow",
|
||
"symptoms": "Symptoms",
|
||
"temperature": "Basal body temperature",
|
||
"temperatureDisturbed": "Mark reading as disturbed",
|
||
"temperatureDisturbedHint": "Fever, illness, alcohol or a late measurement: excluded from the temperature evaluation.",
|
||
"ovulationTest": "Ovulation test",
|
||
"mucus": "Cervical mucus",
|
||
"cervix": "Cervix",
|
||
"cervixPosition": "Position",
|
||
"cervixFirmness": "Firmness",
|
||
"cervixOpening": "Opening",
|
||
"intercourse": "Intercourse",
|
||
"protected": "Protected",
|
||
"intermenstrualBleeding": "Spotting between periods",
|
||
"pregnancyTest": "Pregnancy test",
|
||
"progesteroneTest": "Progesterone test",
|
||
"contraceptive": "Contraceptive",
|
||
"severity": "Severity",
|
||
"severityLevel": "Severity {level} of 4",
|
||
"delete": "Delete",
|
||
"deleteTitle": "Delete this day?",
|
||
"deleteBody": "Everything logged for this day goes: flow, temperature, symptoms and your note. There is no way to bring it back.",
|
||
"deleteConfirm": "Delete day",
|
||
"note": "Note",
|
||
"notePlaceholder": "Anything you want to remember about today…",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"cancel": "Cancel",
|
||
"saveError": "Could not save. Try again.",
|
||
"emptyHint": "Pick a flow or a symptom to save this day, or use the period start button above.",
|
||
"temperatureSection": "Temperature & ovulation",
|
||
"intimacySection": "Intimacy & contraception",
|
||
"testsSection": "Tests",
|
||
"phaseDayHeader": "Day {day}, {phase}",
|
||
"bbtHint": "Take it first thing in the morning, before getting up.",
|
||
"titleForDate": "Log for {date}",
|
||
"descriptionToday": "Today. Flow, symptoms and notes.",
|
||
"deleteBodyCycleStart": "This day opens a cycle. Deleting it takes the period start with it, so the previous cycle runs on as before. Everything logged here goes too: flow, temperature, symptoms and your note. There is no way to bring it back."
|
||
},
|
||
"testResult": {
|
||
"POSITIVE": "Positive",
|
||
"NEGATIVE": "Negative",
|
||
"INDETERMINATE": "Unclear"
|
||
},
|
||
"settings": {
|
||
"title": "Cycle settings",
|
||
"typicalCycleLength": "Typical cycle length (days)",
|
||
"typicalPeriodLength": "Typical period length (days)",
|
||
"lutealPhaseLength": "Luteal phase length (days)",
|
||
"priorsDescription": "These priors help your predictions before you have logged many cycles. Leave blank to use the defaults.",
|
||
"rawChartMode": "Raw chart mode",
|
||
"rawChartModeDescription": "Show only your logged data with no predictions or interpretation.",
|
||
"secondarySymptomLabel": "Secondary fertility sign",
|
||
"secondarySymptomDescription": "The second sign paired with your temperature for the symptothermal double-check. Most people track cervical mucus; switch to cervix observation if you prefer.",
|
||
"secondarySymptomCitation": "Read about the method (study)",
|
||
"secondarySymptom": {
|
||
"MUCUS": "Cervical mucus",
|
||
"CERVIX": "Cervix observation"
|
||
},
|
||
"prediction": "Predictions",
|
||
"predictionDescription": "Forecast your next period and, when relevant, your fertile window.",
|
||
"encryption": "Encrypt sensitive entries",
|
||
"encryptionDescription": "Encrypt intent-revealing fields (pregnancy tests, contraception, intercourse) at rest, on top of the always-encrypted notes.",
|
||
"discreet": "Discreet notifications",
|
||
"discreetDescription": "Hide cycle details from notification text on your lock screen.",
|
||
"saved": "Settings saved",
|
||
"saveError": "Could not save. Try again.",
|
||
"save": "Save",
|
||
"reminders": "Reminders",
|
||
"remindersDescription": "Turn period reminders on per channel in notification settings.",
|
||
"remindersLink": "Notification settings",
|
||
"fertileReminder": "Fertile-window reminder",
|
||
"fertileReminderDescription": "Get a heads-up a few days before your estimated fertile window. Off by default; turn it on per channel in notification settings."
|
||
},
|
||
"contraceptive": {
|
||
"NONE": "None",
|
||
"UNSPECIFIED": "Other",
|
||
"IMPLANT": "Implant",
|
||
"INJECTION": "Injection",
|
||
"IUD": "IUD",
|
||
"INTRAVAGINAL_RING": "Ring",
|
||
"ORAL": "Pill",
|
||
"PATCH": "Patch",
|
||
"EMERGENCY": "Emergency"
|
||
},
|
||
"loadError": "Couldn't load your cycle data.",
|
||
"saveError": "Couldn't save your cycle entry.",
|
||
"deleteError": "Couldn't delete the entry.",
|
||
"bbt": {
|
||
"title": "Basal body temperature",
|
||
"caption": "Your morning temperature across this cycle. A sustained rise of about 0.2 °C follows ovulation.",
|
||
"empty": "No temperature readings yet",
|
||
"emptyHint": "Log your basal body temperature each morning to see your cycle's temperature shift.",
|
||
"ovulationEstimate": "Est. ovulation",
|
||
"tooltipTemp": "{temp} {unit}",
|
||
"ovulationConfirmed": "Confirmed ovulation"
|
||
},
|
||
"fieldInfo": {
|
||
"bbt": "Your resting temperature, taken first thing in the morning before getting up. It rises slightly (about 0.2–0.3 °C) after ovulation.",
|
||
"bbtLabel": "What is basal body temperature?",
|
||
"mucus": "Vaginal discharge changes across the cycle, from dry or sticky to creamy, then watery and egg-white-like around the most fertile days.",
|
||
"mucusLabel": "What is cervical mucus?",
|
||
"ovulationTest": "A home urine test that detects the LH surge, the hormone spike about 24–36 h before ovulation. A positive flags the most fertile window.",
|
||
"ovulationTestLabel": "What is an ovulation test?",
|
||
"spotting": "Light bleeding outside the period.",
|
||
"spottingLabel": "What is spotting between periods?",
|
||
"pregnancyTest": "Result of a home pregnancy (hCG) test.",
|
||
"pregnancyTestLabel": "What is a pregnancy test?",
|
||
"progesteroneTest": "A test confirming ovulation has occurred; progesterone rises afterward.",
|
||
"progesteroneTestLabel": "What is a progesterone test?",
|
||
"intercourse": "Whether sexual intercourse took place on this day.",
|
||
"intercourseLabel": "What does intercourse track?",
|
||
"protected": "Whether contraception was used during intercourse.",
|
||
"protectedLabel": "What does protected mean?"
|
||
},
|
||
"saveSuccess": "Entry saved",
|
||
"deleteSuccess": "Entry deleted",
|
||
"periodStartSaved": "Period start saved",
|
||
"periodEndSaved": "End of period saved",
|
||
"startedPeriodOnDate": "My period started this day",
|
||
"endedPeriodOnDate": "My period ended this day",
|
||
"startAbsorbed": "Period start saved. Your start on {absorbed} was merged into {date}.",
|
||
"startRestored": "Saved. The start on {dates} is back."
|
||
},
|
||
"cycleReminders": {
|
||
"periodSoonTitle": "Period likely soon",
|
||
"periodSoonBody": "Your next period is predicted in about two days.",
|
||
"periodConfirmTitle": "Did your period start?",
|
||
"periodConfirmBody": "Your period was predicted around now. Log it to keep predictions accurate.",
|
||
"fertileSoonTitle": "Fertile window coming up",
|
||
"fertileSoonBody": "Your estimated fertile window is predicted to start in about two days. This is an estimate, not a medical or contraceptive guarantee.",
|
||
"discreetTitle": "HealthLog reminder",
|
||
"discreetBody": "You have a reminder in HealthLog."
|
||
},
|
||
"dataList": {
|
||
"allSources": "All sources",
|
||
"dateFrom": "From",
|
||
"dateTo": "To",
|
||
"dateRange": "Date range",
|
||
"valueRange": "Value",
|
||
"valueMin": "Min",
|
||
"valueMax": "Max",
|
||
"typeLabel": "Type",
|
||
"sourceLabel": "Source",
|
||
"resetFilters": "Reset",
|
||
"clearFilter": "Clear filter: {label}",
|
||
"selectAll": "Select all on this page",
|
||
"selectRow": "Select row",
|
||
"selected": "{count} selected",
|
||
"deleteN": "Delete ({count})",
|
||
"clearSelection": "Clear selection",
|
||
"selectionBarLabel": "Selection actions"
|
||
},
|
||
"measurementReminders": {
|
||
"sectionTitle": "Checkups",
|
||
"sectionDescription": "Reminders for what to measure or check, when, and where.",
|
||
"markDone": "Done",
|
||
"delete": "Delete",
|
||
"deleteConfirmTitle": "Delete reminder?",
|
||
"deleteConfirmDescription": "This checkup reminder will be permanently deleted.",
|
||
"postpone": {
|
||
"menuItem": "Postpone…",
|
||
"title": "Postpone due date",
|
||
"description": "Only moves the current due date; the regular rhythm stays unchanged.",
|
||
"chip": "+{days} days",
|
||
"dateLabel": "New date",
|
||
"confirm": "Postpone"
|
||
},
|
||
"skip": {
|
||
"heading": "Skip this due date",
|
||
"explainer": "Recorded honestly as skipped, not as done. The interval restarts from today.",
|
||
"action": "Skip",
|
||
"confirmTitle": "Skip this due date?"
|
||
},
|
||
"snoozedUntil": "Postponed until {date}",
|
||
"skippedOn": "Skipped on {date}",
|
||
"skipCount": "skipped {count}×",
|
||
"disabledBadge": "Off",
|
||
"nextDue": {
|
||
"none": "Not scheduled",
|
||
"today": "Due today",
|
||
"tomorrow": "Due tomorrow",
|
||
"inDays": "In {days} days"
|
||
},
|
||
"overdueByDays": "Overdue by {days} days",
|
||
"overdueSinceYesterday": "Overdue since yesterday",
|
||
"cadence": {
|
||
"everyNDays": "Every {days} days",
|
||
"custom": "Custom schedule",
|
||
"customInterval": "Custom (every N days)",
|
||
"rruleOption": "Custom rule (RRULE)"
|
||
},
|
||
"location": {
|
||
"prefix": "At: {location}"
|
||
},
|
||
"types": {
|
||
"WEIGHT": "Weight",
|
||
"BLOOD_PRESSURE_SYS": "Blood pressure",
|
||
"PULSE": "Pulse",
|
||
"BLOOD_GLUCOSE": "Blood glucose",
|
||
"OXYGEN_SATURATION": "Oxygen saturation",
|
||
"BODY_FAT": "Body fat",
|
||
"BODY_TEMPERATURE": "Body temperature",
|
||
"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",
|
||
"VISCERAL_FAT": "Visceral fat",
|
||
"BODY_MASS_INDEX": "Body mass index (BMI)",
|
||
"WAIST_CIRCUMFERENCE": "Waist circumference",
|
||
"PHQ9_SCORE": "PHQ-9 (mood)",
|
||
"GAD7_SCORE": "GAD-7 (worry)",
|
||
"WHO5_SCORE": "WHO-5 (wellbeing)",
|
||
"SCI_SCORE": "SCI (sleep)"
|
||
},
|
||
"typeGroups": {
|
||
"vitals": "Vitals",
|
||
"bodyComposition": "Body composition",
|
||
"mentalWellbeing": "Mental wellbeing"
|
||
},
|
||
"empty": {
|
||
"title": "No reminders yet",
|
||
"description": "Add a reminder to measure your blood pressure on a cadence, or to schedule an annual blood panel."
|
||
},
|
||
"form": {
|
||
"label": "Label",
|
||
"labelPlaceholder": "e.g. Measure blood pressure",
|
||
"kind": "Type",
|
||
"kindType": "Linked to a measurement",
|
||
"kindFreeText": "Free-text check",
|
||
"measurementType": "Measurement",
|
||
"cadence": "Repeat",
|
||
"notifyHour": "Remind at",
|
||
"location": "Where (optional)",
|
||
"locationPlaceholder": "e.g. GP, Lab",
|
||
"save": "Save",
|
||
"createTitle": "New reminder",
|
||
"editTitle": "Edit reminder",
|
||
"customInterval": "Repeat every (days)",
|
||
"rrule": "Recurrence rule (RRULE)",
|
||
"rruleHint": "RFC-5545, e.g. FREQ=YEARLY for an annual check.",
|
||
"firstDue": "First due (optional)"
|
||
},
|
||
"pushTitle": "Checkup reminder",
|
||
"pushBody": "Time for: {label}",
|
||
"pushLocation": "(at {location})",
|
||
"edit": "Edit",
|
||
"originCoach": "Coach",
|
||
"until": "Until {date}",
|
||
"selfPlanned": "Self-planned",
|
||
"captureValue": "Log value",
|
||
"measureNow": "Measure now",
|
||
"startCheckIn": "Start check-in",
|
||
"nextDueLabel": "Next due:",
|
||
"lastDoneLabel": "Last done:",
|
||
"customize": "Customize checkups",
|
||
"adherence": {
|
||
"label": "Within interval",
|
||
"onTrack": "On track",
|
||
"due": "Due now"
|
||
},
|
||
"capture": {
|
||
"title": "Log measurement",
|
||
"description": "Enter the reading; the reminder is marked done."
|
||
},
|
||
"manage": {
|
||
"empty": "No reminders to customize yet."
|
||
},
|
||
"dashboard": {
|
||
"empty": "No upcoming checkup reminders.",
|
||
"openLink": "Open checkups"
|
||
},
|
||
"showMeasurements": "Show measurements",
|
||
"loadError": "Could not load your reminders.",
|
||
"fileVisit": "Record a visit"
|
||
},
|
||
"moduleList": {
|
||
"viewToggleLabel": "View",
|
||
"viewCards": "Card view",
|
||
"viewList": "List view",
|
||
"viewHeading": "View",
|
||
"viewDescription": "Choose whether entries show as cards or as a compact list.",
|
||
"reorder": {
|
||
"heading": "Order",
|
||
"description": "Drag the entries to set the order they appear in.",
|
||
"empty": "No entries to reorder yet."
|
||
}
|
||
},
|
||
"labs": {
|
||
"title": "Lab results",
|
||
"subtitle": "Bloodwork and biomarker readings",
|
||
"addResult": "Add value",
|
||
"addDescription": "Record a biomarker reading from a lab report.",
|
||
"addFirst": "Add your first result",
|
||
"emptyTitle": "No lab results yet",
|
||
"emptyDescription": "Record bloodwork like HbA1c, LDL or ferritin to track it over time and share it with your doctor.",
|
||
"referenceLabel": "Reference",
|
||
"readingsCount": "{count} readings",
|
||
"deleteConfirmTitle": "Delete lab result?",
|
||
"deleteConfirmDescription": "This lab result will be deleted. You can undo this for a short moment afterwards.",
|
||
"deletedToast": "Result deleted",
|
||
"deleteError": "Could not delete the result",
|
||
"loadError": "Could not load lab results",
|
||
"customize": "Customize labs",
|
||
"localOcr": {
|
||
"heading": "Read scans on this device",
|
||
"description": "Reads the photo on your device and sends only the extracted text to your provider.",
|
||
"detail": "Useful when your AI provider cannot read images. Less accurate: review every value before saving."
|
||
},
|
||
"sort": {
|
||
"heading": "Sort order",
|
||
"label": "Order of values",
|
||
"recentDesc": "Most recent reading first",
|
||
"recentAsc": "Oldest reading first",
|
||
"alphaAsc": "Name (A–Z)",
|
||
"alphaDesc": "Name (Z–A)",
|
||
"manual": "Sort manually",
|
||
"hint": "With manual sorting you can drag the biomarkers below into your own order."
|
||
},
|
||
"range": {
|
||
"inRange": "In range",
|
||
"below": "Below range",
|
||
"above": "Above range"
|
||
},
|
||
"form": {
|
||
"value": "Value",
|
||
"takenAt": "Sample date",
|
||
"note": "Note",
|
||
"notePlaceholder": "Optional context for this result",
|
||
"requiredError": "Enter a value.",
|
||
"save": "Save",
|
||
"saveAndAddAnother": "Save & add another",
|
||
"savedToast": "Result saved",
|
||
"saveError": "Could not save the result",
|
||
"biomarker": "Biomarker",
|
||
"biomarkerPlaceholder": "Pick a biomarker",
|
||
"defineNew": "+ Define new biomarker",
|
||
"noBiomarkersHint": "Define a biomarker first to record a value against it.",
|
||
"pickBiomarkerError": "Pick a biomarker first.",
|
||
"resultType": "Result type",
|
||
"numeric": "Numeric",
|
||
"qualitative": "Qualitative",
|
||
"qualitativeResult": "Result",
|
||
"qualitativePlaceholder": "e.g. negative",
|
||
"qualNegative": "negative",
|
||
"qualPositive": "positive",
|
||
"qualBorderline": "borderline",
|
||
"sourceRange": "Range printed on the report",
|
||
"sourceRangePlaceholder": "e.g. 3.5 - 5.0 or < 5",
|
||
"sourceRangeAdd": "+ Add the range from the report",
|
||
"sourceRangeHint": "Optional. Applies to this reading only; your saved range stays as it is.",
|
||
"sourceRangeUnparsed": "Kept as written, no numeric range read from it."
|
||
},
|
||
"backToLabs": "Back to lab results",
|
||
"hasNote": "Note",
|
||
"editTitle": "Edit reading",
|
||
"editDescription": "Correct the value, date or note of this reading.",
|
||
"editedToast": "Reading updated",
|
||
"editError": "Could not update the reading",
|
||
"editTimestampError": "Enter a valid date.",
|
||
"editReading": "Edit reading",
|
||
"deleteReading": "Delete reading",
|
||
"restoredToast": "Reading restored",
|
||
"restoreError": "Could not restore the reading",
|
||
"detail": {
|
||
"emptyTitle": "No readings yet",
|
||
"emptyDescription": "Add a value to start tracking this biomarker over time.",
|
||
"title": "Biomarker",
|
||
"genericDescription": "A lab biomarker you track. Add readings to follow how it trends against its reference range.",
|
||
"valuesTitle": "{marker}: all readings",
|
||
"valuesDescription": "Every reading for this biomarker. Edit or remove an entry directly.",
|
||
"backToMarker": "Back to {marker}",
|
||
"latestResult": "Latest result"
|
||
},
|
||
"chart": {
|
||
"empty": "No readings in this period.",
|
||
"valueLabel": "Value",
|
||
"range": {
|
||
"30": "30d",
|
||
"90": "90d",
|
||
"365": "1y",
|
||
"all": "All"
|
||
},
|
||
"sourceRangeLabel": "Report range",
|
||
"sourceBandLegend": "Second band: the range printed on the report of {date}.",
|
||
"sourceBandMixed": "Second band: the range printed on the most recent report. Earlier reports in view state different ranges."
|
||
},
|
||
"biomarker": {
|
||
"manageTitle": "Biomarkers",
|
||
"managerDescription": "Define a marker once; its unit and range are reused for every reading.",
|
||
"define": "Define",
|
||
"defineFirst": "Define your first biomarker",
|
||
"defineTitle": "Define biomarker",
|
||
"defineDescription": "Set the name, unit and reference range once. You pick the marker when adding a value.",
|
||
"editTitle": "Edit biomarker",
|
||
"edit": "Edit",
|
||
"delete": "Delete",
|
||
"deletedToast": "Biomarker deleted",
|
||
"deleteError": "Could not delete the biomarker",
|
||
"deleteConfirmTitle": "Delete biomarker?",
|
||
"deleteConfirmDescription": "The biomarker and all of its recorded values are permanently deleted. This cannot be undone.",
|
||
"emptyTitle": "No biomarkers yet",
|
||
"emptyDescription": "Define markers like LDL or HbA1c to record values against them.",
|
||
"loadError": "Could not load biomarkers",
|
||
"noRange": "No reference range",
|
||
"form": {
|
||
"seedLabel": "Start from a common marker",
|
||
"seedPlaceholder": "Choose a marker (optional)",
|
||
"seedHint": "Picking one fills the fields below. Adjust the range to match your lab.",
|
||
"name": "Name",
|
||
"namePlaceholder": "e.g. LDL cholesterol",
|
||
"unit": "Unit",
|
||
"unitPlaceholder": "e.g. mg/dL",
|
||
"unitLockedHint": "Once this marker has readings, its unit stays as it is. The stored values would otherwise be shown in a new unit without being converted.",
|
||
"panel": "Panel",
|
||
"panelPlaceholder": "e.g. Lipids",
|
||
"lowerBound": "Reference low",
|
||
"upperBound": "Reference high",
|
||
"lowerPlaceholder": "Lower bound",
|
||
"upperPlaceholder": "Upper bound",
|
||
"context": "Context",
|
||
"contextPlaceholder": "Optional note about this marker",
|
||
"rangeHint": "Either bound is optional. Leave one blank for an open-ended range (e.g. LDL < 116).",
|
||
"requiredError": "Name and unit are required.",
|
||
"rangeOrderError": "The lower bound must not exceed the upper bound.",
|
||
"save": "Save biomarker",
|
||
"savedToast": "Biomarker saved",
|
||
"updatedToast": "Biomarker updated",
|
||
"saveError": "Could not save the biomarker"
|
||
},
|
||
"hide": "Hide",
|
||
"unhide": "Restore",
|
||
"hiddenToast": "Biomarker hidden",
|
||
"unhiddenToast": "Biomarker restored",
|
||
"hideError": "Could not update the biomarker",
|
||
"allHidden": "Every biomarker is hidden.",
|
||
"hiddenSection": "Hidden"
|
||
},
|
||
"catalog": {
|
||
"total-cholesterol": "Total cholesterol",
|
||
"ldl": "LDL cholesterol",
|
||
"hdl": "HDL cholesterol",
|
||
"triglycerides": "Triglycerides",
|
||
"fasting-glucose": "Fasting glucose",
|
||
"hba1c": "HbA1c",
|
||
"tsh": "TSH",
|
||
"ft3": "Free T3",
|
||
"ft4": "Free T4",
|
||
"ferritin": "Ferritin",
|
||
"transferrin-saturation": "Transferrin saturation",
|
||
"vitamin-d": "Vitamin D (25-OH)",
|
||
"vitamin-b12": "Vitamin B12",
|
||
"folate": "Folate",
|
||
"hs-crp": "hs-CRP",
|
||
"creatinine": "Creatinine",
|
||
"egfr": "eGFR",
|
||
"alt": "ALT",
|
||
"ast": "AST",
|
||
"ggt": "GGT",
|
||
"sodium": "Sodium",
|
||
"potassium": "Potassium",
|
||
"hemoglobin": "Haemoglobin",
|
||
"hematocrit": "Haematocrit",
|
||
"wbc": "White blood cells",
|
||
"platelets": "Platelets",
|
||
"panel": {
|
||
"lipids": "Lipids",
|
||
"glucose": "Glucose metabolism",
|
||
"thyroid": "Thyroid",
|
||
"iron": "Iron",
|
||
"vitamins": "Vitamins",
|
||
"inflammation": "Inflammation",
|
||
"renal": "Kidney",
|
||
"liver": "Liver",
|
||
"electrolytes": "Electrolytes",
|
||
"bloodCount": "Blood count"
|
||
},
|
||
"desc": {
|
||
"total-cholesterol": "Total cholesterol is the sum of the cholesterol carried across all lipoprotein particles in the blood, including the LDL, HDL, and remnant fractions. Cholesterol itself is an essential building block for cell membranes, hormones, and bile acids. As a single number it is a coarse summary, because both a healthy HDL share and a high LDL share lift the total, so it is usually read alongside the individual fractions. It is tracked mainly as part of long-term cardiovascular risk assessment.",
|
||
"ldl": "LDL cholesterol is the cholesterol carried by low-density lipoprotein particles, the fraction that delivers cholesterol to tissues but can also deposit it in artery walls. Over years this deposition contributes to atherosclerotic plaque, which is why LDL is one of the most closely watched lipid markers. Lower long-term exposure generally tracks with lower cardiovascular risk. It is interpreted by risk category rather than against one fixed normal value.",
|
||
"hdl": "HDL cholesterol is the cholesterol carried by high-density lipoprotein particles, which collect surplus cholesterol from tissues and return it to the liver for recycling or removal. Because of this transport role it is often described as the protective fraction. Very low levels tend to accompany higher cardiovascular risk, though raising it artificially has not reliably reduced risk, so it is read as a marker rather than a target. It is usually interpreted together with LDL and triglycerides.",
|
||
"triglycerides": "Triglycerides are the main form of fat circulating in the blood, supplied both by the diet and produced by the liver, and they serve as a key energy store. Levels rise after meals, so the sample is usually taken fasting for comparability. Persistently high triglycerides are associated with metabolic and cardiovascular risk and often travel with insulin resistance and low HDL. They are read as one component of the overall lipid picture.",
|
||
"fasting-glucose": "Fasting glucose is the concentration of sugar in the blood measured after an overnight fast, reflecting how the body holds its baseline blood-sugar level without recent food. Glucose is the body's primary immediate fuel, and insulin normally keeps it within a narrow range. A fasting measurement removes the effect of recent meals, making it a standard screen for how glucose regulation is functioning. It is one of the markers used to assess metabolic health over time.",
|
||
"hba1c": "HbA1c is the share of haemoglobin in red blood cells that has become bound to glucose, which accumulates in proportion to average blood-sugar exposure. Because red cells live for about three months, it reflects average glucose over the preceding two to three months rather than a single moment. This makes it a stable, meal-independent view of glucose control. Its accuracy can be affected by conditions that change red-cell lifespan.",
|
||
"tsh": "TSH (thyroid-stimulating hormone) is released by the pituitary gland to signal the thyroid to produce its hormones, and it adjusts up or down to keep them in balance. Because of this feedback loop, TSH is the most sensitive first-line screen of thyroid function: it tends to move before the thyroid hormones themselves drift. A raised or lowered TSH points toward an under- or over-active thyroid and usually prompts measurement of the thyroid hormones directly. Pregnancy and age shift the expected range.",
|
||
"ft3": "Free T3 (triiodothyronine) is the unbound, biologically active form of the more potent thyroid hormone, the fraction available to act on tissues. Most circulating T3 is bound to carrier proteins and inactive, so the free portion is what reflects true hormone availability. It is measured to characterise thyroid function, especially alongside TSH and free T4 when results are unclear. Levels are strongly assay-dependent and read in clinical context.",
|
||
"ft4": "Free T4 (thyroxine) is the unbound form of the main hormone the thyroid releases into the blood, serving as a reservoir that tissues convert to the more active T3 as needed. The free fraction reflects what is actually available to the body, independent of carrier-protein levels. It is usually measured together with TSH to separate thyroid-gland problems from pituitary signalling. Pregnancy and certain medications can shift it.",
|
||
"ferritin": "Ferritin is the body's main iron-storage protein, and its blood level broadly mirrors total iron reserves. A low value points toward depleted stores, while a high value can reflect iron overload, or simply inflammation, because ferritin also rises as an acute-phase reactant. For that reason it is often interpreted alongside other iron markers and signs of inflammation. It is one of the core measures used to assess iron status.",
|
||
"transferrin-saturation": "Transferrin saturation is the percentage of transferrin (the protein that ferries iron through the blood) that is currently loaded with iron. It links the amount of iron in transit to the body's iron-carrying capacity, giving a snapshot of iron availability that complements ferritin's view of storage. A low saturation suggests iron is in short supply, while a high value can indicate overload. It is read together with ferritin and the full iron panel.",
|
||
"vitamin-d": "Vitamin D is measured as 25-hydroxyvitamin D, the circulating storage form and the standard marker of overall vitamin D status. The body makes it in skin exposed to sunlight and absorbs some from food, and it supports calcium balance, bone health, and immune function. Levels vary with season, latitude, skin tone, and supplementation. It is tracked to gauge whether stores are adequate over time.",
|
||
"vitamin-b12": "Vitamin B12 (cobalamin) is an essential vitamin obtained mainly from animal-source foods and stored largely in the liver. It is required for red-blood-cell formation, DNA synthesis, and the health of the nervous system. Prolonged shortfall, from low intake or impaired absorption, can lead to anaemia and nerve-related symptoms. It is measured to assess nutritional status, particularly where intake or absorption may be limited.",
|
||
"folate": "Folate (vitamin B9) is a B-vitamin found in leafy greens, legumes, and fortified foods, central to red-blood-cell formation and DNA synthesis. It works closely with vitamin B12, and a shortfall in either can produce a similar type of anaemia. Adequate folate is especially important around early pregnancy for healthy fetal development. It is measured to assess nutritional status and the cause of certain anaemias.",
|
||
"hs-crp": "High-sensitivity CRP measures C-reactive protein, a marker the liver releases in response to inflammation, using an assay refined to detect the low concentrations relevant to cardiovascular risk. Unlike standard CRP used for acute infection, the high-sensitivity version captures the subtle, chronic inflammation linked to vascular disease. Because any recent infection or injury can raise it, it is interpreted away from acute illness and often confirmed with a repeat sample. It is read as one contributor to overall cardiovascular risk.",
|
||
"creatinine": "Creatinine is a waste product of normal muscle metabolism that the kidneys filter out of the blood at a fairly steady rate. Because production is relatively constant, its blood level serves as a practical gauge of how well the kidneys are clearing waste. Values are also influenced by muscle mass, hydration, and diet, so it is usually interpreted alongside the estimated filtration rate. It is a core marker of kidney function.",
|
||
"egfr": "eGFR (estimated glomerular filtration rate) estimates how much blood the kidneys filter each minute, calculated from creatinine together with age and sex. It translates a raw creatinine value into a more directly interpretable measure of kidney function. A declining eGFR over time is the main way chronic kidney changes are staged and tracked. As an estimate it is read as a trend rather than a single exact figure.",
|
||
"alt": "ALT (alanine aminotransferase) is an enzyme concentrated in liver cells, released into the blood when those cells are stressed or damaged. Because it is relatively liver-specific, it is one of the primary markers used to detect liver injury or inflammation. Levels can rise with fatty liver, viral hepatitis, alcohol, or certain medications. It is usually read together with AST and the other liver-panel markers.",
|
||
"ast": "AST (aspartate aminotransferase) is an enzyme found in the liver but also in muscle, heart, and red blood cells, released when any of those tissues is injured. Because it is less liver-specific than ALT, the two are interpreted together; their ratio can hint at the source and nature of the problem. Vigorous exercise or muscle injury can raise it independently of the liver. It is one of the standard liver-panel enzymes.",
|
||
"ggt": "GGT (gamma-glutamyl transferase) is an enzyme found in the liver and the bile ducts that rises particularly when bile flow is obstructed or with alcohol exposure. It is often used to clarify why another liver marker is elevated, for example, to distinguish a liver or bile-duct source. It is sensitive but not very specific, so it is read in context with the rest of the liver panel. It is one of several markers used to assess liver and biliary health.",
|
||
"sodium": "Sodium is the principal electrolyte in the fluid outside the body's cells and the main driver of fluid balance and blood volume. The body regulates it tightly through thirst, hormones, and the kidneys, so its blood level reflects the balance between water and salt more than dietary intake alone. Abnormal values usually signal a disturbance of water balance rather than of sodium itself. It is a core part of the basic metabolic and electrolyte panel.",
|
||
"potassium": "Potassium is the main electrolyte inside the body's cells and is essential for nerve signalling and the steady rhythm of the heart muscle. Its blood level is held within a narrow range by the kidneys and hormonal signals, because both high and low values can disturb the heart's electrical activity. Levels can be affected by kidney function, hydration, and several common medications. It is a core measure in the electrolyte panel.",
|
||
"hemoglobin": "Haemoglobin is the iron-containing protein in red blood cells that binds oxygen in the lungs and carries it to the tissues. Its concentration is the main measure of the blood's oxygen-carrying capacity and the central marker for detecting anaemia. Low values can reflect blood loss, iron or vitamin shortfalls, or reduced production, while high values can follow dehydration or low-oxygen conditions. It is a cornerstone of the complete blood count.",
|
||
"hematocrit": "Haematocrit is the proportion of blood volume made up of red blood cells, expressed as a percentage. It moves closely with haemoglobin and gives a complementary view of red-cell mass and the blood's oxygen-carrying capacity. Hydration affects it, since plasma-volume changes shift the proportion even when red-cell numbers are stable. It is read alongside haemoglobin and the rest of the blood count.",
|
||
"wbc": "The white blood cell count is the total number of immune cells circulating in the blood, the body's mobile defence against infection. It rises in response to infection, inflammation, or stress and can fall when the bone marrow is suppressed or in some immune conditions. Because it sums several distinct cell types, a notable change is often followed up with a differential that breaks it down. It is a core component of the complete blood count.",
|
||
"platelets": "Platelets are small cell fragments in the blood that clump together and form the initial plug that stops bleeding from a damaged vessel. Their count reflects the balance between production in the bone marrow and consumption or breakdown. A low count can raise bleeding tendency, while a high count can follow inflammation or other stimuli. It is part of the complete blood count and a basic gauge of clotting capacity.",
|
||
"apob": "Apolipoprotein B is the structural protein carried by each of the atherogenic lipoprotein particles, so measuring it counts those particles directly rather than the cholesterol they carry. Because one ApoB molecule sits on each LDL, VLDL, and related particle, it can capture cardiovascular risk that an LDL-cholesterol value misses, particularly when particle number and cholesterol content diverge. For this reason it is increasingly used to refine lipid-based risk assessment. It is interpreted alongside the standard lipid panel.",
|
||
"lp-a": "Lipoprotein(a) is an LDL-like particle with an extra attached protein, and its level is largely set by genetics and stays fairly stable through life. Elevated Lp(a) is an independent, inherited risk factor for cardiovascular disease and aortic-valve narrowing. Because it changes little, it is usually measured once to establish a person's lifelong risk rather than tracked repeatedly. It is reported in molar units and read as part of overall cardiovascular risk.",
|
||
"fasting-insulin": "Fasting insulin is the level of insulin (the hormone that moves glucose from the blood into cells) measured after an overnight fast. Paired with fasting glucose, it helps estimate insulin resistance, the state in which the body needs more insulin to keep glucose in range. A high fasting insulin alongside normal glucose can be an early sign that this compensation is under way. It is read as part of a metabolic-health picture rather than in isolation.",
|
||
"omega-3-index": "The omega-3 index is the share of EPA and DHA (the two long-chain marine omega-3 fatty acids) among the fatty acids in red-blood-cell membranes. Because red cells turn over slowly, it reflects long-term omega-3 intake rather than a recent meal. A higher index has been associated in observational studies with lower cardiovascular risk. It is tracked as a stable marker of omega-3 status that responds to diet over months.",
|
||
"alkaline-phosphatase": "Alkaline phosphatase (ALP) is an enzyme found mainly in the liver, the bile ducts and bone. It rises when bile flow is blocked and during phases of active bone building, such as growth in children and adolescents or bone healing. Because both organs release it, a raised value is usually read together with GGT and the other liver markers to tell a liver source from a bone source. It is one of the standard liver-panel markers.",
|
||
"bilirubin-total": "Total bilirubin is the yellow breakdown product of haemoglobin from worn-out red blood cells, measured as the sum of its unconjugated and conjugated forms. The liver takes it up, conjugates it and excretes it in bile, so the level reflects how well this pathway is working. It can rise with liver disease, blocked bile ducts or increased breakdown of red cells, and harmlessly in Gilbert's syndrome. It is read alongside the other liver markers."
|
||
},
|
||
"apob": "Apolipoprotein B (ApoB)",
|
||
"lp-a": "Lipoprotein(a)",
|
||
"fasting-insulin": "Fasting insulin",
|
||
"omega-3-index": "Omega-3 index",
|
||
"alkaline-phosphatase": "Alkaline phosphatase (ALP)",
|
||
"bilirubin-total": "Total bilirubin"
|
||
},
|
||
"noteLoadFailed": "Note could not be loaded; it will be kept unchanged when you save.",
|
||
"showingLatestOf": "Showing the latest {shown} of {total} readings",
|
||
"convertedFrom": "converted from {value} {unit}",
|
||
"ocr": {
|
||
"scanButton": "Scan a report",
|
||
"addScan": "Scan a document",
|
||
"addManual": "Add a value manually",
|
||
"uploadHint": "Upload a photo or PDF of a lab report",
|
||
"acceptWithPdf": "JPEG, PNG, WebP, or PDF",
|
||
"acceptImageOnly": "JPEG, PNG, or WebP",
|
||
"extracting": "Reading your report…",
|
||
"readingOnDevice": "Reading on your device…",
|
||
"localModeHint": "Read on your device, then sent as text. Less accurate: review every value.",
|
||
"rangeFromScan": "Reference range taken from the scan",
|
||
"rangeVerify": "Verify the reference range",
|
||
"reviewTitle": "Review before saving",
|
||
"reviewHint": "Check each reading, then save the ones you want to keep.",
|
||
"foundCount": "{count} readings found",
|
||
"pagesCapped": "Only the first {read} of {total} pages were read. Values on later pages are not in this list.",
|
||
"stoppedBudget": "Your AI budget for today ran out partway through the report, so the remaining pages were not read.",
|
||
"stoppedUnavailable": "AI was turned off while the report was being read, so the remaining pages were not read.",
|
||
"stoppedError": "The scan could not continue because of a server error, so the remaining pages were not read. Try again later.",
|
||
"tooLarge": "This text is too long for one scan. Scan the report a page at a time.",
|
||
"truncated": "The AI provider reached its output limit before the end of the report. Readings after that point may be missing, so check the list against the report.",
|
||
"truncatedPages": "The AI provider reached its output limit partway through these pages: {pages}. Readings further down them may be missing, so check them against the report.",
|
||
"unreadPages": "These pages could not be read, and their readings are not in this list: {pages}.",
|
||
"unreadParts": "Part of the report could not be read, and its readings are not in this list.",
|
||
"rowsCapped": "The report lists {found} readings. One scan takes {kept}, so only the first {kept} are shown.",
|
||
"outputLimit": "The AI provider reached its output limit before it returned a single reading. Try a photo of one page, or a model that allows longer answers.",
|
||
"errorTooLong": "Shorten this to {max} characters.",
|
||
"confirmRow": "Include this reading",
|
||
"analyteLabel": "Test name",
|
||
"resultLabel": "Result",
|
||
"valueLabel": "Value",
|
||
"unitLabel": "Unit",
|
||
"dateLabel": "Date",
|
||
"refLowLabel": "Reference low",
|
||
"refHighLabel": "Reference high",
|
||
"newBiomarker": "New biomarker, will be created",
|
||
"linksExisting": "Links to existing {name}",
|
||
"duplicateWarning": "A matching reading already exists",
|
||
"lowConfidence": "Please double-check this value",
|
||
"lowConfidenceBadge": "Low confidence",
|
||
"valueUnreadable": "Value unreadable. Enter it manually",
|
||
"saveSelected": "Save {count} selected",
|
||
"discardAll": "Discard all",
|
||
"savedToast": "{count} lab results saved",
|
||
"savedPartialToast": "{count} lab results saved, {skipped} skipped as duplicates",
|
||
"savedNothingToast": "Nothing saved: {skipped} readings were already recorded",
|
||
"savedEmptyToast": "Nothing to save",
|
||
"noRows": "No readings could be found in this report.",
|
||
"nothingToSave": "Select at least one reading to save.",
|
||
"validationSummary": "Readings needing attention: {count}. Complete the marked fields or deselect those readings.",
|
||
"errorDate": "Add the sample date.",
|
||
"errorAnalyte": "Add a biomarker name.",
|
||
"errorValue": "Add a value.",
|
||
"errorResult": "Add a result.",
|
||
"errorUnit": "Add a unit.",
|
||
"errorUnitMismatch": "This marker is tracked in {markerUnit}. Change the unit if the report was misread, or deselect this reading.",
|
||
"unitDiffersBadge": "Tracked in {markerUnit}; this report says {unit}",
|
||
"unitConvertedBadge": "Saved as {value} {markerUnit}, converted from {statedValue} {unit}",
|
||
"savedPartialUnitToast": "{count} lab results saved. Not saved, because the unit differs from the marker's: {analytes}",
|
||
"savedNothingUnitToast": "Nothing saved: the unit differs from the marker's for {analytes}",
|
||
"saveFailed": "Couldn't save the readings. Please try again.",
|
||
"providerUnsupported": "Your AI provider can't read images. Configure a vision-capable model.",
|
||
"consentRequired": "AI processing consent is required to scan a report.",
|
||
"rateLimited": "Too many scans. Try again later.",
|
||
"budgetExceeded": "Your AI usage budget for today is reached.",
|
||
"fileTooLarge": "File is too large (max 12 MB).",
|
||
"fileType": "Upload a JPEG, PNG, WebP, or PDF.",
|
||
"extractFailed": "Couldn't read the report. Try a clearer photo.",
|
||
"pdfRendererUnavailable": "This server's processor can't run the PDF page renderer, so a scanned report can only be read by an AI provider that takes PDF files directly. Upload a photo instead.",
|
||
"refTextLabel": "Range as printed",
|
||
"refTextPlaceholder": "e.g. 3.5 - 5.0",
|
||
"aiUnavailable": "Scanning a report with AI is not available here right now.",
|
||
"errorUnitMismatchNoUnit": "This marker is tracked without a unit. Tick No unit if the report was misread, or deselect this reading.",
|
||
"unitDiffersBadgeNoUnit": "Tracked without a unit; this report says {unit}"
|
||
},
|
||
"loadMoreReadings": "Load more readings",
|
||
"documentsLink": "Lab report documents",
|
||
"notLinkedYet": "Not linked to a biomarker yet",
|
||
"sourceRange": {
|
||
"fromReport": "Report range {range}",
|
||
"catalogDiffers": "your range {range}",
|
||
"printed": "as printed in {unit}: {range}"
|
||
},
|
||
"match": {
|
||
"viaAlias": "by a name you chose before",
|
||
"viaCatalog": "recognised as a common abbreviation",
|
||
"chooseLabel": "Belongs to",
|
||
"suggestionOption": "{name} ({unit})",
|
||
"newMarkerOption": "A new biomarker",
|
||
"rememberHint": "This name will be remembered for the next report.",
|
||
"chooseHint": "Pick a biomarker if this is one you already track."
|
||
},
|
||
"aliases": {
|
||
"title": "Also written as",
|
||
"taken": "{alias} already belongs to another biomarker.",
|
||
"saveError": "The names could not be saved. Try again.",
|
||
"remove": "Remove {alias}",
|
||
"empty": "Add the names other labs print for {name}, so their reports land here.",
|
||
"placeholder": "e.g. Alk.P",
|
||
"addLabel": "Another name for this biomarker",
|
||
"add": "Add",
|
||
"alsoWritten": "Also written as {aliases}"
|
||
},
|
||
"merge": {
|
||
"open": "Merge",
|
||
"title": "Merge biomarkers",
|
||
"description": "Combine markers that are the same test written differently.",
|
||
"pickHint": "Select at least two biomarkers.",
|
||
"keepLabel": "Keep",
|
||
"keepHint": "The others move into this one and their names become its other names.",
|
||
"showPreview": "Show preview",
|
||
"back": "Back",
|
||
"confirm": "Merge now",
|
||
"previewSummaryOne": "{count} reading moves to {name} ({unit}).",
|
||
"previewSummaryFew": "{count} readings move to {name} ({unit}).",
|
||
"previewSummaryOther": "{count} readings move to {name} ({unit}).",
|
||
"movesOne": "{count} reading, already in the same unit",
|
||
"movesFew": "{count} readings, already in the same unit",
|
||
"movesOther": "{count} readings, already in the same unit",
|
||
"convertedOne": "{count} reading, converted from {unit} to {targetUnit}",
|
||
"convertedFew": "{count} readings, converted from {unit} to {targetUnit}",
|
||
"convertedOther": "{count} readings, converted from {unit} to {targetUnit}",
|
||
"refused": "{unit} cannot be converted to {targetUnit}.",
|
||
"aliasesAdded": "These names will lead to the kept biomarker:",
|
||
"blocked": "Nothing can be merged while a unit cannot be converted. Leave that biomarker out or keep another one.",
|
||
"noUndo": "A merge cannot be undone.",
|
||
"doneToastOne": "Merged into {name}, {count} reading moved",
|
||
"doneToastFew": "Merged into {name}, {count} readings moved",
|
||
"doneToastOther": "Merged into {name}, {count} readings moved",
|
||
"error": "The biomarkers could not be merged. Try again."
|
||
},
|
||
"trend": {
|
||
"title": "Trend",
|
||
"slope": {
|
||
"rising": "Rising by about {amount} {unit} a year across {n} readings since {since}.",
|
||
"falling": "Falling by about {amount} {unit} a year across {n} readings since {since}.",
|
||
"flat": "No change across {n} readings since {since}."
|
||
},
|
||
"projection": {
|
||
"exits": {
|
||
"high": "If this straight line continued, it would reach the upper end of your reference range around {date}. That is a projection, not a forecast.",
|
||
"low": "If this straight line continued, it would reach the lower end of your reference range around {date}. That is a projection, not a forecast."
|
||
},
|
||
"beyond_horizon": "At this pace the line stays inside your reference range for more than {years} years, the span your readings cover.",
|
||
"beyond_horizon_capped": "At this pace the line stays inside your reference range for more than {years} years, as far ahead as the projection looks.",
|
||
"no_exit": "The line heads away from the edges of your reference range.",
|
||
"already_outside": "The line already sits outside your reference range.",
|
||
"no_clear_trend": "Across these readings the change is not clearly different from no change, so no projection is drawn.",
|
||
"stale": "The newest reading is from {date}, more than a year ago. The line is shown as of then, without a projection."
|
||
},
|
||
"interval": "95 % interval of the yearly change: {lo} to {hi} {unit}."
|
||
},
|
||
"unit": {
|
||
"none": "No unit",
|
||
"noneHint": "For a ratio or an index such as INR or cholesterol/HDL."
|
||
}
|
||
},
|
||
"modules": {
|
||
"cycle": {
|
||
"label": "Cycle",
|
||
"description": "Track period, phases, and predictions."
|
||
},
|
||
"mood": {
|
||
"label": "Mood",
|
||
"description": "Log daily mood and tags."
|
||
},
|
||
"sleep": {
|
||
"label": "Sleep",
|
||
"description": "Sleep duration, stages, and timeline."
|
||
},
|
||
"glucose": {
|
||
"label": "Glucose",
|
||
"description": "Blood-glucose readings and trends."
|
||
},
|
||
"workouts": {
|
||
"label": "Workouts",
|
||
"description": "Training sessions and activity."
|
||
},
|
||
"recovery": {
|
||
"label": "Recovery",
|
||
"description": "Recovery and strain metrics from your devices."
|
||
},
|
||
"labs": {
|
||
"label": "Lab results",
|
||
"description": "Capture lab results and keep their history."
|
||
},
|
||
"achievements": {
|
||
"label": "Achievements",
|
||
"description": "Badges and streaks for your routine."
|
||
},
|
||
"coach": {
|
||
"label": "Coach",
|
||
"description": "AI chat grounded in your own data."
|
||
},
|
||
"insights": {
|
||
"label": "AI analysis",
|
||
"description": "Briefing, status notes and workout notes written by a model, never your data or scores."
|
||
},
|
||
"doctorReport": {
|
||
"label": "Doctor report",
|
||
"description": "PDF and FHIR export for your practice."
|
||
},
|
||
"medications": {
|
||
"label": "Medications",
|
||
"description": "Schedules, intakes, and adherence."
|
||
},
|
||
"illness": {
|
||
"label": "Illness journal",
|
||
"description": "Track illness and condition episodes with a daily symptom timeline."
|
||
},
|
||
"mcp": {
|
||
"label": "External assistant access (MCP)",
|
||
"description": "Read access for an MCP-capable assistant, over a scoped token."
|
||
},
|
||
"environment": {
|
||
"label": "Environment",
|
||
"description": "Daily weather and daylight for your location, beside mood, sleep, and vitals."
|
||
},
|
||
"inboundDocuments": {
|
||
"label": "Documents",
|
||
"description": "Medical letters, reports, and scans in one encrypted, searchable place."
|
||
},
|
||
"mentalHealth": {
|
||
"label": "Mental wellbeing",
|
||
"description": "Four opt-in screeners beside mood tracking."
|
||
},
|
||
"nutrients": {
|
||
"label": "Nutrient intake",
|
||
"description": "Daily micronutrient totals synced from Apple Health."
|
||
},
|
||
"vaccinations": {
|
||
"label": "Vaccinations",
|
||
"description": "The vaccination record, structured: dose, series, next booster."
|
||
},
|
||
"timeline": {
|
||
"label": "Timeline",
|
||
"description": "Years at a glance: conditions, medications and visits beside your readings, plus your own life events."
|
||
}
|
||
},
|
||
"moduleOff": {
|
||
"disabled": {
|
||
"description": "{module} is off for this record, so its pages stay hidden. Turn it back on to bring them back.",
|
||
"title": "{module} is switched off"
|
||
},
|
||
"notGranted": {
|
||
"description": "{module} sits outside the sections shared with you. What a shared record covers is decided by the person who owns it.",
|
||
"title": "Not part of the shared access"
|
||
},
|
||
"unavailable": {
|
||
"description": "The operator switched {module} off for every account on this server. No setting of your own can bring it back.",
|
||
"title": "Not available on this server"
|
||
},
|
||
"openModules": "Open Settings, Modules"
|
||
},
|
||
"vaccinations": {
|
||
"title": "Vaccinations",
|
||
"subtitle": "Your immunization record, dose by dose.",
|
||
"listLoadError": "Vaccinations could not be loaded.",
|
||
"series": {
|
||
"booster": "Booster",
|
||
"ofTotal": "Dose {position} of {total}",
|
||
"doseN": "Dose {position}"
|
||
},
|
||
"row": {
|
||
"lot": "Lot {lot}"
|
||
},
|
||
"form": {
|
||
"date": "Date",
|
||
"catalogLabel": "Vaccine",
|
||
"identityHint": "Pick a vaccine from the list or type it in below. Either is enough.",
|
||
"catalogNone": "Choose a vaccine",
|
||
"catalogSearch": "Search vaccines",
|
||
"catalogNoMatch": "No catalogue entry found",
|
||
"catalogClear": "Clear selection",
|
||
"freeTextLabel": "Free text",
|
||
"freeTextPlaceholder": "as written on the record",
|
||
"seriesToggle": "Add series details",
|
||
"doseNumber": "Dose no.",
|
||
"seriesDoses": "Doses in series",
|
||
"lot": "Lot number",
|
||
"site": "Injection site",
|
||
"siteNone": "Not specified",
|
||
"practitioner": "Practice or doctor",
|
||
"note": "Note",
|
||
"linkDocuments": "Link a document",
|
||
"linkNothingToOffer": "No documents yet."
|
||
},
|
||
"site": {
|
||
"LEFT_ARM": "Left upper arm",
|
||
"RIGHT_ARM": "Right upper arm",
|
||
"LEFT_THIGH": "Left thigh",
|
||
"RIGHT_THIGH": "Right thigh",
|
||
"ORAL": "Oral",
|
||
"NASAL": "Nasal",
|
||
"OTHER": "Other"
|
||
},
|
||
"createTitle": "Log a vaccination",
|
||
"editTitle": "Edit vaccination",
|
||
"formDescription": "A date and the vaccine are enough; everything else is optional.",
|
||
"created": "Vaccination saved",
|
||
"updated": "Vaccination updated",
|
||
"saveFailed": "The vaccination could not be saved.",
|
||
"deleteTitle": "Delete this vaccination?",
|
||
"deleteDescription": "The entry is removed from your record. A planned booster reminder stays.",
|
||
"deleteFailed": "The vaccination could not be deleted.",
|
||
"info": {
|
||
"primarySeriesOne": "Primary series: {count} dose",
|
||
"primarySeriesFew": "Primary series: {count} doses",
|
||
"primarySeriesOther": "Primary series: {count} doses",
|
||
"yearly": "Yearly vaccination",
|
||
"boosterYearsOne": "Booster typically every {count} year",
|
||
"boosterYearsFew": "Booster typically every {count} years",
|
||
"boosterYearsOther": "Booster typically every {count} years",
|
||
"boosterMonthsOne": "Booster typically every {count} month",
|
||
"boosterMonthsFew": "Booster typically every {count} months",
|
||
"boosterMonthsOther": "Booster typically every {count} months",
|
||
"standard60": "Standard vaccination from age 60",
|
||
"sourceLabel": "Source: {source}",
|
||
"affordanceLabel": "Schedule info"
|
||
},
|
||
"booster": {
|
||
"title": "Plan a booster?",
|
||
"body": "You can set a reminder for the next booster from this dose. Change the interval or the label, or decline.",
|
||
"interval": "Interval",
|
||
"label": "Label",
|
||
"labelSuffix": "booster",
|
||
"decline": "Not now",
|
||
"confirm": "Set reminder",
|
||
"planned": "Booster planned",
|
||
"failed": "The reminder could not be created.",
|
||
"everyYearsOne": "every {count} year",
|
||
"everyYearsFew": "every {count} years",
|
||
"everyYearsOther": "every {count} years",
|
||
"everyMonthsOne": "every {count} month",
|
||
"everyMonthsFew": "every {count} months",
|
||
"everyMonthsOther": "every {count} months"
|
||
},
|
||
"suggestion": {
|
||
"single": "File against this vaccination?",
|
||
"choose": "Which vaccination does this scan belong to?",
|
||
"linked": "Linked to vaccination",
|
||
"failed": "Linking failed.",
|
||
"unnamed": "Vaccination"
|
||
},
|
||
"empty": {
|
||
"title": "No vaccination logged yet",
|
||
"description": "Transcribe your vaccination card line by line. A date and the vaccine are enough."
|
||
},
|
||
"catalog": {
|
||
"tetanus": "Tetanus",
|
||
"diphtheria": "Diphtheria",
|
||
"pertussis": "Whooping cough (pertussis)",
|
||
"polio": "Polio",
|
||
"measles": "Measles",
|
||
"mumps": "Mumps",
|
||
"rubella": "Rubella",
|
||
"varicella": "Chickenpox (varicella)",
|
||
"hib": "Hib (Haemophilus influenzae b)",
|
||
"hepatitis-a": "Hepatitis A",
|
||
"hepatitis-b": "Hepatitis B",
|
||
"influenza": "Influenza (flu)",
|
||
"pneumococcal": "Pneumococcus",
|
||
"herpes-zoster": "Shingles (herpes zoster)",
|
||
"rsv": "RSV",
|
||
"covid-19": "COVID-19",
|
||
"fsme": "Tick-borne encephalitis (TBE)",
|
||
"hpv": "HPV (human papillomavirus)",
|
||
"meningococcal-acwy": "Meningococcus ACWY",
|
||
"meningococcal-b": "Meningococcus B",
|
||
"rotavirus": "Rotavirus",
|
||
"typhoid": "Typhoid",
|
||
"rabies": "Rabies",
|
||
"yellow-fever": "Yellow fever",
|
||
"japanese-encephalitis": "Japanese encephalitis",
|
||
"cholera": "Cholera",
|
||
"dengue": "Dengue",
|
||
"tuberculosis": "Tuberculosis",
|
||
"td": "Td (tetanus, diphtheria)",
|
||
"tdap": "Tdap (tetanus, diphtheria, pertussis)",
|
||
"tdap-ipv": "Tdap-IPV (four-in-one)",
|
||
"dtap-ipv": "DTaP-IPV (childhood four-in-one)",
|
||
"hexavalent": "Six-in-one (DTaP-IPV-Hib-HepB)",
|
||
"mmr": "MMR (measles, mumps, rubella)",
|
||
"mmrv": "MMRV (measles, mumps, rubella, varicella)",
|
||
"hepa-hepb": "Hepatitis A and B",
|
||
"hepa-typhoid": "Hepatitis A and typhoid"
|
||
},
|
||
"renewal": {
|
||
"overdue": "Booster overdue since {date}",
|
||
"dueSoon": "Booster due {date}",
|
||
"current": "Next booster {date}"
|
||
},
|
||
"custom": {
|
||
"title": "Own vaccines",
|
||
"add": "Add own vaccine",
|
||
"name": "Name",
|
||
"components": "Protects against",
|
||
"seriesDoses": "Doses in the primary series",
|
||
"boosterMonths": "Booster every (months)",
|
||
"saved": "Vaccine saved",
|
||
"deleted": "Vaccine removed",
|
||
"deleteConfirm": "Remove this vaccine? Doses already logged keep their name.",
|
||
"saveFailed": "The vaccine could not be saved.",
|
||
"nameTaken": "You already have a vaccine with this name.",
|
||
"editTitle": "Edit own vaccine",
|
||
"description": "A vaccine the catalogue does not list, counted like any catalogue entry.",
|
||
"componentsHint": "Choose every disease it protects against.",
|
||
"boosterHint": "Leave empty if there is no booster.",
|
||
"protectsAgainst": "Protects against {list}.",
|
||
"deleteTitle": "Remove own vaccine?",
|
||
"sectionDescription": "Vaccines you added yourself because the catalogue does not list them.",
|
||
"catalogGroup": "Catalogue"
|
||
}
|
||
},
|
||
"illness": {
|
||
"title": "Illness",
|
||
"subtitle": "A retrospective log of your illness and condition episodes.",
|
||
"settings": {
|
||
"viewDescription": "Choose whether episodes show as cards or as a compact list.",
|
||
"orderDescription": "Drag your episodes into the order you want to see them in."
|
||
},
|
||
"customize": "Customize illness journal",
|
||
"newEpisode": "New episode",
|
||
"logDay": "Log a day",
|
||
"markRecovered": "Mark recovered",
|
||
"deletedToast": "Episode deleted",
|
||
"restoreError": "Could not restore the episode",
|
||
"onsetOn": "Started {date}",
|
||
"recoveredOn": "recovered {date}",
|
||
"status": {
|
||
"active": "Active",
|
||
"ongoing": "Ongoing",
|
||
"recovered": "Recovered"
|
||
},
|
||
"empty": {
|
||
"title": "No episodes yet",
|
||
"body": "Start an episode to keep a daily symptom timeline and look back on how it unfolded."
|
||
},
|
||
"type": {
|
||
"INFECTION": "Infection",
|
||
"ALLERGY": "Allergy",
|
||
"INJURY": "Injury",
|
||
"MENTAL_HEALTH": "Mental health",
|
||
"AUTOIMMUNE": "Autoimmune",
|
||
"CHRONIC": "Chronic",
|
||
"OTHER": "Other"
|
||
},
|
||
"lifecycle": {
|
||
"ACUTE": "Acute",
|
||
"CHRONIC_ONGOING": "Chronic / ongoing",
|
||
"RECURRING": "Recurring",
|
||
"FLARE": "Flare"
|
||
},
|
||
"new": {
|
||
"title": "New episode",
|
||
"description": "Record an illness or condition. You can log daily symptoms afterwards.",
|
||
"label": "Name",
|
||
"labelPlaceholder": "e.g. Common cold",
|
||
"type": "Type",
|
||
"lifecycle": "Course",
|
||
"onset": "Started on",
|
||
"note": "Note",
|
||
"notePlaceholder": "Anything worth remembering (encrypted).",
|
||
"saveError": "Could not save the episode. Please try again.",
|
||
"parent": "Part of",
|
||
"parentNone": "Not linked",
|
||
"resolved": "Ended on",
|
||
"resolvedHelp": "Leave empty while the episode is still ongoing.",
|
||
"markOngoing": "Still ongoing",
|
||
"bodySiteHint": "For example knee or lower back."
|
||
},
|
||
"sheet": {
|
||
"title": "Log {date}",
|
||
"description": "Record today's symptoms, how you function, and any fever.",
|
||
"symptoms": "Symptoms",
|
||
"functionalImpact": "How you function",
|
||
"fever": "Temperature",
|
||
"note": "Note",
|
||
"noteSet": "Set",
|
||
"notePlaceholder": "How the day felt (encrypted).",
|
||
"severityFor": "Severity for {symptom}",
|
||
"saveError": "Could not save the day. Please try again.",
|
||
"day": "Day"
|
||
},
|
||
"impact": {
|
||
"0": "Fully functional",
|
||
"1": "Slightly limited",
|
||
"2": "Mostly resting",
|
||
"3": "Bedbound"
|
||
},
|
||
"symptom": {
|
||
"runnyNose": "Runny nose",
|
||
"stuffyNose": "Stuffy nose",
|
||
"sneezing": "Sneezing",
|
||
"soreThroat": "Sore throat",
|
||
"cough": "Cough",
|
||
"headache": "Headache",
|
||
"bodyAches": "Body aches",
|
||
"fatigue": "Fatigue"
|
||
},
|
||
"correlation": {
|
||
"title": "How it unfolded",
|
||
"learning": "Still learning. Log a few more days to see patterns here.",
|
||
"preOnsetTitle": "How it announced itself",
|
||
"preOnsetBody": "Signals that drifted from your baseline before you marked the onset.",
|
||
"nadirTitle": "What changed",
|
||
"nadirBody": "How far each tracked signal strayed from your typical range.",
|
||
"recoveryGapTitle": "Recovery gap",
|
||
"recoveryGapLag": "Your numbers settled {days} days after you felt better.",
|
||
"recoveryGapLead": "Your numbers settled {days} days before you marked recovery.",
|
||
"recoveryGapLagSymptom": "You felt better {days} days before your logged symptoms eased.",
|
||
"recoveryGapLeadSymptom": "Your logged symptoms eased {days} days before you marked recovery.",
|
||
"recoveryGapSame": "Your numbers settled the same day you felt better.",
|
||
"sleepContextMore": "During this episode you slept noticeably more than usual (about {hours}h/night).",
|
||
"sleepContextLess": "During this episode you slept noticeably less than usual (about {hours}h/night).",
|
||
"redFlagTitle": "Worth a closer look",
|
||
"redFlagSpo2": "Your oxygen saturation stayed low for several days. If this recurs, seek medical care.",
|
||
"redFlagFever": "You ran a sustained fever. If this recurs, seek medical care.",
|
||
"direction": {
|
||
"above": "above your usual",
|
||
"below": "below your usual"
|
||
},
|
||
"settled": "Nothing notable stood out from your usual range during this episode."
|
||
},
|
||
"insights": {
|
||
"title": "Your illness history",
|
||
"countOne": "You logged 1 episode in this period.",
|
||
"countOther": "You logged {count} episodes in this period.",
|
||
"typicalGap": "Typical recovery gap: {days} days between feeling better and your numbers settling.",
|
||
"typicalGapWithDriver": "Typical recovery gap: {days} days; you tend to feel better before your {vital} settles.",
|
||
"typicalGapLearning": "A few more resolved episodes and a typical recovery gap will appear here.",
|
||
"none": "No episodes logged in this period.",
|
||
"analyze": "Analyse the recovery gap"
|
||
},
|
||
"section": {
|
||
"active": "Active",
|
||
"resolved": "Resolved"
|
||
},
|
||
"flares": {
|
||
"countOne": "1 flare",
|
||
"countOther": "{count} flares"
|
||
},
|
||
"timeline": {
|
||
"title": "Day timeline",
|
||
"error": "Could not load the timeline.",
|
||
"severity": "Severity {severity}",
|
||
"noSymptoms": "No symptoms logged.",
|
||
"impact": "How you functioned: {impact}",
|
||
"fever": "Temperature: {value} {unit}",
|
||
"empty": "No days logged yet."
|
||
},
|
||
"loadError": "Could not load this episode.",
|
||
"backToList": "Back to journal",
|
||
"detail": {
|
||
"note": "Note"
|
||
},
|
||
"edit": {
|
||
"title": "Edit episode",
|
||
"description": "Update this episode's details."
|
||
},
|
||
"menu": {
|
||
"label": "Episode actions"
|
||
},
|
||
"deleteConfirm": {
|
||
"title": "Delete this episode?",
|
||
"body": "“{label}” and all its day-logs will be removed. You can undo this for a short moment afterwards."
|
||
},
|
||
"vital": {
|
||
"RESTING_HEART_RATE": "Resting heart rate",
|
||
"HEART_RATE_VARIABILITY": "Heart-rate variability",
|
||
"HRV_RMSSD": "HRV (RMSSD)",
|
||
"RECOVERY_SCORE": "Recovery",
|
||
"OXYGEN_SATURATION": "Oxygen saturation",
|
||
"BODY_TEMPERATURE": "Body temperature",
|
||
"RESPIRATORY_RATE": "Respiratory rate",
|
||
"BLOOD_PRESSURE_SYS": "Systolic blood pressure",
|
||
"BLOOD_PRESSURE_DIA": "Diastolic blood pressure",
|
||
"PULSE": "Pulse",
|
||
"WEIGHT": "Weight",
|
||
"FUNCTIONAL_IMPACT": "Functional impact"
|
||
},
|
||
"listLoadError": "Could not load your episodes."
|
||
},
|
||
"coach": {
|
||
"reminderSuggestion": {
|
||
"title": "Set a reminder?",
|
||
"accept": "Set reminder",
|
||
"dismiss": "Not now",
|
||
"stop": "I measure enough",
|
||
"accepted": "Reminder set",
|
||
"dismissed": "Okay, I won't suggest this again",
|
||
"stopped": "Got it, I'll stop suggesting reminders",
|
||
"failed": "Couldn't set that up. Please try again",
|
||
"cadence": {
|
||
"weightDaily": "Weigh yourself daily, around the same time",
|
||
"bp722": "Measure your blood pressure twice a day for a week",
|
||
"glucoseStructured": "Test your glucose on a structured daily schedule"
|
||
}
|
||
},
|
||
"suggestedAction": {
|
||
"apply": "Add",
|
||
"dismiss": "Not now",
|
||
"applied": "Added",
|
||
"dismissed": "Dismissed",
|
||
"failed": "Couldn't add that. Please try again",
|
||
"checkup": {
|
||
"title": "Add a check-up reminder?"
|
||
},
|
||
"note": {
|
||
"title": "Save a reminder?"
|
||
},
|
||
"interval": {
|
||
"yearly": "Every year",
|
||
"halfYearly": "Every six months",
|
||
"quarterly": "Every three months",
|
||
"monthly": "Every month"
|
||
}
|
||
},
|
||
"settings": {
|
||
"reminderSuggestionsLabel": "Cadence suggestions",
|
||
"reminderSuggestionsDescription": "Let the Coach offer an occasional, evidence-based reminder to measure a metric more regularly."
|
||
},
|
||
"plans": {
|
||
"title": "Plans",
|
||
"pageDescription": "If-then plans agreed in your Coach conversations. Confirm a proposal to make it part of the Coach's memory.",
|
||
"readOnlyNote": "The Coach is not available right now, but you can still read and delete your plans.",
|
||
"proposalTitle": "Plan proposal",
|
||
"ifThen": "If {cue}, then {action}.",
|
||
"targetPrefix": "Target: {target}",
|
||
"reviewPrefix": "Check-in: {when}",
|
||
"accept": "Accept plan",
|
||
"decline": "Decline",
|
||
"accepted": "Plan accepted. The Coach will keep it in mind.",
|
||
"declined": "Proposal declined.",
|
||
"failed": "That didn't work. Please try again.",
|
||
"markMet": "Goal met",
|
||
"abandon": "End plan",
|
||
"remove": "Remove",
|
||
"removeTitle": "Remove this plan?",
|
||
"removeBody": "The plan and how it went disappear from your history. There is no way to bring it back.",
|
||
"removeConfirm": "Remove plan",
|
||
"empty": "No plans yet. When you commit to a concrete if-then intention in a conversation, the Coach proposes it here for confirmation.",
|
||
"groupProposed": "Suggestions",
|
||
"groupActive": "Active",
|
||
"groupPast": "Completed",
|
||
"status": {
|
||
"proposed": "Proposed",
|
||
"active": "Active",
|
||
"met": "Met",
|
||
"abandoned": "Ended",
|
||
"review_due": "Check-in due",
|
||
"reviewed": "Reviewed"
|
||
}
|
||
},
|
||
"refusal": {
|
||
"outOfScope": "I can only help with the health metrics in your log: measurements, medications, mood, trends. I cannot answer questions outside that scope.",
|
||
"promptInjection": "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.",
|
||
"conversationPoisoned": "An earlier message in this conversation contains wording that overrides my instructions. Please start a new conversation."
|
||
},
|
||
"noRecordedData": "I don't have any recorded readings for what you asked about, so there is nothing I can give you a figure from. Once you log some, ask me again and I'll work from your own numbers.",
|
||
"step": {
|
||
"read": "Checking: {domain}",
|
||
"readWindow": "Checking: {domain}, {window}",
|
||
"snapshot": "Reading your record summary",
|
||
"showResult": "Opening an earlier table",
|
||
"reuse": "Using the table from before",
|
||
"headerActive": "{label}…",
|
||
"listLabel": "What the Coach looked at",
|
||
"toggleShow": "Show what the Coach looked at",
|
||
"toggleHide": "Hide what the Coach looked at",
|
||
"announceDone": "Done: {label}",
|
||
"readingsOne": "1 reading",
|
||
"readingsFew": "{count} readings",
|
||
"readingsOther": "{count} readings",
|
||
"rowsOne": "1 row",
|
||
"rowsFew": "{count} rows",
|
||
"rowsOther": "{count} rows",
|
||
"metricsOne": "1 metric",
|
||
"metricsFew": "{count} metrics",
|
||
"metricsOther": "{count} metrics",
|
||
"reason": {
|
||
"noData": "no readings",
|
||
"outsideWindow": "no readings in this window",
|
||
"moduleDisabled": "switched off",
|
||
"retrievalFailed": "couldn't be read",
|
||
"invalidArguments": "request not understood"
|
||
},
|
||
"domain": {
|
||
"labs": "Lab results",
|
||
"illness": "Illness and recovery",
|
||
"cycle": "Cycle",
|
||
"correlations": "Connections between metrics",
|
||
"snapshot": "Record summary",
|
||
"environment": "Weather and air",
|
||
"day": "One day"
|
||
},
|
||
"window": {
|
||
"last7days": "last 7 days",
|
||
"last30days": "last 30 days",
|
||
"last90days": "last 90 days",
|
||
"lastYear": "last 12 months",
|
||
"allTime": "all time"
|
||
},
|
||
"period": {
|
||
"current": "this period",
|
||
"previous": "the period before",
|
||
"yearAgo": "a year earlier"
|
||
},
|
||
"granularity": {
|
||
"day": "by day",
|
||
"week": "by week",
|
||
"month": "by month"
|
||
}
|
||
},
|
||
"result": {
|
||
"title": {
|
||
"byDay": "{metric} by day",
|
||
"byWeek": "{metric} by week",
|
||
"byMonth": "{metric} by month",
|
||
"previousPeriod": "{metric}, the period before",
|
||
"yearAgo": "{metric}, a year earlier",
|
||
"workoutsBySport": "Workouts by sport",
|
||
"labsLatest": "Latest lab results",
|
||
"sleepByNight": "Sleep by night",
|
||
"complianceByDay": "Medication adherence by day",
|
||
"distribution": "{metric}: how often each range came up"
|
||
},
|
||
"column": {
|
||
"day": "Day",
|
||
"week": "Week",
|
||
"month": "Month",
|
||
"night": "Night",
|
||
"sport": "Sport",
|
||
"sessions": "Sessions",
|
||
"analyte": "Test",
|
||
"value": "Value",
|
||
"unit": "Unit",
|
||
"date": "Date",
|
||
"referenceRange": "Reference range",
|
||
"systolic": "Systolic",
|
||
"diastolic": "Diastolic",
|
||
"mean": "Average",
|
||
"total": "Total",
|
||
"min": "Lowest",
|
||
"max": "Highest",
|
||
"readings": "Readings",
|
||
"rate": "Adherence",
|
||
"duration": "Duration",
|
||
"range": "Range",
|
||
"count": "Times"
|
||
},
|
||
"other": "Other",
|
||
"noReading": "no reading",
|
||
"showAll": "Show all ({count})",
|
||
"showFewer": "Show fewer",
|
||
"copyMenu": "Copy table",
|
||
"copyForSpreadsheet": "Copy for spreadsheet",
|
||
"copyAsText": "Copy as text",
|
||
"copied": "Copied",
|
||
"copyFailed": "Couldn't copy the table",
|
||
"viewLabel": "View",
|
||
"viewChart": "Chart",
|
||
"viewTable": "Table",
|
||
"chartSummary": "{title}, shown as a chart. The table view lists every value.",
|
||
"dataUsed": "Data used ({count})",
|
||
"truncated": "Showing the latest {shown} of {total} rows",
|
||
"withheld": {
|
||
"moduleDisabled": "This table is hidden because its module is switched off.",
|
||
"unavailable": "This table couldn't be loaded."
|
||
},
|
||
"loading": "Loading table…",
|
||
"loadFailed": "Couldn't load the tables.",
|
||
"reusedFrom": "From an earlier answer ({date})",
|
||
"reusedFromUndated": "From an earlier answer",
|
||
"histogramBin": "{from}–{to} {unit}"
|
||
},
|
||
"method": {
|
||
"label": "How this was worked out",
|
||
"entry": "{domain}, {window}: {detail}",
|
||
"entryNoWindow": "{domain}: {detail}",
|
||
"reused": "from an earlier answer",
|
||
"readingsOne": "1 reading",
|
||
"readingsFew": "{count} readings",
|
||
"readingsOther": "{count} readings",
|
||
"aggregation": {
|
||
"mean": "average",
|
||
"median": "median",
|
||
"latest": "latest reading",
|
||
"sum": "total",
|
||
"count": "count",
|
||
"rate": "rate"
|
||
},
|
||
"averages": {
|
||
"day": "daily averages",
|
||
"week": "weekly averages",
|
||
"month": "monthly averages"
|
||
},
|
||
"totals": {
|
||
"day": "daily totals",
|
||
"week": "weekly totals",
|
||
"month": "monthly totals"
|
||
},
|
||
"absent": {
|
||
"noData": "no readings",
|
||
"outsideWindow": "no readings in this window",
|
||
"moduleDisabled": "switched off"
|
||
}
|
||
},
|
||
"followUp": {
|
||
"groupLabel": "Suggested follow-ups",
|
||
"widenWindow": "Look further back",
|
||
"previousPeriod": "Compare with the period before",
|
||
"yearAgo": "Compare with a year earlier",
|
||
"asChart": "Show as a chart",
|
||
"asTable": "Show as a table",
|
||
"relatedMetric": "See also: {metric}",
|
||
"continue": "Keep looking",
|
||
"settingLabel": "Suggest follow-up questions",
|
||
"settingHint": "Show up to three follow-up suggestions under the Coach's latest answer.",
|
||
"changeAssumption": "Instead: {value}"
|
||
},
|
||
"clarify": {
|
||
"cardLabel": "The Coach has a question",
|
||
"choicesLabel": "Possible answers",
|
||
"freeTextHint": "You can also type your own answer.",
|
||
"contextHint": "Type your answer below.",
|
||
"window": {
|
||
"last7days": "Last 7 days",
|
||
"last30days": "Last 30 days",
|
||
"last90days": "Last 90 days",
|
||
"lastYear": "Last 12 months",
|
||
"allTime": "All time"
|
||
},
|
||
"comparison": {
|
||
"baseline90d": "Compare with my usual 90 days"
|
||
},
|
||
"anchor": {
|
||
"illness": "Since the illness of {date}"
|
||
}
|
||
},
|
||
"reuse": {
|
||
"caption": "Here are the same figures from my last answer, unchanged."
|
||
}
|
||
},
|
||
"safety": {
|
||
"floor": {
|
||
"bpHighTitle": "Very high blood pressure",
|
||
"bpHighDoctor": "Two recent readings were {systolic}/{diastolic} mmHg or higher. Rest, re-check in a few minutes, and contact your doctor as soon as possible if it stays this high.",
|
||
"bpHighEmergency": "Two recent readings were {systolic}/{diastolic} mmHg or higher and you noted symptoms. If you have chest pain, breathlessness, weakness, or vision or speech changes, call emergency services now.",
|
||
"bpLowTitle": "Low blood pressure",
|
||
"bpLowDoctor": "Two recent readings had a systolic below {systolic} mmHg. If you feel dizzy or faint, sit or lie down, and contact your doctor if it continues.",
|
||
"bpLowEmergency": "Two recent readings had a systolic below {systolic} mmHg and you noted symptoms. If you feel faint, confused, or have cold clammy skin, call emergency services now.",
|
||
"glucoseLowTitle": "Low blood sugar",
|
||
"glucoseLowDoctor": "Two recent readings were below {threshold} {unit} ({value} {unit}). Take fast-acting carbohydrate, re-check in 15 minutes, and contact your doctor if lows continue.",
|
||
"glucoseLowEmergency": "Two recent readings were below {threshold} {unit} ({value} {unit}) and you noted symptoms. Treat now with fast-acting sugar; if you cannot, or you feel very unwell, call emergency services.",
|
||
"glucoseLowSevereTitle": "Very low blood sugar",
|
||
"glucoseLowSevereDoctor": "Two recent readings were below {threshold} {unit} ({value} {unit}). Treat immediately with fast-acting carbohydrate, re-check in 15 minutes, and contact your doctor.",
|
||
"glucoseLowSevereEmergency": "Two recent readings were below {threshold} {unit} ({value} {unit}) and you noted symptoms. Treat now; if you cannot keep food down or feel very unwell, call emergency services.",
|
||
"glucoseHighTitle": "Very high blood sugar",
|
||
"glucoseHighDoctor": "Two recent readings were {value} {unit} or higher. Re-check, hydrate, and contact your doctor as soon as possible if it stays this high.",
|
||
"glucoseHighEmergency": "Two recent readings were {value} {unit} or higher and you noted symptoms. If you have vomiting, fast breathing, or confusion, call emergency services now."
|
||
}
|
||
},
|
||
"version": {
|
||
"updateAvailable": {
|
||
"title": "A new version is available",
|
||
"reload": "Reload",
|
||
"dismiss": "Dismiss"
|
||
}
|
||
},
|
||
"mentalHealth": {
|
||
"pageTitle": "Mental wellbeing",
|
||
"pageDescription": "Four validated, voluntary self-checks. The trend over time says more than any single score.",
|
||
"attributionLabel": "Attribution",
|
||
"attributionShow": "Source and licence for {instrument}",
|
||
"choosePrompt": "Choose a check-in",
|
||
"start": "Start",
|
||
"back": "Back",
|
||
"submit": "See my result",
|
||
"submitting": "Saving…",
|
||
"saved": "Saved",
|
||
"error": "Something went wrong. Please try again.",
|
||
"instrument": {
|
||
"phq9": "PHQ-9 (mood)",
|
||
"gad7": "GAD-7 (worry)",
|
||
"who5": "WHO-5 (well-being)",
|
||
"sci": "SCI (sleep)"
|
||
},
|
||
"instrumentSub": {
|
||
"phq9": "Depression screen, 9 questions",
|
||
"gad7": "Anxiety screen, 7 questions",
|
||
"who5": "Well-being check, 5 questions",
|
||
"sci": "Sleep check, 8 questions"
|
||
},
|
||
"functionalOptionalHint": "Optional: you can submit without answering this question.",
|
||
"result": {
|
||
"title": "Your result",
|
||
"totalLabel": "Total score",
|
||
"bandLabel": "Range for this screen",
|
||
"takeAnother": "Take another check-in",
|
||
"scoreOf": "of {max}",
|
||
"firstCheckIn": "This is your first result for this questionnaire. From the next one on, the change shows here.",
|
||
"nextStep": "You can repeat this check-in in two weeks or later to follow the change. If something worries you, talk to a health professional at any time."
|
||
},
|
||
"band": {
|
||
"PHQ9": {
|
||
"minimal": "None / minimal",
|
||
"mild": "Mild",
|
||
"moderate": "Moderate",
|
||
"modSevere": "Moderately severe",
|
||
"severe": "Severe"
|
||
},
|
||
"GAD7": {
|
||
"minimal": "None / minimal",
|
||
"mild": "Mild",
|
||
"moderate": "Moderate",
|
||
"severe": "Severe"
|
||
},
|
||
"WHO5": {
|
||
"low": "Lower well-being",
|
||
"good": "Good well-being"
|
||
},
|
||
"SCI": {
|
||
"belowThreshold": "Possible insomnia range",
|
||
"aboveThreshold": "No insomnia indication"
|
||
}
|
||
},
|
||
"history": {
|
||
"title": "Your history",
|
||
"empty": "No check-ins yet. Your trend will appear here once you complete one.",
|
||
"flaggedBadge": "Support shown",
|
||
"chartTitle": "Score trend",
|
||
"totalLabel": "Score",
|
||
"bandLabel": "Category",
|
||
"answersToggle": "Answers",
|
||
"answersUnavailable": "The stored answers for this check-in cannot be decrypted."
|
||
},
|
||
"crisis": {
|
||
"title": "You don't have to face this alone",
|
||
"intro": "You indicated thoughts of being better off dead or of hurting yourself. Support is available right now, and reaching out is a sign of strength.",
|
||
"ifDanger": "If you are in immediate danger, call {emergency} now.",
|
||
"resourcesTitle": "People who can help"
|
||
},
|
||
"crisisResource": {
|
||
"telefonSeelsorge": {
|
||
"name": "TelefonSeelsorge (24/7, free, confidential)"
|
||
},
|
||
"nummerGegenKummer": {
|
||
"name": "Nummer gegen Kummer (for young people)"
|
||
},
|
||
"telefonSeelsorgeAt": {
|
||
"name": "Telefonseelsorge Österreich (24/7, free, confidential)"
|
||
},
|
||
"dargeboteneHand": {
|
||
"name": "Die Dargebotene Hand (24/7, free, confidential)"
|
||
},
|
||
"krisenchat": {
|
||
"name": "krisenchat (24/7 chat, young people)"
|
||
},
|
||
"findahelpline": {
|
||
"name": "Find a helpline (worldwide directory)"
|
||
},
|
||
"euEmotionalSupport": {
|
||
"name": "Emotional-support helpline"
|
||
},
|
||
"lifeline988": {
|
||
"name": "988 Suicide & Crisis Lifeline"
|
||
},
|
||
"crisisTextLine": {
|
||
"name": "Crisis Text Line"
|
||
},
|
||
"cvv": {
|
||
"name": "CVV, Centro de Valorização da Vida (Brazil, 24/7, free, confidential)"
|
||
},
|
||
"samu": {
|
||
"name": "SAMU medical emergency service (Brazil)"
|
||
},
|
||
"sns24": {
|
||
"name": "SNS 24 psychological counselling (Portugal, 24/7, choose option 4)"
|
||
},
|
||
"sosVozAmiga": {
|
||
"name": "SOS Voz Amiga (Portugal, daily 3.30 pm to 12.30 am)"
|
||
},
|
||
"zelfmoordpreventie113": {
|
||
"name": "113 Zelfmoordpreventie (Netherlands, 24/7, free, anonymous, also by chat)"
|
||
},
|
||
"zelfmoordlijn1813": {
|
||
"name": "Zelfmoordlijn 1813 (Belgium, 24/7, free, anonymous)"
|
||
}
|
||
},
|
||
"instrumentDescription": {
|
||
"phq9": "9-question depression screen. Answer for the last two weeks.",
|
||
"gad7": "7-question anxiety screen. Answer for the last two weeks.",
|
||
"who5": "5-question well-being check. Answer for the last two weeks; higher numbers mean better well-being.",
|
||
"sci": "8-question sleep check. Most questions ask about the past month; higher scores mean better sleep."
|
||
},
|
||
"next": "Next",
|
||
"lastResult": "Last test",
|
||
"lastScore": "Last result",
|
||
"noResultYet": "No check-in yet",
|
||
"backToList": "Overview",
|
||
"followUpHint": {
|
||
"phq9": "Your score is in a range where talking to a health professional may help. This is a gentle suggestion, not a diagnosis.",
|
||
"gad7": "Your score is in a range where talking to a health professional may help. This is a gentle suggestion, not a diagnosis.",
|
||
"who5": "A well-being score of 50 or below can be worth a closer look. If you like, the PHQ-9 check-in on this page looks at mood in more depth. This is a gentle suggestion, not a diagnosis.",
|
||
"sci": "In the study behind this questionnaire, scores of 16 or below were associated with probable insomnia. If poor sleep keeps troubling you, talking to a health professional may help. This is not a diagnosis."
|
||
},
|
||
"openDetail": "Show details",
|
||
"historyLoadError": "Your assessment history could not be loaded",
|
||
"historyLoadErrorHint": "This does not mean you have no results; the list could not be fetched. Try again.",
|
||
"privacyNote": "Your answers are stored encrypted and never reach the AI Coach.",
|
||
"trend": {
|
||
"sincePrevious": "Since your previous check-in on {date}: {change} points.",
|
||
"sinceFirst": "Since your first check-in on {date}: {change} points.",
|
||
"verdict": {
|
||
"improved": "That reaches the {threshold}-point change studies treat as meaningful, in the better direction.",
|
||
"worsened": "That reaches the {threshold}-point change studies treat as meaningful, in the less good direction.",
|
||
"within_threshold": "That is smaller than the {threshold}-point change studies treat as meaningful."
|
||
}
|
||
},
|
||
"wizard": {
|
||
"progressLabel": "Question {current} of {total}",
|
||
"followUpLabel": "Follow-up question (optional)",
|
||
"keyboardHint": "Number keys 1 to {count} choose an answer.",
|
||
"allAnswered": "All {total} questions answered"
|
||
},
|
||
"review": {
|
||
"title": "Check your answers",
|
||
"description": "Nothing is saved until you submit, and every answer can still be changed.",
|
||
"change": "Change",
|
||
"changeLabel": "Change the answer to question {number}",
|
||
"notAnswered": "Not answered",
|
||
"open": "Review answers"
|
||
},
|
||
"bandMeaning": {
|
||
"PHQ9": {
|
||
"minimal": "Your answers point to few or no symptoms of depression over the last two weeks.",
|
||
"mild": "Your answers point to mild symptoms of depression over the last two weeks.",
|
||
"moderate": "Your answers point to moderate symptoms of depression over the last two weeks.",
|
||
"modSevere": "Your answers point to moderately severe symptoms of depression over the last two weeks.",
|
||
"severe": "Your answers point to severe symptoms of depression over the last two weeks."
|
||
},
|
||
"GAD7": {
|
||
"minimal": "Your answers point to few or no symptoms of anxiety over the last two weeks.",
|
||
"mild": "Your answers point to mild symptoms of anxiety over the last two weeks.",
|
||
"moderate": "Your answers point to moderate symptoms of anxiety over the last two weeks.",
|
||
"severe": "Your answers point to severe symptoms of anxiety over the last two weeks."
|
||
},
|
||
"WHO5": {
|
||
"low": "Your well-being over the last two weeks was below the range the WHO-5 counts as good.",
|
||
"good": "Your well-being over the last two weeks was in the range the WHO-5 counts as good."
|
||
},
|
||
"SCI": {
|
||
"belowThreshold": "Your sleep over the last month was in the range where the study behind this questionnaire found insomnia likely.",
|
||
"aboveThreshold": "Your sleep over the last month was outside the range that study linked with insomnia."
|
||
}
|
||
},
|
||
"wording": {
|
||
"unvalidatedNote": "This translation has not been scientifically validated; treat the result as orientation.",
|
||
"showOriginal": "Show original English wording",
|
||
"showTranslation": "Show translation",
|
||
"resultUnvalidated": "Answered in a translation that has not been scientifically validated; treat the result as orientation.",
|
||
"historyUnvalidated": "Answered in a translation that has not been scientifically validated"
|
||
}
|
||
},
|
||
"records": {
|
||
"aiInclusion": {
|
||
"cardTitle": "AI profile access",
|
||
"cardDescription": "Choose which parts of your health profile may be used by Coach and comprehensive briefings.",
|
||
"sectionAboutMe": "About me",
|
||
"sectionConditions": "Chronic conditions",
|
||
"sectionAllergies": "Allergies and intolerances",
|
||
"sectionCoachFocus": "Coach focus",
|
||
"sectionFamilyHistory": "Family history",
|
||
"sectionSmoking": "Smoking status",
|
||
"sectionAlcohol": "Alcohol pattern",
|
||
"sectionShiftSchedule": "Work schedule",
|
||
"save": "Save access",
|
||
"savedToast": "AI profile access saved",
|
||
"saveError": "Could not save AI profile access",
|
||
"loadError": "Could not load AI profile access"
|
||
},
|
||
"profileFacts": {
|
||
"cardTitle": "Lifestyle context",
|
||
"smokingLabel": "Smoking status",
|
||
"alcoholLabel": "Alcohol pattern",
|
||
"shiftLabel": "Work schedule",
|
||
"notRecorded": "Not recorded",
|
||
"remove": "Remove {kind}",
|
||
"values": {
|
||
"SMOKING_STATUS": {
|
||
"NEVER": "Never smoked",
|
||
"FORMER": "Former smoker",
|
||
"CURRENT": "Currently smokes"
|
||
},
|
||
"ALCOHOL_PATTERN": {
|
||
"NONE": "None",
|
||
"OCCASIONAL": "Occasional",
|
||
"WEEKLY": "Weekly",
|
||
"MOST_DAYS": "Most days"
|
||
},
|
||
"SHIFT_SCHEDULE": {
|
||
"NONE": "No shift work",
|
||
"FIXED_SHIFT": "Fixed shift",
|
||
"ROTATING": "Rotating shifts"
|
||
}
|
||
}
|
||
},
|
||
"disclaimer": "These are your own records, not a medical diagnosis. HealthLog does not diagnose, treat, or interpret them.",
|
||
"allergies": {
|
||
"cardTitle": "Allergies & intolerances",
|
||
"cardDescription": "Substances you react to, with the reaction and how severe it is.",
|
||
"description": "Record an allergy or intolerance.",
|
||
"add": "Add allergy",
|
||
"addFirst": "Add your first allergy",
|
||
"addTitle": "Add allergy",
|
||
"editTitle": "Edit allergy",
|
||
"formDescription": "The substance is stored as plain text; the reaction and note are encrypted.",
|
||
"emptyTitle": "No allergies recorded",
|
||
"emptyDescription": "Add substances you react to and their reactions.",
|
||
"loadError": "Couldn't load your allergies.",
|
||
"deletedToast": "Allergy deleted",
|
||
"deleteError": "Couldn't delete the allergy.",
|
||
"deleteConfirmTitle": "Delete this allergy?",
|
||
"deleteConfirmDescription": "This removes the record. It can't be undone.",
|
||
"category": {
|
||
"FOOD": "Food",
|
||
"MEDICATION": "Medication",
|
||
"ENVIRONMENT": "Environment",
|
||
"BIOLOGIC": "Biologic",
|
||
"OTHER": "Other"
|
||
},
|
||
"type": {
|
||
"ALLERGY": "Allergy",
|
||
"INTOLERANCE": "Intolerance"
|
||
},
|
||
"severity": {
|
||
"NONE": "Not assessed",
|
||
"MILD": "Mild",
|
||
"MODERATE": "Moderate",
|
||
"SEVERE": "Severe"
|
||
},
|
||
"status": {
|
||
"ACTIVE": "Active",
|
||
"INACTIVE": "Inactive",
|
||
"RESOLVED": "Resolved"
|
||
},
|
||
"form": {
|
||
"substance": "Substance",
|
||
"substancePlaceholder": "e.g. Penicillin, Peanuts",
|
||
"category": "Category",
|
||
"type": "Type",
|
||
"severity": "Severity",
|
||
"status": "Status",
|
||
"onset": "First noticed",
|
||
"reaction": "Reaction",
|
||
"reactionPlaceholder": "e.g. hives, swelling, anaphylaxis",
|
||
"note": "Note",
|
||
"notePlaceholder": "Anything else worth remembering",
|
||
"requiredError": "Enter the substance.",
|
||
"savedToast": "Allergy saved",
|
||
"updatedToast": "Allergy updated",
|
||
"saveError": "Couldn't save the allergy."
|
||
},
|
||
"freeText": {
|
||
"label": "Free-text note (allergies & intolerances)",
|
||
"hint": "A free-text supplement to the structured list above, for context a single entry cannot carry.",
|
||
"savedToast": "Allergy note saved",
|
||
"saveError": "Could not save. Please try again."
|
||
}
|
||
},
|
||
"family": {
|
||
"cardTitle": "Family history",
|
||
"cardDescription": "Conditions in your relatives, one entry per condition.",
|
||
"description": "Record a condition in a relative.",
|
||
"add": "Add entry",
|
||
"addFirst": "Add your first entry",
|
||
"addTitle": "Add family history",
|
||
"editTitle": "Edit family history",
|
||
"formDescription": "The relationship and condition are stored as plain text; the note is encrypted.",
|
||
"emptyTitle": "No family history recorded",
|
||
"emptyDescription": "Add conditions that run in your family.",
|
||
"loadError": "Couldn't load your family history.",
|
||
"deletedToast": "Entry deleted",
|
||
"deleteError": "Couldn't delete the entry.",
|
||
"deleteConfirmTitle": "Delete this entry?",
|
||
"deleteConfirmDescription": "This removes the record. It can't be undone.",
|
||
"ageAtOnsetShort": "Age {age}",
|
||
"relationship": {
|
||
"MOTHER": "Mother",
|
||
"FATHER": "Father",
|
||
"SISTER": "Sister",
|
||
"BROTHER": "Brother",
|
||
"DAUGHTER": "Daughter",
|
||
"SON": "Son",
|
||
"GRANDMOTHER_MATERNAL": "Grandmother (maternal)",
|
||
"GRANDFATHER_MATERNAL": "Grandfather (maternal)",
|
||
"GRANDMOTHER_PATERNAL": "Grandmother (paternal)",
|
||
"GRANDFATHER_PATERNAL": "Grandfather (paternal)",
|
||
"AUNT": "Aunt",
|
||
"UNCLE": "Uncle",
|
||
"COUSIN": "Cousin",
|
||
"HALF_SIBLING": "Half-sibling",
|
||
"OTHER": "Other relative"
|
||
},
|
||
"form": {
|
||
"relationship": "Relative",
|
||
"condition": "Condition",
|
||
"conditionPlaceholder": "e.g. Type 2 diabetes, Breast cancer",
|
||
"ageAtOnset": "Age at onset",
|
||
"ageAtOnsetPlaceholder": "e.g. 55",
|
||
"note": "Note",
|
||
"notePlaceholder": "Anything else worth remembering",
|
||
"requiredError": "Enter the condition.",
|
||
"ageError": "Enter an age between 0 and 120.",
|
||
"savedToast": "Entry saved",
|
||
"updatedToast": "Entry updated",
|
||
"saveError": "Couldn't save the entry."
|
||
}
|
||
},
|
||
"conditions": {
|
||
"cardTitle": "Pre-existing conditions",
|
||
"cardDescription": "Chronic conditions and what the Coach watches.",
|
||
"conditionsLabel": "Chronic conditions",
|
||
"focusLabel": "What the Coach watches",
|
||
"loadError": "Couldn't load your conditions.",
|
||
"savedToast": "Conditions saved",
|
||
"saveError": "Could not save. Please try again."
|
||
},
|
||
"emergency": {
|
||
"cardTitle": "Emergency information",
|
||
"cardDescription": "What a first responder needs first: blood type, contacts, directives.",
|
||
"bloodType": "Blood type",
|
||
"organDonor": "Organ donor",
|
||
"advanceDirective": "Advance directive",
|
||
"contacts": "Emergency contacts",
|
||
"implants": "Implants and devices",
|
||
"note": "Additional notes",
|
||
"notRecorded": "Not recorded",
|
||
"bloodTypeValues": {
|
||
"A_POS": "A positive",
|
||
"A_NEG": "A negative",
|
||
"B_POS": "B positive",
|
||
"B_NEG": "B negative",
|
||
"AB_POS": "AB positive",
|
||
"AB_NEG": "AB negative",
|
||
"O_POS": "O positive",
|
||
"O_NEG": "O negative",
|
||
"UNKNOWN": "Unknown"
|
||
},
|
||
"organDonorValues": {
|
||
"YES": "Yes",
|
||
"NO": "No",
|
||
"UNKNOWN": "Not stated"
|
||
},
|
||
"advanceDirectiveValues": {
|
||
"EXISTS": "Exists",
|
||
"NONE": "None",
|
||
"UNKNOWN": "Not stated"
|
||
},
|
||
"contactsPlaceholder": "Name and phone number of who to call",
|
||
"implantsPlaceholder": "E.g. pacemaker, insulin pump, metal implant",
|
||
"notePlaceholder": "Anything a clinician should know in an emergency",
|
||
"reportHint": "This appears on the first page of your doctor report.",
|
||
"save": "Save",
|
||
"savedToast": "Emergency information saved",
|
||
"saveError": "Couldn't save your emergency information.",
|
||
"loadError": "Couldn't load your emergency information."
|
||
},
|
||
"life": {
|
||
"cardTitle": "Life circumstances",
|
||
"cardDescription": "Smoking, alcohol, activity, work, habits and goals, dated and each optional.",
|
||
"loadError": "Your life circumstances could not be loaded.",
|
||
"noAnswer": "No answer",
|
||
"yes": "Yes",
|
||
"no": "No",
|
||
"validSince": "Valid since",
|
||
"month": "Month",
|
||
"year": "Year",
|
||
"lastConfirmed": "Last confirmed on {date}",
|
||
"notAnswered": "Not answered yet",
|
||
"unreadable": "This answer cannot be read on this server.",
|
||
"save": "Save section",
|
||
"savedToast": "Section saved",
|
||
"saveError": "The section could not be saved.",
|
||
"review": {
|
||
"question": "Is this still true? Your last answer is more than a year old.",
|
||
"confirm": "Still true",
|
||
"confirmedToast": "Thanks, marked as still true",
|
||
"confirmError": "The confirmation could not be saved."
|
||
},
|
||
"ai": {
|
||
"label": "Share this section with the AI",
|
||
"shiftLabel": "Share shift work with the AI",
|
||
"hint": "Off means the Coach and the briefings never see these answers.",
|
||
"savedToast": "AI sharing updated",
|
||
"saveError": "The AI setting could not be saved."
|
||
},
|
||
"sections": {
|
||
"tobacco": {
|
||
"title": "Smoking and nicotine"
|
||
},
|
||
"alcohol": {
|
||
"title": "Alcohol"
|
||
},
|
||
"activity": {
|
||
"title": "Activity and sitting"
|
||
},
|
||
"work": {
|
||
"title": "Work and rhythm"
|
||
},
|
||
"habits": {
|
||
"title": "Sleep, diet and caffeine"
|
||
},
|
||
"goals": {
|
||
"title": "Goals"
|
||
}
|
||
},
|
||
"fields": {
|
||
"smokingStatus": "Smoking status",
|
||
"products": "Products used",
|
||
"cigarettesPerDay": "Cigarettes per day",
|
||
"startYear": "Year you started",
|
||
"quitMonth": "When you stopped",
|
||
"secondhandSmoke": "Regular secondhand smoke",
|
||
"moderateDaysPerWeek": "Days per week with moderate to strenuous activity, such as brisk walking",
|
||
"moderateMinutesPerDay": "Minutes on those days, on average",
|
||
"sittingHoursWorkday": "Hours sitting on a workday",
|
||
"shiftSchedule": "Shift work",
|
||
"situation": "Work situation",
|
||
"physicalNature": "Kind of work",
|
||
"nightWork": "Night work",
|
||
"exposures": "Exposures at work",
|
||
"freeWeekdays": "Free days of the week",
|
||
"napRegularly": "Regular nap",
|
||
"snoringReported": "Others say you snore",
|
||
"dietPattern": "Diet",
|
||
"dietSpecifics": "Specifics",
|
||
"lateMealsPerWeek": "Meals after 9 pm per week",
|
||
"fruitVegPortionsPerDay": "Portions of fruit and vegetables per day",
|
||
"caffeineDrinksPerDay": "Caffeinated drinks per day",
|
||
"latestCaffeine": "Latest caffeine of the day",
|
||
"goals": "What you want to work on",
|
||
"goalsHint": "Up to three."
|
||
},
|
||
"values": {
|
||
"products": {
|
||
"cigarettes": "Cigarettes",
|
||
"cigars_pipe": "Cigars or pipe",
|
||
"e_cigarette": "E-cigarette",
|
||
"heated_tobacco": "Heated tobacco",
|
||
"snus_pouches": "Snus or nicotine pouches"
|
||
},
|
||
"situation": {
|
||
"none": "Not in paid work",
|
||
"indoor": "Mostly indoors",
|
||
"outdoor": "Mostly outdoors",
|
||
"mixed": "Indoors and outdoors"
|
||
},
|
||
"physicalNature": {
|
||
"mostly_sitting": "Mostly sitting",
|
||
"standing_walking": "Standing or walking",
|
||
"heavy_physical": "Heavy physical work"
|
||
},
|
||
"exposures": {
|
||
"heat": "Heat",
|
||
"cold": "Cold",
|
||
"dust": "Dust",
|
||
"fumes_solvents": "Fumes or solvents",
|
||
"noise": "Noise"
|
||
},
|
||
"dietPattern": {
|
||
"mixed": "Mixed diet",
|
||
"vegetarian": "Vegetarian",
|
||
"vegan": "Vegan",
|
||
"pescetarian": "Pescetarian",
|
||
"other": "Other"
|
||
},
|
||
"dietSpecifics": {
|
||
"intermittent_fasting": "Intermittent fasting",
|
||
"low_carb": "Low carb",
|
||
"prescribed_diet": "Diet prescribed by a doctor"
|
||
},
|
||
"latestCaffeine": {
|
||
"before_12": "Before noon",
|
||
"12_15": "Noon to 3 pm",
|
||
"15_18": "3 to 6 pm",
|
||
"after_18": "After 6 pm"
|
||
},
|
||
"goals": {
|
||
"weight": "Weight",
|
||
"blood_pressure": "Blood pressure",
|
||
"blood_sugar": "Blood sugar",
|
||
"sleep": "Sleep",
|
||
"fitness": "Fitness",
|
||
"stress_recovery": "Stress and recovery",
|
||
"medication_routine": "Taking medication regularly",
|
||
"quit_smoking": "Stop smoking",
|
||
"less_alcohol": "Drink less alcohol"
|
||
},
|
||
"weekdays": {
|
||
"1": "Mon",
|
||
"2": "Tue",
|
||
"3": "Wed",
|
||
"4": "Thu",
|
||
"5": "Fri",
|
||
"6": "Sat",
|
||
"7": "Sun"
|
||
}
|
||
},
|
||
"derived": {
|
||
"packYears": "{value} pack-years",
|
||
"packYearsMissing": "Pack-years need cigarettes per day and the year you started.",
|
||
"activityMinutes": "{value} minutes a week.",
|
||
"meetsWho": "That meets the WHO recommendation of 150 minutes a week.",
|
||
"belowWho": "That is below the WHO recommendation of 150 minutes a week.",
|
||
"measuredSteps": "Your measured steps come first; this answer adds context.",
|
||
"freeDaysDefault": "Without an answer, Saturday and Sunday count as free days."
|
||
},
|
||
"auditC": {
|
||
"intro": "Three questions on alcohol from the WHO AUDIT. A screening, not a diagnosis.",
|
||
"start": "Answer the questions",
|
||
"again": "Answer again",
|
||
"offerDue": "A quick look once a year is enough.",
|
||
"notValidated": "There is no validated translation for your language yet, so the questions are shown in English.",
|
||
"submit": "Save answers",
|
||
"savedToast": "Answers saved",
|
||
"saveError": "The answers could not be saved.",
|
||
"result": "{score} of 12 points",
|
||
"above": "At or above the screening cut-off of {cutoff}.",
|
||
"below": "Below the screening cut-off of {cutoff}.",
|
||
"noCutoff": "Without a sex in your profile only the sum is shown.",
|
||
"source": "Source: {source}",
|
||
"history": "Earlier entries",
|
||
"remove": "Remove entry",
|
||
"removeConfirmTitle": "Remove this entry?",
|
||
"removeConfirmBody": "The entry leaves your history. This cannot be undone here.",
|
||
"removedToast": "Entry removed",
|
||
"removeError": "The entry could not be removed.",
|
||
"historyEntry": "{date}: {score} of 12",
|
||
"legacyLabel": "Earlier answer: {value}",
|
||
"legacyHint": "From the short alcohol question asked before this questionnaire. Once a questionnaire result is on file, the Coach no longer reads it.",
|
||
"legacyRemove": "Remove earlier answer",
|
||
"legacyRemoveConfirmTitle": "Remove the earlier answer?",
|
||
"legacyRemoveConfirmBody": "The earlier answer leaves your record. Questionnaire results stay.",
|
||
"legacyRemovedToast": "Earlier answer removed",
|
||
"legacyRemoveError": "The earlier answer could not be removed."
|
||
},
|
||
"takeOver": {
|
||
"conditionsButton": "Add to condition journal",
|
||
"allergiesButton": "Add to allergies",
|
||
"conditionsTitle": "Add a chronic condition",
|
||
"allergiesTitle": "Add an allergy",
|
||
"description": "Your free text stays as it is until you clear it yourself.",
|
||
"freeTextLabel": "Your free text",
|
||
"conditionLabel": "Condition",
|
||
"onset": "Since",
|
||
"save": "Add",
|
||
"savedToast": "Entry added",
|
||
"saveError": "The entry could not be added.",
|
||
"clearQuestion": "The entry is saved. Clear the free text now?",
|
||
"clear": "Clear free text",
|
||
"keep": "Keep it",
|
||
"clearedToast": "Free text cleared",
|
||
"clearError": "The free text could not be cleared."
|
||
},
|
||
"screening": {
|
||
"cardTitle": "Screening hints",
|
||
"cardDescription": "From your life circumstances, with the rule and the country it comes from.",
|
||
"noReminder": "This is a hint only; set a reminder yourself if you want one.",
|
||
"source": "Source: {source}",
|
||
"titles": {
|
||
"lung_ldct": "Low-dose CT for lung cancer",
|
||
"aaa_ultrasound": "Ultrasound of the abdominal aorta"
|
||
},
|
||
"status": {
|
||
"suggested": "May apply to you",
|
||
"not_eligible": "Does not apply to you",
|
||
"unknown": "Not enough information"
|
||
},
|
||
"reasons": {
|
||
"never_smoked": "You have never smoked.",
|
||
"missing_birth_date": "Your birth date is missing.",
|
||
"age_out_of_range": "Your age is outside the range.",
|
||
"missing_smoking_status": "Your smoking status is missing.",
|
||
"no_cigarettes": "The rule counts cigarettes only.",
|
||
"missing_smoking_history": "Cigarettes per day or the start year is missing.",
|
||
"pack_years_below_15": "Fewer than 15 pack-years.",
|
||
"pack_years_below_20": "Fewer than 20 pack-years.",
|
||
"smoked_years_below_25": "Fewer than 25 years of smoking.",
|
||
"missing_quit_date": "The date you stopped is missing.",
|
||
"quit_over_10_years": "You stopped more than 10 years ago.",
|
||
"quit_over_15_years": "You stopped more than 15 years ago.",
|
||
"missing_sex": "Your sex is missing in the profile.",
|
||
"sex_not_male": "The rule applies to men."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"environment": {
|
||
"fields": {
|
||
"tempMean": "Daily temperature",
|
||
"tempMin": "Overnight low",
|
||
"sunshine": "Sunshine",
|
||
"daylight": "Daylight",
|
||
"precip": "Precipitation",
|
||
"pressureMean": "Barometric pressure",
|
||
"pressureDelta": "Pressure swing",
|
||
"pm25": "Fine particles (PM2.5)",
|
||
"pm10": "Particles (PM10)",
|
||
"no2": "Nitrogen dioxide",
|
||
"ozone8h": "Ozone (8-hour high)",
|
||
"europeanAqi": "European air quality index",
|
||
"uvIndexMax": "UV index (high)",
|
||
"dustMax": "Saharan dust",
|
||
"pollenMax": "Pollen (highest)"
|
||
},
|
||
"chip": {
|
||
"day": "Weather on {date}",
|
||
"pollenHigh": "High pollen: {kinds}",
|
||
"hotNight": "Warm night",
|
||
"veryPoorAir": "Very poor air"
|
||
},
|
||
"pollen": {
|
||
"alder": "alder",
|
||
"birch": "birch",
|
||
"grass": "grass",
|
||
"mugwort": "mugwort",
|
||
"olive": "olive",
|
||
"ragweed": "ragweed"
|
||
},
|
||
"movement": {
|
||
"awayFromHome": "Time away from home",
|
||
"distance": "Distance travelled"
|
||
}
|
||
},
|
||
"documents": {
|
||
"title": "Documents",
|
||
"subtitle": "Every letter, report and scan in one searchable place, encrypted at rest.",
|
||
"pageUpload": "Upload",
|
||
"ownerOnlyUpload": "Documents can only be added by the record owner.",
|
||
"kind": {
|
||
"DOCTOR_REPORT": "Doctor report",
|
||
"DISCHARGE_LETTER": "Discharge letter",
|
||
"OTHER": "Other",
|
||
"LAB_RESULT": "Lab result",
|
||
"IMAGING": "Imaging",
|
||
"PRESCRIPTION": "Prescription",
|
||
"REFERRAL": "Referral",
|
||
"INSURANCE": "Insurance",
|
||
"VACCINATION": "Vaccination",
|
||
"SICK_NOTE": "Sick note"
|
||
},
|
||
"filter": {
|
||
"searchLabel": "Search documents",
|
||
"searchPlaceholder": "Search title or filename…",
|
||
"typeGroup": "Document type",
|
||
"conditionGroup": "Condition",
|
||
"procedureGroup": "Procedures and surgeries",
|
||
"yearGroup": "Year",
|
||
"clear": "Clear filters",
|
||
"typeAll": "All types",
|
||
"typeCount": "{count} types",
|
||
"conditionAll": "All conditions",
|
||
"procedureAll": "All procedures",
|
||
"yearAll": "All years"
|
||
},
|
||
"card": {
|
||
"untitled": "Untitled document",
|
||
"selectLabel": "Select {title}",
|
||
"openLabel": "Open {title}",
|
||
"attachmentBadge": "Download only",
|
||
"uploading": "Uploading…",
|
||
"dismissFailed": "Dismiss failed upload",
|
||
"processing": "Processing…",
|
||
"ready": "Ready",
|
||
"deleteKey": "Del"
|
||
},
|
||
"error": {
|
||
"fileTooLarge": "This file is larger than the {maxSize} limit.",
|
||
"quotaExceeded": "Storage is full: {used} of {quota} used.",
|
||
"unsupportedType": "This file type is not supported.",
|
||
"purged": "This document was permanently removed and cannot be restored.",
|
||
"duplicateExists": "An identical document is already stored.",
|
||
"rateLimited": "Too many uploads right now. Try again in a few minutes.",
|
||
"generic": "Upload failed. Please try again."
|
||
},
|
||
"toast": {
|
||
"duplicate": "Already stored. The existing document is highlighted.",
|
||
"deleted": "Document deleted",
|
||
"restoreFailed": "Couldn't restore the document.",
|
||
"deletedHint": "Deleted documents stay in Recently deleted for {days} days."
|
||
},
|
||
"timeline": {
|
||
"loadingMore": "Loading more…",
|
||
"listLabel": "Documents timeline"
|
||
},
|
||
"upload": {
|
||
"browse": "Choose files",
|
||
"quotaAlmostFull": "Storage almost full",
|
||
"quotaUsed": "{used} of {quota} used",
|
||
"queuedAnnouncement": "{count} file(s) added to the upload queue"
|
||
},
|
||
"selection": {
|
||
"count": "{count} selected",
|
||
"clear": "Clear selection"
|
||
},
|
||
"list": {
|
||
"loadError": "Couldn't load your documents."
|
||
},
|
||
"empty": {
|
||
"title": "Your document vault is empty",
|
||
"description": "Store doctor letters, lab reports, imaging, prescriptions and vaccination records. They are encrypted and searchable by type, condition and year.",
|
||
"action": "Upload a first document",
|
||
"noMatchesTitle": "No matching documents",
|
||
"noMatchesDescription": "Nothing matches the current search and filters."
|
||
},
|
||
"detail": {
|
||
"title": "Document details",
|
||
"summary": {
|
||
"title": "Summary",
|
||
"pending": "The summary is being prepared.",
|
||
"none": "No summary has been generated for this document yet.",
|
||
"withheld": "A summary was generated but did not pass the safety check, so it is not shown. You can try again, or read the document itself.",
|
||
"unavailable": "No summary could be generated for this document.",
|
||
"generate": "Generate summary",
|
||
"generating": "Generating…"
|
||
},
|
||
"index": {
|
||
"outcome": {
|
||
"local-empty": "No readable text was found. This looks like a scan; an AI vision provider can read it.",
|
||
"local-unsupported": "This file type can't be read for search.",
|
||
"decrypt-error": "The stored file couldn't be opened for reading.",
|
||
"raster-failed": "The PDF pages couldn't be rendered for reading. Scanned fax compression formats are a known cause.",
|
||
"provider-error": "The AI provider couldn't read this document on the last try.",
|
||
"pdf-needs-anthropic": "This server's processor can't run the PDF page renderer, and this PDF has no text layer. An AI provider that takes PDF files directly can read it, or photos of the pages.",
|
||
"empty-transcription": "The AI provider returned no text for this document.",
|
||
"resource-limit": "This PDF is too large or complex to read here. The file itself is fine and still opens."
|
||
}
|
||
},
|
||
"loadError": "Couldn't load this document.",
|
||
"saveError": "Couldn't save the change.",
|
||
"deleteError": "Couldn't delete the document.",
|
||
"download": "Download",
|
||
"openInNewTab": "Open in new tab",
|
||
"delete": "Delete",
|
||
"titleLabel": "Title",
|
||
"titlePlaceholder": "Add a title",
|
||
"kindLabel": "Type",
|
||
"dateLabel": "Document date",
|
||
"conditionsLabel": "Linked conditions",
|
||
"linkCondition": "Link",
|
||
"noConditions": "Not linked to a condition",
|
||
"previewUnavailable": "No inline preview for this file type",
|
||
"uploadedMeta": "Added {date}, {size}",
|
||
"importedFrom": "Imported from {system}",
|
||
"importedFromWithId": "Imported from {system}, ID {id}",
|
||
"sourceOther": "another system",
|
||
"share": "Share",
|
||
"labValuesLink": "View {count} lab values",
|
||
"visitsLabel": "Belongs to visit",
|
||
"vaccinationsLabel": "Vaccinations",
|
||
"noVisitsToLink": "No visits recorded yet.",
|
||
"noVaccinationsToLink": "No vaccinations recorded yet."
|
||
},
|
||
"dropOverlay": {
|
||
"title": "Drop files to upload",
|
||
"hint": "They are stored encrypted in your document vault"
|
||
},
|
||
"bulk": {
|
||
"barLabel": "Actions for selected documents",
|
||
"setKind": "Change type",
|
||
"linkCondition": "Link condition",
|
||
"delete": "Delete",
|
||
"updated": "{count} document(s) updated",
|
||
"deleted": "{count} document(s) deleted",
|
||
"restored": "{count} document(s) restored",
|
||
"partialFailure": "{failed} of {total} could not be updated",
|
||
"failed": "The action could not be completed",
|
||
"share": "Share",
|
||
"shareTooMany": "A share link can hold at most {max} documents. Deselect some and try again.",
|
||
"linkVisit": "File against visit"
|
||
},
|
||
"episodeCard": {
|
||
"title": "Documents",
|
||
"link": "Link",
|
||
"upload": "Upload",
|
||
"viewAll": "Show all",
|
||
"emptyLine": "No documents linked to this condition yet.",
|
||
"loadError": "Could not load the linked documents"
|
||
},
|
||
"linkPicker": {
|
||
"title": "Link documents",
|
||
"description": "Pick documents from your vault that belong to this condition.",
|
||
"searchPlaceholder": "Search by title or filename",
|
||
"empty": "No documents found."
|
||
},
|
||
"assist": {
|
||
"suggest": "Suggest details",
|
||
"suggesting": "Reading…",
|
||
"suggestedTitle": "Suggested title",
|
||
"suggestedKind": "Suggested type",
|
||
"suggestedDate": "Suggested date",
|
||
"apply": "Apply",
|
||
"useTitle": "Use title",
|
||
"applied": "Applied",
|
||
"dismiss": "Dismiss",
|
||
"empty": "Nothing could be read from this document.",
|
||
"unavailableBody": "Set up an AI provider to suggest a title, type, and date.",
|
||
"unavailableLocalOcr": "Turn on “Read scans on this device” under Settings → Modules → Labs to read images on this device.",
|
||
"unavailableAction": "Open AI settings",
|
||
"errorGeneric": "Couldn't read the document. Try again.",
|
||
"errorOcr": "Couldn't read text from this image.",
|
||
"errorRateLimited": "The hourly AI reading limit is reached. Try again later.",
|
||
"errorRateLimitedWaitOne": "The hourly AI reading limit is reached. Try again in about a minute.",
|
||
"errorRateLimitedWaitFew": "The hourly AI reading limit is reached. Try again in about {count} minutes.",
|
||
"errorRateLimitedWaitOther": "The hourly AI reading limit is reached. Try again in about {count} minutes.",
|
||
"errorBudget": "Your AI budget for today is used up.",
|
||
"errorPdfRendererUnavailable": "This server's processor can't run the PDF page renderer, so a scanned PDF can only be read by an AI provider that takes PDF files directly, or as photos of the pages.",
|
||
"errorFileType": "This file type can't be read.",
|
||
"errorNotIndexed": "Read the document first, then extract.",
|
||
"errorOutputLimit": "The AI provider reached its output limit before it returned a single value. Try a model that allows longer answers.",
|
||
"errorLocalOcrDisabled": "Turn on “Read scans on this device” under Settings → Modules → Labs first.",
|
||
"errorProvider": "No AI provider is set up for this.",
|
||
"errorTextImageOnly": "Local OCR reads images only, not this file.",
|
||
"errorConsent": "Reading documents with AI needs your consent first.",
|
||
"errorUnavailable": "Reading documents with AI is not available here right now.",
|
||
"unavailableLocalOcrAction": "Open lab settings"
|
||
},
|
||
"summary": {
|
||
"summarise": "Summarise",
|
||
"showText": "Show extracted text",
|
||
"summaryTitle": "Summary",
|
||
"textTitle": "Extracted text",
|
||
"close": "Hide"
|
||
},
|
||
"ai": {
|
||
"readDone": "The AI read your document.",
|
||
"readStagedOne": "The AI read your document. 1 lab value is ready to review.",
|
||
"readStagedFew": "The AI read your document. {count} lab values are ready to review.",
|
||
"readStagedOther": "The AI read your document. {count} lab values are ready to review.",
|
||
"read": "Read with AI",
|
||
"reread": "Read again",
|
||
"reading": "Reading…",
|
||
"notReadYet": "This document has not been read yet."
|
||
},
|
||
"review": {
|
||
"title": "Review extracted values",
|
||
"hint": "Approve what matches the document. Unchecked values are discarded; nothing is saved without your confirmation.",
|
||
"openOne": "Review extracted value",
|
||
"openFew": "Review extracted values ({count})",
|
||
"openOther": "Review extracted values ({count})",
|
||
"includeAria": "Include {value}",
|
||
"type": {
|
||
"OBSERVATION": "Lab value",
|
||
"CONDITION": "Condition",
|
||
"MEDICATION_STATEMENT": "Medication"
|
||
},
|
||
"statedRange": "Stated range {range}",
|
||
"needsCheck": "Check this value against the document, then save it.",
|
||
"verify": "Check",
|
||
"verifySave": "Save value",
|
||
"verifyInvalid": "Enter a name and either a numeric value or a text result, not both.",
|
||
"verifyFailed": "The correction couldn't be saved. Try again.",
|
||
"fieldName": "Name",
|
||
"fieldDate": "Date",
|
||
"fieldValue": "Value",
|
||
"fieldValueText": "Result (text)",
|
||
"fieldUnit": "Unit",
|
||
"fieldDose": "Dose",
|
||
"unverifiedNoteOne": "1 value still needs checking and stays pending.",
|
||
"unverifiedNoteFew": "{count} values still need checking and stay pending.",
|
||
"unverifiedNoteOther": "{count} values still need checking and stay pending.",
|
||
"finish": "Finish review",
|
||
"confirmFailed": "The review couldn't be saved. Try again.",
|
||
"savedToastOne": "1 value saved",
|
||
"savedToastFew": "{count} values saved",
|
||
"savedToastOther": "{count} values saved",
|
||
"nothingSavedToast": "Review saved. No values were added.",
|
||
"extract": "Extract lab values",
|
||
"extracting": "Extracting…",
|
||
"extractHint": "Uses the text already read from this document. Extracted values wait for your review; nothing is saved automatically.",
|
||
"extractEmpty": "No values could be extracted from this document.",
|
||
"extractIncomplete": "Part of the document could not be read in full, so some values may be missing. Check the list against the document.",
|
||
"failUnitRequired": "A numeric value needs a unit before it can be saved.",
|
||
"failUnitMismatch": "The stated unit does not match the saved unit for this marker. Adjust it, then finish the review again.",
|
||
"failGeneric": "This value could not be saved.",
|
||
"failUnknownBiomarker": "The chosen biomarker no longer exists. Pick another one."
|
||
},
|
||
"contentIndex": {
|
||
"indexPrompt": "Make document contents searchable.",
|
||
"indexAll": "Index all for search",
|
||
"indexAllPending": "Starting…",
|
||
"indexAllQueued": "Indexing {count} document(s) in the background.",
|
||
"indexAllNothing": "Everything is already indexed.",
|
||
"indexAllError": "Couldn't start indexing."
|
||
},
|
||
"share": {
|
||
"title": "Share this document",
|
||
"multiTitle": "Share these documents",
|
||
"multiLabel": "{count} documents",
|
||
"description": "Create a read-only clinician link with this document attached. The link and its passphrase appear once."
|
||
},
|
||
"chat": {
|
||
"title": "Chat about this document",
|
||
"openButton": "Ask the Coach"
|
||
},
|
||
"readingConsent": {
|
||
"body": "Reading with AI sends this to your AI service outside this server. Allow HealthLog to send documents, lab reports and medication descriptions for reading?",
|
||
"grant": "Allow reading",
|
||
"error": "The consent could not be saved. Please try again."
|
||
},
|
||
"sourcePicker": {
|
||
"open": "Import from archive",
|
||
"openNamed": "Import from {name}",
|
||
"title": "Import from {name}",
|
||
"description": "Search by name, then tick the documents HealthLog should copy.",
|
||
"sourceLabel": "Archive",
|
||
"searchLabel": "Document name",
|
||
"searchPlaceholder": "Search by name",
|
||
"tagLabel": "Tag",
|
||
"tagAny": "Any tag",
|
||
"fromLabel": "From",
|
||
"toLabel": "To",
|
||
"clearFilters": "Clear tag and dates",
|
||
"rangeInvalid": "The end date is before the start date.",
|
||
"empty": "{name} has no documents to show.",
|
||
"noMatch": "No documents match.",
|
||
"loadMore": "Load more",
|
||
"stateImported": "In HealthLog",
|
||
"stateDeleted": "Deleted in HealthLog",
|
||
"stateInTrash": "In Recently deleted",
|
||
"selectedCount": "{count} of up to {max} selected",
|
||
"importAction": "Import {count}",
|
||
"importing": "Importing, one document at a time…",
|
||
"done": "Done",
|
||
"summary": "Imported: {imported}. Already there: {present}. Not imported: {failed}.",
|
||
"stopped": "Stopped: {reason}",
|
||
"result": {
|
||
"waiting": "Waiting",
|
||
"working": "Importing…",
|
||
"imported": "Imported",
|
||
"importedLinked": "Imported and linked",
|
||
"duplicate": "Already in HealthLog",
|
||
"duplicateLinked": "Already in HealthLog, now linked",
|
||
"deleted": "Deleted in HealthLog, left alone",
|
||
"restored": "Restored from Recently deleted",
|
||
"restoredLinked": "Restored from Recently deleted and linked"
|
||
},
|
||
"errors": {
|
||
"unavailable": "Document archives are not enabled on this server.",
|
||
"notConnected": "This archive is not connected. Connect it under Settings, Integrations.",
|
||
"originNotAllowed": "This address is not on the server's list of allowed archives. Ask the administrator to add it.",
|
||
"unreachable": "The archive could not be reached. Check that it is running and that the address is right.",
|
||
"redirected": "The archive redirected the request. Enter the address it redirects to.",
|
||
"authRefused": "The archive refused the token. Check the token and its permissions.",
|
||
"versionTooOld": "The archive is too old. Paperless-ngx 2.16 or later is needed.",
|
||
"badResponse": "The archive's answer could not be read. Check that the address points at the archive itself.",
|
||
"notFound": "The archive has no such document, or the organization id is wrong or not yours.",
|
||
"linkTargetNotFound": "The record to link to no longer exists.",
|
||
"rateLimited": "Too many requests. Wait a minute and try again.",
|
||
"browserOnly": "Document archives can only be used in the browser.",
|
||
"invalidAddress": "Enter the full address, starting with https:// or http://.",
|
||
"organizationRequired": "Enter the Papra organization id.",
|
||
"tokenRequired": "Enter the API token. A new address needs it again.",
|
||
"fileTooLarge": "The file is larger than HealthLog accepts.",
|
||
"quotaExceeded": "Your document storage is full.",
|
||
"fileType": "HealthLog does not accept this file type.",
|
||
"uploadLimit": "The hourly upload limit is reached. Try again later.",
|
||
"uploadBusy": "Other uploads are still running. Try again in a moment.",
|
||
"moduleDisabled": "Documents are switched off in Settings.",
|
||
"generic": "Something went wrong. Try again.",
|
||
"permissionMissing": "The Papra key cannot read tags. Give it the tags:read permission."
|
||
},
|
||
"pickMore": "Pick more",
|
||
"finishedHint": "Search again or change a filter to pick more documents.",
|
||
"maxReached": "You can import up to {max} documents at a time.",
|
||
"noMatchHint": "Try part of the name, or clear the tag and dates."
|
||
},
|
||
"customize": "Customize view",
|
||
"layout": {
|
||
"viewDescription": "Preview cards with thumbnails, or a compact list.",
|
||
"arrangementHeading": "Arrangement",
|
||
"arrangementDescription": "Each month as its own block, or everything flowing across the full width.",
|
||
"stacked": "Months stacked",
|
||
"flow": "Continuous",
|
||
"saveFailed": "Couldn't save the view."
|
||
},
|
||
"deleteConfirm": {
|
||
"titleOne": "Delete this document?",
|
||
"titleMany": "Delete {count} documents?",
|
||
"body": "Deleted documents stay in Recently deleted for {days} days, then they are removed for good.",
|
||
"action": "Delete"
|
||
},
|
||
"trash": {
|
||
"title": "Recently deleted",
|
||
"subtitle": "Deleted documents stay here for {days} days, then they are removed for good.",
|
||
"back": "Documents",
|
||
"entryLabel": "Recently deleted ({count})",
|
||
"loadError": "Couldn't load Recently deleted.",
|
||
"emptyTitle": "Nothing in Recently deleted",
|
||
"emptyDescription": "Documents you delete wait here for {days} days before they are removed for good.",
|
||
"count": "Deleted documents ({count})",
|
||
"restoreAll": "Restore all",
|
||
"restore": "Restore",
|
||
"purge": "Delete now",
|
||
"deletedOn": "Deleted {date}.",
|
||
"removesIn": "Removed for good in {days} days.",
|
||
"removesSoon": "Removed for good within a day.",
|
||
"restored": "Document restored",
|
||
"openRestored": "Open",
|
||
"restoreDuplicate": "An identical document is already stored, so this copy cannot be restored.",
|
||
"restorePartial": "{failed} of {total} could not be restored",
|
||
"purged": "Document deleted for good",
|
||
"purgeFailed": "Couldn't delete the document.",
|
||
"purgeConfirmTitle": "Delete this document for good?",
|
||
"purgeConfirmBody": "It is removed now instead of at the end of the waiting period, and cannot be restored."
|
||
}
|
||
},
|
||
"selfDescription": {
|
||
"dataPosture": "HealthLog is self-hosted: your health data lives in your own instance's database. Notes and other free text, documents, questionnaire answers, AI-written text and access tokens are encrypted at rest; measurement values, lab values, medication names and mood scores are stored unencrypted and rely on the security of your server. AI features send data only to the AI provider set up for your account, and there is no third-party analytics on your health data."
|
||
},
|
||
"customMetrics": {
|
||
"sectionTitle": "Custom metrics",
|
||
"sectionSubtitle": "Measurements you define and track yourself.",
|
||
"add": "Add custom metric",
|
||
"addValue": "Add value",
|
||
"defineTitle": "Define a custom metric",
|
||
"defineDescription": "Name the measurement, set its unit, and optionally a target range.",
|
||
"editTitle": "Edit custom metric",
|
||
"edit": "Edit",
|
||
"delete": "Delete",
|
||
"deleteConfirmTitle": "Delete this custom metric?",
|
||
"deleteConfirmDescription": "The metric is removed from your list. Its logged values are kept.",
|
||
"deletedToast": "Custom metric deleted",
|
||
"deleteError": "Could not delete the custom metric",
|
||
"showAllValues": "Show all values",
|
||
"emptyDescription": "Define your own measurements to track and chart them.",
|
||
"noValuesYet": "No values yet",
|
||
"loadError": "Could not load custom metrics",
|
||
"loadMore": "Load more values",
|
||
"showingLatestOf": "Showing the latest {shown} of {total}",
|
||
"backToMeasurements": "Back to measurements",
|
||
"form": {
|
||
"name": "Name",
|
||
"namePlaceholder": "e.g. Morning grip strength",
|
||
"unit": "Unit",
|
||
"unitPlaceholder": "e.g. kg",
|
||
"decimals": "Decimal places",
|
||
"decimalsPlaceholder": "e.g. 1",
|
||
"targetLow": "Target low",
|
||
"targetLowPlaceholder": "Lower bound",
|
||
"targetHigh": "Target high",
|
||
"targetHighPlaceholder": "Upper bound",
|
||
"description": "Description",
|
||
"descriptionPlaceholder": "What this measures (optional)",
|
||
"targetHint": "The target range is optional and is drawn as a band on the chart.",
|
||
"correlationEnabled": "Use in correlation discovery",
|
||
"correlationEnabledHint": "Adds this metric as a bounded daily behaviour channel. It remains off by default.",
|
||
"requiredError": "Name and unit are required",
|
||
"rangeOrderError": "Target low must not exceed target high",
|
||
"save": "Save",
|
||
"savedToast": "Custom metric saved",
|
||
"updatedToast": "Custom metric updated",
|
||
"saveError": "Could not save the custom metric"
|
||
},
|
||
"entry": {
|
||
"value": "Value",
|
||
"measuredAt": "Date",
|
||
"note": "Note",
|
||
"addDescription": "Log a value for this metric.",
|
||
"edit": "Edit value",
|
||
"editTitle": "Edit value",
|
||
"editDescription": "Update the value, date, or note.",
|
||
"delete": "Delete value",
|
||
"deleteConfirmTitle": "Delete this value?",
|
||
"deleteConfirmDescription": "This value is removed permanently.",
|
||
"valueError": "Enter a numeric value",
|
||
"timestampError": "Enter a valid date",
|
||
"savedToast": "Value logged",
|
||
"saveError": "Could not log the value",
|
||
"editedToast": "Value updated",
|
||
"editError": "Could not update the value",
|
||
"deletedToast": "Value deleted",
|
||
"restoredToast": "Value restored",
|
||
"restoreError": "Restore failed",
|
||
"deleteError": "Could not delete the value"
|
||
},
|
||
"chart": {
|
||
"empty": "No values in this range",
|
||
"valueLabel": "Value",
|
||
"range": {
|
||
"30": "30d",
|
||
"90": "90d",
|
||
"365": "1y",
|
||
"all": "All"
|
||
}
|
||
},
|
||
"detail": {
|
||
"title": "Custom metric",
|
||
"genericDescription": "A measurement you track. Add values to follow it over time.",
|
||
"emptyTitle": "No values yet",
|
||
"emptyDescription": "Add your first value to start charting this metric.",
|
||
"valuesTitle": "{metric}: all values",
|
||
"valuesDescription": "Every logged value for this metric.",
|
||
"backToMetric": "Back to {metric}"
|
||
}
|
||
},
|
||
"nutrients": {
|
||
"names": {
|
||
"vitamin_a": "Vitamin A",
|
||
"thiamin": "Thiamin (B1)",
|
||
"riboflavin": "Riboflavin (B2)",
|
||
"niacin": "Niacin (B3)",
|
||
"pantothenic_acid": "Pantothenic acid (B5)",
|
||
"vitamin_b6": "Vitamin B6",
|
||
"biotin": "Biotin (B7)",
|
||
"folate": "Folate (B9)",
|
||
"vitamin_b12": "Vitamin B12",
|
||
"vitamin_c": "Vitamin C",
|
||
"vitamin_d": "Vitamin D",
|
||
"vitamin_e": "Vitamin E",
|
||
"vitamin_k": "Vitamin K",
|
||
"calcium": "Calcium",
|
||
"iron": "Iron",
|
||
"magnesium": "Magnesium",
|
||
"phosphorus": "Phosphorus",
|
||
"zinc": "Zinc",
|
||
"copper": "Copper",
|
||
"manganese": "Manganese",
|
||
"selenium": "Selenium",
|
||
"chromium": "Chromium",
|
||
"molybdenum": "Molybdenum",
|
||
"iodine": "Iodine",
|
||
"water": "Water",
|
||
"caffeine": "Caffeine",
|
||
"dha": "DHA (omega-3)",
|
||
"epa": "EPA (omega-3)"
|
||
},
|
||
"page": {
|
||
"title": "Nutrient intake",
|
||
"description": "Hydration and vitamin/mineral intake synced from your phone's health app, plus manual water entries.",
|
||
"moduleOffDescription": "Turn on the nutrients module to see hydration and vitamin/mineral intake here. Synced intake becomes part of the record the Coach can read.",
|
||
"moduleOffCta": "Turn on nutrients",
|
||
"emptyTitle": "No nutrient data yet",
|
||
"emptyDescription": "Data arrives from your phone's health app sync or a manual water entry.",
|
||
"loadError": "Your nutrient data could not be loaded",
|
||
"lastAttemptTitle": "A sync arrived, but nothing could be stored",
|
||
"lastAttemptAt": "Last attempt: {date}",
|
||
"lastAttemptReason": {
|
||
"unitMismatch": "The values that arrived didn't match the units this app expects for these nutrients, so they couldn't be stored.",
|
||
"valueOutOfRange": "The amounts that arrived were higher than this app can plausibly store, so they couldn't be saved.",
|
||
"dayInvalid": "The entries carried a date the server couldn't accept. This can happen when the clock or time zone on the sending side is wrong, so it's worth checking.",
|
||
"upsertFailed": "These entries reached the server, but a problem on this end kept them from being saved. There's nothing you need to do.",
|
||
"unknown": "These entries arrived but couldn't be stored."
|
||
}
|
||
},
|
||
"hydration": {
|
||
"referenceMeta": "Reference intake {value} {unit}/day (EFSA)",
|
||
"loadError": "Could not load water."
|
||
},
|
||
"caffeine": {
|
||
"ceilingMeta": "Safe-level ceiling {value} {unit}/day (EFSA)",
|
||
"loadError": "Could not load caffeine."
|
||
},
|
||
"micronutrients": {
|
||
"title": "Vitamins & minerals",
|
||
"rowMeta": "{days} of {window} days, ref {value} {unit} (EFSA)",
|
||
"rowMetaNoRef": "{days} of {window} days",
|
||
"footer": "{tracked} of {total} tracked micronutrients have data in this window.",
|
||
"emptyTitle": "No micronutrient data synced yet",
|
||
"loadError": "Your nutrient data could not be loaded",
|
||
"sourcePart": "{source} {value} {unit}",
|
||
"aboveUpperLimit": "Above the tolerable upper intake level for adults of {value} {unit} a day ({source}).",
|
||
"aboveUpperLimitSupplemental": "The supplement share is above the tolerable upper intake level for adults of {value} {unit} a day for supplements ({source}).",
|
||
"upperLimitForm": {
|
||
"retinol": "The level covers preformed vitamin A (retinol) only: if the amount comes from beta-carotene, it does not apply.",
|
||
"folic_acid": "The level covers folic acid from supplements and fortified foods, not the folate in ordinary food.",
|
||
"magnesium_salts": "The level covers readily dissociable magnesium salts in supplements, not the magnesium in food.",
|
||
"alpha_tocopherol": "The level is set for alpha-tocopherol."
|
||
}
|
||
},
|
||
"sparseNote": "A low number here usually means sparse logging, not a deficiency. Apple Health day totals reflect what your apps logged, not total dietary intake.",
|
||
"units": {
|
||
"IU": "IU"
|
||
},
|
||
"sources": {
|
||
"APPLE_HEALTH": "Synced",
|
||
"MANUAL": "Entered",
|
||
"SUPPLEMENT": "Supplements"
|
||
}
|
||
},
|
||
"daily": {
|
||
"line": {
|
||
"allClear": "Nothing needs your attention today.",
|
||
"scoreReady": "Your health score for today is ready."
|
||
},
|
||
"push": {
|
||
"title": "Your morning briefing",
|
||
"bodyProvisional": "{line}\nLast night's sleep isn't in yet.",
|
||
"titleScore": "Morning score {score}",
|
||
"band": {
|
||
"green": "Looking steady today.",
|
||
"yellow": "A few things are worth a look today.",
|
||
"red": "Some areas need attention today."
|
||
}
|
||
},
|
||
"item": {
|
||
"doseWindow": {
|
||
"title": "Medication due",
|
||
"body": "A dose is due soon.",
|
||
"bodyNamed": "{name} is due soon.",
|
||
"overdueTitle": "Medication overdue",
|
||
"overdueBody": "A dose is past due.",
|
||
"overdueBodyNamed": "{name} is past due."
|
||
},
|
||
"preventiveCare": {
|
||
"title": "Check-up due",
|
||
"body": "{label} is due.",
|
||
"bodyManyNamed": "Due: {labels}"
|
||
},
|
||
"syncIssue": {
|
||
"title": "Sync needs attention",
|
||
"body": "{integration} isn't syncing. Reconnect to keep your data current."
|
||
},
|
||
"coachCheckin": {
|
||
"title": "Time to check in on a plan",
|
||
"body": "It's been about a week since you set this plan. Keep it, adjust it, or let it go. No pressure either way.",
|
||
"bodyPlan": "About a week ago you set: “{plan}”. Keep it, adjust it, or let it go. No pressure either way.",
|
||
"adjustPrompt": "I'd like to adjust my check-in plan.",
|
||
"adjustPromptPlan": "I'd like to adjust this plan: “{plan}”"
|
||
},
|
||
"tensionWindow": {
|
||
"title": "Possible tension today",
|
||
"body": {
|
||
"morning": "Your heart rate sat above its resting baseline for a sustained stretch this morning while you were still, possibly some tension.",
|
||
"afternoon": "Your heart rate sat above its resting baseline for a sustained stretch this afternoon while you were still, possibly some tension.",
|
||
"evening": "Your heart rate sat above its resting baseline for a sustained stretch this evening while you were still, possibly some tension.",
|
||
"night": "Your heart rate sat above its resting baseline for a sustained stretch overnight while you were still, possibly some tension."
|
||
}
|
||
},
|
||
"ecgNewRecording": {
|
||
"title": "New ECG recording",
|
||
"body": "Your device recorded a new ECG. It's ready to view.",
|
||
"bodyVerdict": "Your device recorded a new ECG and reported: {verdict}.",
|
||
"verdict": {
|
||
"irregular": "a possible irregular rhythm",
|
||
"notDetected": "no irregular rhythm",
|
||
"inconclusive": "an inconclusive result"
|
||
}
|
||
},
|
||
"sameTimeBaseline": {
|
||
"title": {
|
||
"below": "Behind your usual pace",
|
||
"above": "Ahead of your usual pace"
|
||
},
|
||
"body": {
|
||
"below": "By {time} you are at {today} steps. On a usual day you are around {typical} by now.",
|
||
"above": "By {time} you are at {today} steps, ahead of the {typical} that is usual for you by now."
|
||
}
|
||
},
|
||
"upcomingVisit": {
|
||
"title": "Appointment coming up",
|
||
"bodyToday": "{what} today",
|
||
"bodyTomorrow": "{what} tomorrow",
|
||
"bodyDayAfterTomorrow": "{what} the day after tomorrow"
|
||
}
|
||
},
|
||
"action": {
|
||
"logDose": "Log dose",
|
||
"reconnect": "Reconnect",
|
||
"viewCheckups": "View check-ups",
|
||
"viewAppointment": "View appointment",
|
||
"viewAppointments": "View appointments",
|
||
"checkinKeep": "Keep it",
|
||
"checkinAdjust": "Adjust",
|
||
"checkinLetGo": "Let it go",
|
||
"viewMilestone": "View",
|
||
"viewPulse": "View pulse",
|
||
"viewEcg": "View recording",
|
||
"viewSteps": "View steps"
|
||
},
|
||
"today": {
|
||
"scoreLabel": "Health score",
|
||
"deltaVsBaseline": "{delta} vs your baseline",
|
||
"deltaFlat": "In line with your baseline",
|
||
"sleepPending": "Last night's sleep isn't in yet, so today's read is provisional.",
|
||
"worthALook": "Worth a look",
|
||
"allClear": "Nothing needs your attention today.",
|
||
"ringLink": "Open {metric} details",
|
||
"heading": "Today",
|
||
"steadyWeeksOne": "Steady for {count} week",
|
||
"steadyWeeksFew": "Steady for {count} weeks",
|
||
"steadyWeeksOther": "Steady for {count} weeks",
|
||
"valueWithUnit": "{value} {unit}",
|
||
"rangeWithUnit": "{low} to {high} {unit}",
|
||
"rangeAtThisTime": "{range} for this time of day",
|
||
"vital": {
|
||
"RESTING_HEART_RATE": "Resting heart rate",
|
||
"HEART_RATE_VARIABILITY": "Heart-rate variability",
|
||
"RESPIRATORY_RATE": "Respiratory rate",
|
||
"OXYGEN_SATURATION": "Oxygen saturation",
|
||
"BODY_TEMPERATURE": "Body temperature",
|
||
"SKIN_TEMPERATURE": "Skin temperature",
|
||
"BLOOD_PRESSURE_SYS": "Systolic blood pressure",
|
||
"BLOOD_PRESSURE_DIA": "Diastolic blood pressure",
|
||
"BLOOD_GLUCOSE": "Blood glucose",
|
||
"PULSE": "Pulse",
|
||
"WEIGHT": "Weight",
|
||
"generic": "A vital"
|
||
},
|
||
"steadyAtLeastWeeksOne": "Steady for at least {count} week",
|
||
"steadyAtLeastWeeksFew": "Steady for at least {count} weeks",
|
||
"steadyAtLeastWeeksOther": "Steady for at least {count} weeks"
|
||
},
|
||
"milestone": {
|
||
"metric": {
|
||
"restingHeartRate": "resting heart rate",
|
||
"heartRateVariability": "heart-rate variability",
|
||
"respiratoryRate": "respiratory rate",
|
||
"weight": "weight",
|
||
"generic": "this metric"
|
||
},
|
||
"record": {
|
||
"title": "A new {metric} best",
|
||
"body": "A personal best for your {metric} today. Quietly noted, nothing to do."
|
||
},
|
||
"returnToBaseline": {
|
||
"title": "Back in range: {metric}",
|
||
"body": "Your {metric} has settled back inside your usual range. Whatever that was, it has passed."
|
||
},
|
||
"sustainedInRange": {
|
||
"week1": {
|
||
"title": "A week in range",
|
||
"body": "Your {metric} has held inside your usual range for a week now. Nice and steady."
|
||
},
|
||
"week2": {
|
||
"title": "Two weeks in range",
|
||
"body": "Your {metric} has stayed in your usual range for two weeks. Calm and steady."
|
||
},
|
||
"week3": {
|
||
"title": "Three weeks in range",
|
||
"body": "Three weeks of your {metric} sitting in your usual range. A real stretch of steadiness."
|
||
},
|
||
"week4": {
|
||
"title": "A month in range",
|
||
"body": "A full month with your {metric} in your usual range. Beautifully steady."
|
||
}
|
||
}
|
||
},
|
||
"lead": {
|
||
"vitalOutside": {
|
||
"above": "{metric} is at {value}, above your usual range of {range}.",
|
||
"below": "{metric} is at {value}, below your usual range of {range}."
|
||
},
|
||
"vitalsOutside": {
|
||
"aboveOne": "{metric} is at {value}, above your usual range of {range}, and {count} more vital is outside its range too.",
|
||
"aboveFew": "{metric} is at {value}, above your usual range of {range}, and {count} more vitals are outside their range too.",
|
||
"aboveOther": "{metric} is at {value}, above your usual range of {range}, and {count} more vitals are outside their range too.",
|
||
"belowOne": "{metric} is at {value}, below your usual range of {range}, and {count} more vital is outside its range too.",
|
||
"belowFew": "{metric} is at {value}, below your usual range of {range}, and {count} more vitals are outside their range too.",
|
||
"belowOther": "{metric} is at {value}, below your usual range of {range}, and {count} more vitals are outside their range too."
|
||
},
|
||
"sleep": {
|
||
"more": "Last night you slept {duration}, {diff} more than usual.",
|
||
"less": "Last night you slept {duration}, {diff} less than usual.",
|
||
"usual": "Last night you slept {duration}, close to your usual.",
|
||
"plain": "Last night you slept {duration}."
|
||
},
|
||
"vitalsInRangeOne": "Your latest vital sits inside its usual range.",
|
||
"vitalsInRangeFew": "All {count} of your latest vitals sit inside their usual range.",
|
||
"vitalsInRangeOther": "All {count} of your latest vitals sit inside their usual range.",
|
||
"vitalInRange": "{metric} is at {value}, inside your usual range of {range}."
|
||
},
|
||
"todayFact": {
|
||
"restMode": {
|
||
"label": "Rest mode",
|
||
"value": "Day {day}"
|
||
},
|
||
"medications": {
|
||
"label": "Medications",
|
||
"value": "{taken} of {scheduled} taken"
|
||
},
|
||
"appointment": {
|
||
"label": "Appointment",
|
||
"today": "Today {time}, {what}",
|
||
"tomorrow": "Tomorrow {time}, {what}"
|
||
},
|
||
"sleep": {
|
||
"label": "Last night",
|
||
"plain": "{duration}",
|
||
"usual": "{duration}, close to your usual",
|
||
"more": "{duration}, {diff} more than usual",
|
||
"less": "{duration}, {diff} less than usual"
|
||
},
|
||
"vitals": {
|
||
"label": "Vitals",
|
||
"allInOne": "{count} checked, in your range",
|
||
"allInFew": "{count} checked, all in your range",
|
||
"allInOther": "{count} checked, all in your range",
|
||
"oneOut": {
|
||
"above": "{metric} above your range",
|
||
"below": "{metric} below your range"
|
||
},
|
||
"someOut": "{count} of {total} outside your range"
|
||
},
|
||
"cycle": {
|
||
"label": "Cycle",
|
||
"value": "{phase}, day {day}",
|
||
"dayOnly": "Day {day}"
|
||
}
|
||
}
|
||
},
|
||
"reportSelection": {
|
||
"leafAnamnesis": "Health profile",
|
||
"groupIdentity": "Personal details",
|
||
"groupVitals": "Vital signs",
|
||
"groupCardio": "Heart & circulation",
|
||
"groupBody": "Body measurements",
|
||
"groupSleepRecovery": "Sleep & recovery",
|
||
"groupActivity": "Activity",
|
||
"groupMobility": "Mobility & gait",
|
||
"groupEnvironment": "Environment",
|
||
"groupGlucose": "Blood glucose",
|
||
"groupLabs": "Lab results",
|
||
"groupMedications": "Medications",
|
||
"groupHistory": "Conditions & allergies",
|
||
"groupSensitive": "Sensitive data",
|
||
"leafPatientIdentity": "Name, date of birth, gender, height",
|
||
"leafInsurance": "Insurer and insurance number",
|
||
"leafGlucosePanel": "Glucose panel (time in range, GMI, variability)",
|
||
"leafLabResults": "Lab results",
|
||
"leafMedicationList": "Medication list",
|
||
"leafMedicationAdministrations": "Every logged dose",
|
||
"leafMedicationCompliance": "Adherence rate",
|
||
"leafGlp1Therapy": "GLP-1 therapy (dose history, side effects)",
|
||
"leafAllergies": "Allergies and intolerances",
|
||
"leafIllnessEpisodes": "Illness episodes",
|
||
"leafFamilyHistory": "Family history",
|
||
"leafMood": "Mood",
|
||
"leafCycle": "Menstrual cycle",
|
||
"templateStandard": "Standard doctor's report",
|
||
"applyStandard": "Apply {template}",
|
||
"standardHint": "One click fills in what a general visit usually needs. Every entry stays editable.",
|
||
"groupCount": "{on}/{total}",
|
||
"groupDisclosure": "Show the entries in {group}",
|
||
"sensitiveHint": "Nothing here is ever preselected. Pick each entry yourself.",
|
||
"scopeNone": "Nothing selected yet. Choose what to include, or apply the standard report.",
|
||
"scopeCount": "{count} entries from {groups} areas",
|
||
"scopeSensitive": "incl. {names}",
|
||
"leafVisits": "Visits",
|
||
"leafSurgicalHistory": "Surgical history",
|
||
"leafImmunizations": "Immunizations",
|
||
"leafEmergency": "Emergency information (blood type, contacts, directives)",
|
||
"leafMedicationEffect": "Change around each medication start (needs the medication list)",
|
||
"leafWorkouts": "Workouts (summary per sport)",
|
||
"leafHrvSdnn": "HRV (SDNN)"
|
||
},
|
||
"recordSharing": {
|
||
"banner": {
|
||
"viewing": "You are in {name}'s record",
|
||
"readOnly": "You can read it, not change it.",
|
||
"canAdd": "You can add to it, but not change or delete what is there.",
|
||
"leave": "Back to my record"
|
||
},
|
||
"switcher": {
|
||
"label": "Open a record",
|
||
"ownRecord": "My own record"
|
||
},
|
||
"switch": {
|
||
"failed": "Could not open that record. Please try again.",
|
||
"noLongerAvailable": "That record is no longer shared with you."
|
||
},
|
||
"unavailable": {
|
||
"title": "Not part of shared access",
|
||
"description": "Sharing covers the health record itself, including the health background under Anamnesis. Account settings, connected services, notifications and the AI features stay with the person who owns the account.",
|
||
"leave": "Back to my record"
|
||
},
|
||
"state": {
|
||
"active": "Active",
|
||
"pending": "Waiting for acceptance",
|
||
"expired": "Lapsed",
|
||
"revoked": "Ended"
|
||
},
|
||
"row": {
|
||
"readOnly": "Can read the record",
|
||
"canWrite": "Can read and add entries",
|
||
"canManage": "Can read the record, add to it, and change or remove what is in it",
|
||
"entireRecord": "Covers the entire record",
|
||
"sections": "Covers: {sections}",
|
||
"noSections": "Covers nothing: this access opens no part of the record",
|
||
"invited": "Invited",
|
||
"accepted": "Accepted",
|
||
"expires": "Lapses",
|
||
"lastUsed": "Last opened",
|
||
"neverUsed": "never",
|
||
"endedByYou": "You ended it",
|
||
"endedByOwner": "Withdrawn",
|
||
"handedBack": "Handed back",
|
||
"ended": "Ended"
|
||
},
|
||
"invite": {
|
||
"title": "Invite someone",
|
||
"description": "Nothing is shared until they accept.",
|
||
"needsAccount": "The person needs their own HealthLog account on this instance and will find the invitation under Settings → Shared access.",
|
||
"identifierLabel": "Username or e-mail",
|
||
"identifierPlaceholder": "The name they sign in with",
|
||
"identifierHint": "They need an account on this instance. Invitations cannot be sent to an e-mail address that has not registered.",
|
||
"accessLegend": "What they may do",
|
||
"accessReadLabel": "Can view",
|
||
"accessReadCapability": "They can read everything this record shares. They cannot add or change anything.",
|
||
"accessWriteLabel": "Can view and add",
|
||
"accessWriteCapability": "They can add to the record but cannot edit or delete anything, not even what they added.",
|
||
"accessWriteDetail": "They can add readings, lab results, a new analyte to track, an illness entry, a side effect against a drug, a new medication, and mark a dose taken or skipped. They cannot edit or delete anything, not even what they added, and they cannot defer one of your reminders. Only you can.",
|
||
"accessManageLabel": "Can manage",
|
||
"accessManageCapability": "They can add, change and remove entries, including ones you entered yourself.",
|
||
"accessManageDetail": "They can also read the insights generated from your record. They cannot change your login, your security settings, your connections, or who else has access. You can end this at any time.",
|
||
"manageStepUpNote": "Offering this only works in a browser, and asks for your second factor if you have one.",
|
||
"scopeLegend": "What they can open",
|
||
"scopeAllLabel": "Entire record",
|
||
"scopeAllCapability": "Every part of it, the way sharing has always worked.",
|
||
"scopeSomeLabel": "Only the sections you pick",
|
||
"scopeSomeCapability": "Everything you do not pick stays closed to them.",
|
||
"scopeManageNote": "Manage access always covers the entire record.",
|
||
"scopeLeakNote": "A section can mention the rest of your health in its notes and names. Sharing a section shares everything written in it.",
|
||
"scopeAggregateNote": "The dashboard overview, health score and daily digest only appear when the entire record is shared.",
|
||
"scopeDocumentsNote": "A document can contain anything. Share this only if they may read all of it.",
|
||
"scopeEmptyHint": "Pick at least one section, or go back to sharing the entire record.",
|
||
"scopeChooseHint": "Choose whether to share the entire record or only selected sections.",
|
||
"expiresLabel": "Access ends on (optional)",
|
||
"expiresHint": "Leave this empty for access that lasts until somebody ends it. A date here is checked on every request, so access stops on its own at the end of that day.",
|
||
"submit": "Send invitation",
|
||
"submitting": "Sending…",
|
||
"sent": "Invitation sent to {name}.",
|
||
"errorNoAccount": "No account on this instance carries that name.",
|
||
"errorDuplicate": "That account already has access to your record.",
|
||
"errorSelf": "That is your own account.",
|
||
"errorInvalid": "Please enter a username or e-mail address.",
|
||
"errorRateLimited": "Too many invitations. Please try again later.",
|
||
"errorFailed": "The invitation could not be sent. Please try again.",
|
||
"errorScope": "Those sections cannot be shared like that. Pick at least one section, or share the entire record.",
|
||
"errorManageBrowserOnly": "Manage access can only be offered in a browser.",
|
||
"errorStepUp": "Confirm your second factor or passkey, then try again.",
|
||
"errorOffline": "That did not reach the server. Your invitation is still here. Check your connection and try again."
|
||
},
|
||
"given": {
|
||
"title": "Who can open my record",
|
||
"description": "Ended access stays listed, so you can always see who had it and when.",
|
||
"emptyTitle": "Nobody else can open your record",
|
||
"emptyDescription": "Invite someone above if you want them to be able to read it.",
|
||
"loadError": "The list could not be loaded.",
|
||
"revoke": "End access",
|
||
"withdrawInvite": "Withdraw",
|
||
"revokeTitle": "End {name}'s access?",
|
||
"revokeBody": "They lose access immediately, including any browser they have your record open in. What they have already seen cannot be taken back. You can invite them again at any time.",
|
||
"revokeEntriesStay": "Anything they entered stays in your record, and you can remove any of it yourself.",
|
||
"revokeAttribution": "Who entered what stays visible in your activity view for {days} days.",
|
||
"revokeConfirm": "End access"
|
||
},
|
||
"received": {
|
||
"title": "Records I can open",
|
||
"description": "An invitation gives you nothing until you accept it.",
|
||
"emptyTitle": "Nobody has shared a record with you",
|
||
"emptyDescription": "When someone invites you, the invitation appears here.",
|
||
"loadError": "The list could not be loaded.",
|
||
"accept": "Accept",
|
||
"accepting": "Accepting…",
|
||
"writeConsent": "If you accept, what you add becomes part of {name}'s record. You will not be able to change or remove entries afterwards; only {name} can.",
|
||
"manageConsent": "If you accept, you can add to {name}'s record and also change or remove what is already in it, including entries {name} made themselves. Everything you do is recorded under your name in their activity view, and {name} can end your access at any time.",
|
||
"open": "Open",
|
||
"renounce": "Hand back",
|
||
"renounceTitle": "Hand {name}'s record back?",
|
||
"renounceBody": "You lose access immediately. They can invite you again at any time.",
|
||
"renounceConfirm": "Hand back",
|
||
"detail": "You can hand access back whenever you want."
|
||
},
|
||
"activity": {
|
||
"title": "When my record was opened",
|
||
"description": "Every time someone else opened your record.",
|
||
"retention": "This covers the last {days} days. Older entries are deleted.",
|
||
"emptyTitle": "Nobody has opened your record",
|
||
"emptyDescription": "Openings by anyone other than you appear here, one line per person per day.",
|
||
"loadError": "The activity could not be loaded.",
|
||
"opened": "{name} opened your record {count}×",
|
||
"acted": "{name} made a change in your record",
|
||
"deletedAccount": "A deleted account"
|
||
},
|
||
"delegate": {
|
||
"addOnlyNote": "You can add to this record. Changing or removing entries is something only {name} can do."
|
||
},
|
||
"lookingAfter": {
|
||
"kindShared": "Shared record",
|
||
"kindManaged": "Managed profile"
|
||
},
|
||
"managed": {
|
||
"title": "Records you look after",
|
||
"description": "Health records with no login of their own.",
|
||
"explainer": "A managed profile is a health record for somebody who does not sign in themselves, such as a child or a person you care for. It has no login and no e-mail address, and you become its first guardian. You can add more guardians later, and any of you can switch into the record to keep it up to date.",
|
||
"nameLabel": "Name",
|
||
"namePlaceholder": "The name you will recognise this record by",
|
||
"nameHint": "Up to 80 characters. Shown wherever this record appears.",
|
||
"nameRequired": "Give the record a name.",
|
||
"nameTooLong": "That name is longer than 80 characters.",
|
||
"dobLabel": "Date of birth (optional)",
|
||
"dobHint": "Leave it empty if you would rather not record one. Nothing is guessed from a year.",
|
||
"localeLabel": "Language of this record",
|
||
"localeHint": "The language used for text written into this record. Your own screens stay in your language.",
|
||
"genderLabel": "Gender (optional)",
|
||
"genderHint": "Decides whether cycle tracking starts on for this record. Change it any time.",
|
||
"genderNone": "Not specified",
|
||
"genderMale": "Male",
|
||
"genderFemale": "Female",
|
||
"genderOther": "Other",
|
||
"timezoneHint": "The zone this record's days are measured in.",
|
||
"timezoneInvalid": "This browser does not know that timezone.",
|
||
"create": "Create profile",
|
||
"creating": "Creating…",
|
||
"created": "{name} is set up. You can switch into that record from the account menu.",
|
||
"errorStepUp": "Confirm your second factor or passkey, then try again.",
|
||
"errorOffline": "That did not reach the server. Nothing has changed. Check your connection and try again.",
|
||
"errorInvalid": "The server refused those details. Check the name, the date and the timezone.",
|
||
"errorFailed": "The profile could not be created.",
|
||
"edit": "Edit",
|
||
"editSave": "Save changes",
|
||
"editSaving": "Saving…",
|
||
"editLoadError": "Those details could not be loaded.",
|
||
"editErrorGone": "That record is gone, or you no longer look after it.",
|
||
"editErrorFailed": "The changes could not be saved.",
|
||
"delete": "Delete profile",
|
||
"deleteTitle": "Delete {name}?",
|
||
"deleteBody": "Everything recorded for {name} goes with the profile: readings, medications, documents and notes. This cannot be undone.",
|
||
"deleteGuardiansOne": "{count} person looks after this record today and will lose it.",
|
||
"deleteGuardiansFew": "{count} people look after this record today and will lose it.",
|
||
"deleteGuardiansOther": "{count} people look after this record today and will lose it.",
|
||
"deleteFloorNote": "This is also the way out when you are the last guardian: you may end the record, but you may not leave it with nobody looking after it.",
|
||
"deleteConfirm": "Delete profile",
|
||
"guardiansTitle": "Who looks after {name}",
|
||
"guardianYou": "(you)",
|
||
"guardianSince": "Looking after this record since {date}",
|
||
"guardianPending": "Invited {date}, not accepted yet",
|
||
"guardianRemove": "End access",
|
||
"guardianRemoveTitle": "End {name}'s access?",
|
||
"guardianRemoveBody": "{name} stops being able to open {profile}. Anything they entered stays in the record.",
|
||
"guardianWithdrawBody": "The invitation to {name} is withdrawn. They never opened {profile}, so nothing changes in the record.",
|
||
"guardianRemoveConfirm": "End access",
|
||
"soleGuardian": "You are the only person looking after {name}, so there is no access here you can end. Invite somebody and wait for them to accept, hand your own access back under “Records I can open”, or delete the profile.",
|
||
"guardianInviteLabel": "Invite another guardian",
|
||
"guardianInvite": "Send invitation",
|
||
"guardianInviting": "Sending…",
|
||
"guardianInvited": "Invitation sent to {name}.",
|
||
"guardianExpiresHint": "Optional. Access ends at the end of that day in your timezone.",
|
||
"guardianPendingNote": "An invited guardian counts only once they accept. Until then you are still the last one, and handing your own access back is still refused.",
|
||
"guardianErrorDuplicate": "That account already has access to this record.",
|
||
"guardianErrorManagedInvitee": "A managed profile cannot look after another record. Invite an account that signs in.",
|
||
"guardianErrorNoAccount": "No account on this instance carries that name or e-mail.",
|
||
"guardianErrorRateLimit": "Too many invitations in the last hour. Wait a while and try again.",
|
||
"guardianErrorFailed": "The invitation could not be sent.",
|
||
"errorMfaRequired": "This needs a second factor or a passkey, and your account has neither yet. Set one up under Settings → Security, then try again.",
|
||
"rosterLoadError": "Could not load who looks after this record.",
|
||
"errorRateLimit": "Too many profiles created in the last hour. Wait a while and try again.",
|
||
"handover": {
|
||
"action": "Hand over",
|
||
"title": "Hand over to {name}",
|
||
"description": "Give {name} a sign-in of their own. Nothing is copied or moved: the record becomes their account.",
|
||
"guardiansLabel": "Access after the handover",
|
||
"guardiansHint": "Your proposal. {name} sees it and decides after signing in.",
|
||
"access": {
|
||
"end": "No access",
|
||
"read": "View only",
|
||
"manage": "Manage"
|
||
},
|
||
"expiryLabel": "Link valid for",
|
||
"expiry1": "1 day",
|
||
"expiry7": "7 days",
|
||
"expiry14": "14 days",
|
||
"minorHint": "{name} is under 16. Keeping view access is worth considering, and so is talking the step through together.",
|
||
"irreversible": "Once {name} uses the link, the handover cannot be undone. The record is theirs, and they decide who keeps access.",
|
||
"afterwards": "{name} confirms the disclaimer and any AI consent personally. Reminders for this record stop reaching you.",
|
||
"replaceNote": "Creating a new link withdraws the open one.",
|
||
"create": "Create link",
|
||
"creating": "Creating…",
|
||
"linkOnce": "This link is shown only now. Give it to {name} in person or through a channel you trust, or let them scan the code.",
|
||
"qrAlt": "QR code of the handover link for {name}",
|
||
"urlLabel": "Handover link",
|
||
"copy": "Copy",
|
||
"copied": "Link copied",
|
||
"copyError": "The link could not be copied. Select it and copy it by hand.",
|
||
"linkExpires": "Valid until {date}.",
|
||
"done": "Done",
|
||
"pending": "A handover link is open until {date}.",
|
||
"replace": "New link",
|
||
"revoke": "Withdraw link",
|
||
"revoked": "Link withdrawn",
|
||
"revokeFailed": "The link could not be withdrawn. Try again.",
|
||
"errorFailed": "The handover link could not be created.",
|
||
"errorRosterChanged": "The list of guardians changed in the meantime. Close this and open it again.",
|
||
"oidcOnly": "Handing over a profile is not available on this server.",
|
||
"loadError": "The handover status could not be loaded.",
|
||
"entryHint": "When {name} is ready to look after this record themselves.",
|
||
"methodSso": "{name} signs in through single sign-on when they use the link.",
|
||
"methodBoth": "{name} can set a password or sign in through single sign-on."
|
||
},
|
||
"deleteBodyGrace": "Everything recorded for {name} goes with the profile: readings, medications, documents and notes. The profile is locked right away and erased after {days} days. Until then, an admin of this server can undo the deletion."
|
||
},
|
||
"toast": {
|
||
"savedTo": "Saved to {name}'s record"
|
||
},
|
||
"activityVerb": {
|
||
"measurementCreate": "{name} added a reading",
|
||
"labResultCreate": "{name} added a lab result",
|
||
"allergyCreate": "{name} added an allergy",
|
||
"familyHistoryCreate": "{name} added a family history entry",
|
||
"illnessEpisodeCreate": "{name} added an illness entry",
|
||
"biomarkerCreate": "{name} added a biomarker",
|
||
"customMetricEntryCreate": "{name} logged a tracked value",
|
||
"medicationSideEffectCreate": "{name} noted a side effect",
|
||
"medicationCreate": "{name} added a medication",
|
||
"medicationIntake": "{name} marked a dose",
|
||
"medicationIntakeRefused": "{name} tried to change a dose or defer a reminder, and was refused",
|
||
"measurementUpdate": "{name} changed a reading",
|
||
"measurementDelete": "{name} removed a reading",
|
||
"measurementDeleteBulk": "{name} removed several readings at once",
|
||
"measurementRestore": "{name} restored a reading",
|
||
"measurementReminderCreate": "{name} added a measurement reminder",
|
||
"measurementReminderUpdate": "{name} changed a measurement reminder",
|
||
"measurementReminderDelete": "{name} removed a measurement reminder",
|
||
"measurementReminderComplete": "{name} completed a measurement reminder",
|
||
"measurementReminderSatisfy": "{name} cleared a measurement reminder",
|
||
"measurementReminderSkip": "{name} skipped a measurement reminder",
|
||
"measurementReminderSnooze": "{name} postponed a measurement reminder",
|
||
"labResultUpdate": "{name} changed a lab result",
|
||
"labResultDelete": "{name} removed a lab result",
|
||
"labResultRestore": "{name} restored a lab result",
|
||
"biomarkerUpdate": "{name} changed a biomarker",
|
||
"biomarkerDelete": "{name} removed a biomarker",
|
||
"allergyUpdate": "{name} changed an allergy",
|
||
"allergyDelete": "{name} removed an allergy",
|
||
"familyHistoryUpdate": "{name} changed a family history entry",
|
||
"familyHistoryDelete": "{name} removed a family history entry",
|
||
"illnessEpisodeUpdate": "{name} changed an illness entry",
|
||
"illnessEpisodeDelete": "{name} removed an illness entry",
|
||
"illnessEpisodeResolve": "{name} marked an illness as over",
|
||
"illnessEpisodeRestore": "{name} restored an illness entry",
|
||
"encounterVisitCreate": "{name} added a visit",
|
||
"encounterVisitUpdate": "{name} edited a visit",
|
||
"encounterVisitDelete": "{name} deleted a visit",
|
||
"encounterVisitRestore": "{name} restored a visit",
|
||
"vaccinationRecordCreate": "{name} added a vaccination",
|
||
"vaccinationRecordUpdate": "{name} edited a vaccination",
|
||
"vaccinationRecordDelete": "{name} deleted a vaccination",
|
||
"vaccinationRecordRestore": "{name} restored a vaccination",
|
||
"practitionerContactCreate": "{name} added a practice to the address book",
|
||
"practitionerContactUpdate": "{name} edited an address book entry",
|
||
"practitionerContactDelete": "{name} deleted an address book entry",
|
||
"practitionerContactRestore": "{name} restored an address book entry",
|
||
"illnessDayLogUpsert": "{name} recorded an illness day",
|
||
"medicationUpdate": "{name} changed a medication",
|
||
"medicationCourseEnd": "{name} ended a medication course",
|
||
"medicationDelete": "{name} removed a medication",
|
||
"medicationGlp1Update": "{name} changed a GLP-1 course",
|
||
"medicationScheduleCreate": "{name} added a dosing schedule",
|
||
"medicationScheduleUpdate": "{name} changed a dosing schedule",
|
||
"medicationScheduleDelete": "{name} removed a dosing schedule",
|
||
"medicationInventoryCreate": "{name} added a medication package",
|
||
"medicationInventoryUpdate": "{name} changed a medication package",
|
||
"medicationInventoryDelete": "{name} removed a medication package",
|
||
"medicationSideEffectDelete": "{name} removed a side effect",
|
||
"medicationIntakeUpdate": "{name} changed a dose",
|
||
"medicationIntakeDelete": "{name} removed a dose",
|
||
"medicationIntakeBulkDelete": "{name} removed several doses at once",
|
||
"medicationIntakePurge": "{name} deleted the whole dose history of a medication",
|
||
"medicationIntakeImport": "{name} started a dose import for one medication",
|
||
"medicationIntakeHistoryImport": "{name} started a dose history import",
|
||
"moodEntryCreate": "{name} added a mood entry",
|
||
"moodEntryUpdate": "{name} changed a mood entry",
|
||
"moodEntryDelete": "{name} removed a mood entry",
|
||
"moodDeleteBulk": "{name} removed several mood entries at once",
|
||
"moodRestore": "{name} restored a mood entry",
|
||
"mentalHealthCreate": "{name} recorded a questionnaire result",
|
||
"cycleDelete": "{name} removed a cycle",
|
||
"cycleDayLogUpsert": "{name} recorded a cycle day",
|
||
"cycleDayLogUpdate": "{name} changed a cycle day",
|
||
"cycleDayLogDelete": "{name} removed a cycle day",
|
||
"cyclePeriodBoundary": "{name} changed the start or end of a period",
|
||
"cycleSymptomCreate": "{name} added a cycle symptom",
|
||
"nutrientWaterWrite": "{name} recorded water intake",
|
||
"healthRecordExport": "{name} exported the record",
|
||
"rejectedMeasurementQuery": "{name} sent a reading search this record could not read",
|
||
"rejectedDoseQuery": "{name} sent a dose search this record could not read",
|
||
"rejectedMoodQuery": "{name} sent a mood search this record could not read",
|
||
"rejectedMeasurementCreate": "{name} tried to add a reading and was refused",
|
||
"rejectedMeasurementBatch": "{name} tried to add several readings and was refused",
|
||
"rejectedMeasurementUpdate": "{name} tried to change a reading and was refused",
|
||
"rejectedLabCreate": "{name} tried to add a lab result and was refused",
|
||
"rejectedLabUpdate": "{name} tried to change a lab result and was refused",
|
||
"rejectedBiomarkerCreate": "{name} tried to add a biomarker and was refused",
|
||
"rejectedBiomarkerUpdate": "{name} tried to change a biomarker and was refused",
|
||
"rejectedReminderCreate": "{name} tried to add a measurement reminder and was refused",
|
||
"rejectedReminderUpdate": "{name} tried to change a measurement reminder and was refused",
|
||
"rejectedMoodCreate": "{name} tried to add a mood entry and was refused",
|
||
"rejectedMoodUpdate": "{name} tried to change a mood entry and was refused",
|
||
"rejectedDoseCreate": "{name} tried to record a dose and was refused",
|
||
"rejectedDoseUpdate": "{name} tried to change a dose and was refused",
|
||
"rejectedDoseImport": "{name} tried to import doses and was refused",
|
||
"rejectedTrackedValue": "{name} tried to log a tracked value and was refused",
|
||
"rejectedTrackedValueTypeCreate": "{name} tried to add a tracked value type and was refused",
|
||
"rejectedTrackedValueTypeUpdate": "{name} tried to change a tracked value type and was refused",
|
||
"rejectedMedicationLayout": "{name} tried to rearrange the medication list and was refused",
|
||
"deniedDoseImport": "A dose import {name} started could not be queued",
|
||
"anamnesisFactCreate": "{name} added a health background fact",
|
||
"customMetricCreate": "{name} added a tracked value type",
|
||
"customMetricUpdate": "{name} changed a tracked value type",
|
||
"customMetricDelete": "{name} removed a tracked value type",
|
||
"documentStore": "{name} added a document",
|
||
"documentUpdate": "{name} changed a document",
|
||
"documentDiscard": "{name} discarded a document",
|
||
"medicationIntakeImportFinished": "The dose import {name} started has finished",
|
||
"medicationOneShotReconciled": "A one-off medication was opened or closed after a dose {name} recorded",
|
||
"vaccinationBoosterPlanned": "{name} planned a booster",
|
||
"medicationCategoryCreate": "{name} added a medication category",
|
||
"symptomEventCreate": "{name} logged a symptom",
|
||
"symptomEventUpdate": "{name} edited a symptom entry",
|
||
"symptomEventDelete": "{name} deleted a symptom entry",
|
||
"symptomDefinitionCreate": "{name} added a symptom",
|
||
"symptomDefinitionUpdate": "{name} changed a symptom",
|
||
"symptomDefinitionDelete": "{name} removed a symptom",
|
||
"customVaccineCreate": "{name} added an own vaccine",
|
||
"customVaccineUpdate": "{name} edited an own vaccine",
|
||
"customVaccineDelete": "{name} removed an own vaccine",
|
||
"lifeEventCreate": "{name} added a life event",
|
||
"lifeEventUpdate": "{name} changed a life event",
|
||
"lifeEventDelete": "{name} removed a life event",
|
||
"biomarkerMerge": "{name} merged biomarkers",
|
||
"medicationIngredientsUpdate": "{name} changed what a supplement contains",
|
||
"auditCCreate": "{name} answered the AUDIT-C questions",
|
||
"auditCDelete": "{name} removed an AUDIT-C entry"
|
||
},
|
||
"section": {
|
||
"measurements": {
|
||
"label": "Readings",
|
||
"detail": "Weight, blood pressure, pulse, glucose, sleep, workouts and the values you track."
|
||
},
|
||
"medications": {
|
||
"label": "Medications",
|
||
"detail": "The medication list, its schedules, the doses taken, side effects and stock."
|
||
},
|
||
"labs": {
|
||
"label": "Lab results",
|
||
"detail": "Lab results and the list of analytes behind them."
|
||
},
|
||
"profile": {
|
||
"label": "Health background",
|
||
"detail": "Allergies, family history, the facts in your health profile, your visits and practices, and your vaccination record."
|
||
},
|
||
"illness": {
|
||
"label": "Illness",
|
||
"detail": "Illness episodes and the day logs kept under them."
|
||
},
|
||
"mind": {
|
||
"label": "Mood and mind",
|
||
"detail": "Mood entries and the history of the mental-health questionnaires. A completed questionnaire also files its total score as a reading."
|
||
},
|
||
"cycle": {
|
||
"label": "Cycle",
|
||
"detail": "Cycle tracking."
|
||
},
|
||
"documents": {
|
||
"label": "Documents",
|
||
"detail": "Everything stored in the document vault."
|
||
}
|
||
},
|
||
"actionError": {
|
||
"retry": "Try again",
|
||
"offline": "That did not reach the server. Nothing has changed. Check your connection and try again.",
|
||
"rateLimited": "Too many attempts in a row. Wait a minute and try again.",
|
||
"acceptExpired": "That invitation has lapsed. Ask for a new one.",
|
||
"acceptWithdrawn": "That invitation was withdrawn.",
|
||
"acceptNotPending": "That invitation has already been accepted.",
|
||
"acceptNotFound": "That invitation is no longer there.",
|
||
"acceptFailed": "The invitation could not be accepted.",
|
||
"lastGuardian": "This is the only person looking after that profile, so this access cannot end yet. Add another guardian first, or delete the profile.",
|
||
"alreadyEnded": "That access has already ended.",
|
||
"notFound": "That access is no longer there.",
|
||
"revokeFailed": "The access could not be ended.",
|
||
"renounceFailed": "The access could not be handed back.",
|
||
"profileNotFound": "That profile is not there any more. It may already have been deleted, or your access to it may have ended.",
|
||
"deleteProfileFailed": "The profile could not be deleted.",
|
||
"removeGuardianFailed": "That access could not be ended."
|
||
},
|
||
"anamnesis": {
|
||
"relativeNote": "A family history entry describes this person's relatives. Add it only when they would want it recorded here."
|
||
},
|
||
"handoverDecision": {
|
||
"title": "Who keeps access to your record",
|
||
"description": "Decide what the people who looked after your record may do from now on.",
|
||
"proposed": "Proposed: {access}",
|
||
"settled": "Already changed under Shared access",
|
||
"empty": "Nobody else had access to your record.",
|
||
"later": "You can change this any time under Settings, Shared access.",
|
||
"save": "Confirm",
|
||
"saving": "Saving…",
|
||
"decideLater": "Later",
|
||
"errorFailed": "Your decision could not be saved. Try again.",
|
||
"loadError": "Your former guardians could not be loaded.",
|
||
"notificationsTitle": "Set up your own reminders",
|
||
"notificationsBody": "Reminders for this record used to reach the people looking after it. From now on they reach you, as soon as you add a notification channel.",
|
||
"notificationsAction": "Open notification settings"
|
||
}
|
||
},
|
||
"encounters": {
|
||
"kind": {
|
||
"routine": "Routine visit",
|
||
"acute": "Acute visit",
|
||
"specialist": "Specialist visit",
|
||
"preventive": "Preventive check",
|
||
"emergency": "Emergency",
|
||
"hospital": "Hospital",
|
||
"therapy": "Therapy session",
|
||
"other": "Appointment",
|
||
"procedure": "Procedure or surgery"
|
||
},
|
||
"laterality": {
|
||
"left": "Left",
|
||
"right": "Right",
|
||
"both": "Both sides",
|
||
"none": "Not stated"
|
||
},
|
||
"bodySiteWithSide": "{site} ({side})",
|
||
"sectionTitle": "Visits",
|
||
"sectionDescription": "Doctor's visits and booked appointments in one place.",
|
||
"add": "Visit",
|
||
"loadError": "Visits could not be loaded.",
|
||
"emptyTitle": "No visit recorded yet",
|
||
"emptyDescription": "A date is enough. Everything else is optional.",
|
||
"upcomingHeading": "Upcoming",
|
||
"pastHeading": "Past",
|
||
"createTitle": "Record a visit",
|
||
"editTitle": "Edit visit",
|
||
"formDescription": "Only the date is required.",
|
||
"created": "Visit saved",
|
||
"updated": "Visit updated",
|
||
"saveFailed": "The visit could not be saved.",
|
||
"checkupNotClosed": "Visit saved. The checkup stays open; your access does not cover that.",
|
||
"status": {
|
||
"planned": "Planned",
|
||
"done": "Attended",
|
||
"cancelled": "Cancelled",
|
||
"noShow": "Missed"
|
||
},
|
||
"card": {
|
||
"documentCount": "linked documents",
|
||
"labCount": "linked lab results",
|
||
"conditionCount": "linked conditions"
|
||
},
|
||
"form": {
|
||
"date": "Date and time",
|
||
"dateDerivesStatusHint": "A date in the future is a booked appointment.",
|
||
"status": "Status",
|
||
"practitioner": "Practice or doctor",
|
||
"practitionerHint": "Optional: you can add the name later.",
|
||
"practitionerNone": "Not specified",
|
||
"practitionerSearch": "Search name or practice",
|
||
"practitionerNoMatch": "No entry found.",
|
||
"practitionerAdd": "Add new",
|
||
"practitionerClear": "Clear selection",
|
||
"kind": "Kind",
|
||
"reason": "Reason",
|
||
"outcome": "Outcome",
|
||
"outcomeReveal": "Add an outcome",
|
||
"bodySite": "Body site",
|
||
"bodySiteHint": "For example knee or gallbladder.",
|
||
"laterality": "Side",
|
||
"linkDocuments": "Documents",
|
||
"linkLabResults": "Lab results",
|
||
"linkConditions": "Conditions",
|
||
"linkNothingToOffer": "Nothing here to link yet."
|
||
},
|
||
"deleteTitle": "Delete this visit?",
|
||
"deleteDescription": "The entry is removed. If the visit is booked, its reminder stops with it.",
|
||
"deleteFailed": "The visit could not be deleted.",
|
||
"suggestion": {
|
||
"single": "Does this belong to this visit?",
|
||
"choose": "Which visit does this belong to?"
|
||
},
|
||
"episodeCard": {
|
||
"title": "Visits about this",
|
||
"emptyLine": "No visit linked to this condition yet.",
|
||
"add": "Add a visit"
|
||
},
|
||
"dashboard": {
|
||
"nextVisit": "Next appointment: {what} on {when}"
|
||
},
|
||
"procedures": {
|
||
"title": "Procedures and surgeries",
|
||
"description": "Every procedure and surgery you have had, newest first.",
|
||
"add": "Procedure",
|
||
"searchLabel": "Filter by body site",
|
||
"searchPlaceholder": "For example knee",
|
||
"sitesLabel": "Body sites",
|
||
"allSites": "All",
|
||
"count": "{shown} of {total}",
|
||
"emptyTitle": "No procedure recorded yet",
|
||
"emptyDescription": "Record a visit of the kind Procedure or surgery, or switch an existing visit to it.",
|
||
"noMatchTitle": "Nothing matches this filter",
|
||
"clearFilter": "Clear filter",
|
||
"loadError": "Procedures could not be loaded."
|
||
},
|
||
"preparation": {
|
||
"practitioner": "Since your last visit with {name} on {date}",
|
||
"specialty": "Since your last {specialty} visit on {date}",
|
||
"kind": "Since your last visit of the same kind ({kind}) on {date}",
|
||
"default": "The last {days} days",
|
||
"defaultReason": "No earlier visit with the same practice, specialty or kind."
|
||
}
|
||
},
|
||
"checkups": {
|
||
"viewSwitchLabel": "Show checkups, visits, procedures or body sites",
|
||
"tabVorsorge": "Checkups",
|
||
"tabVisits": "Visits",
|
||
"tabProcedures": "Procedures",
|
||
"tabBodySites": "Body sites"
|
||
},
|
||
"practitioners": {
|
||
"title": "Practices and doctors",
|
||
"description": "Your own address book: type a practice once, pick it everywhere.",
|
||
"linkLabel": "Address book",
|
||
"searchPlaceholder": "Search name, practice or specialty",
|
||
"loadError": "The address book could not be loaded.",
|
||
"emptyTitle": "No entry yet",
|
||
"emptyDescription": "Add a practice so you can pick it when you record a visit.",
|
||
"noMatchTitle": "No match",
|
||
"noMatchDescription": "No entry matches this search.",
|
||
"createTitle": "Add an entry",
|
||
"editTitle": "Edit entry",
|
||
"formDescription": "Only the name is required.",
|
||
"name": "Name",
|
||
"specialty": "Specialty",
|
||
"practice": "Practice",
|
||
"location": "Address",
|
||
"phone": "Phone",
|
||
"note": "Note",
|
||
"noteHint": "Stored encrypted.",
|
||
"saveFailed": "The entry could not be saved.",
|
||
"deleteTitle": "Delete this entry?",
|
||
"deleteDescription": "Your existing visits stay, and they keep this name.",
|
||
"deleteFailed": "The entry could not be deleted.",
|
||
"noSpecialtyGroup": "No specialty"
|
||
},
|
||
"links": {
|
||
"picker": {
|
||
"add": "Add",
|
||
"done": "Done",
|
||
"selectAll": "Select all",
|
||
"searchPlaceholder": "Search",
|
||
"searchNoMatch": "No match",
|
||
"suggested": "Around this date",
|
||
"loadError": "The list could not be loaded.",
|
||
"removeNamed": "Remove {name}",
|
||
"removed": "Unlinked {name}",
|
||
"linked": "Linked",
|
||
"loadNewer": "Load newer",
|
||
"loadOlder": "Load older",
|
||
"period": {
|
||
"showing": "Showing {period}"
|
||
}
|
||
},
|
||
"related": {
|
||
"title": "Related",
|
||
"kind": {
|
||
"labResult": "Lab result",
|
||
"encounter": "Visit",
|
||
"document": "Document",
|
||
"conditionEpisode": "Condition",
|
||
"medication": "Medication",
|
||
"vaccination": "Vaccination"
|
||
},
|
||
"via": {
|
||
"encounter": "through a visit",
|
||
"efficacyTarget": "through the efficacy target"
|
||
},
|
||
"pick": {
|
||
"conditionEpisode": "Conditions",
|
||
"document": "Documents",
|
||
"encounter": "Visits",
|
||
"medication": "Medications",
|
||
"vaccination": "Vaccinations"
|
||
},
|
||
"nothingToOffer": "Nothing to link yet.",
|
||
"saveError": "The link could not be saved."
|
||
}
|
||
},
|
||
"bodySites": {
|
||
"title": "Body sites",
|
||
"description": "Procedures and conditions by where on the body they are.",
|
||
"loadError": "Body sites could not be loaded.",
|
||
"emptyTitle": "No body site recorded yet",
|
||
"emptyDescription": "Add a body site to a procedure or a condition and it appears here.",
|
||
"sitesLabel": "Body sites",
|
||
"sidesLabel": "Side",
|
||
"allSides": "All sides",
|
||
"pickPrompt": "Pick a site to see what is filed there.",
|
||
"noMatchTitle": "Nothing recorded on this side",
|
||
"visitsTitle": "Procedures and visits",
|
||
"conditionsTitle": "Conditions",
|
||
"hiddenDocument": "A document not shared with you",
|
||
"hiddenLabResult": "A lab result not shared with you",
|
||
"hiddenCondition": "A condition not shared with you",
|
||
"hiddenVisit": "A visit not shared with you",
|
||
"linkedLabel": "Linked records",
|
||
"conditionSince": "Since {onset}",
|
||
"conditionDates": "{onset} to {resolved}"
|
||
},
|
||
"aiRuns": {
|
||
"backgroundDocument": "Reading in the background. You can leave this page; the result is saved with the document.",
|
||
"backgroundScan": "Reading in the background. With a slow model this can take a few minutes.",
|
||
"waitingForWorker": "Waiting for the background worker. If this does not change, the server's worker may not be running.",
|
||
"errorWorkerUnavailable": "The background worker is not available right now. Try again in a moment, or ask the server operator to check it.",
|
||
"errorTimedOut": "Reading took longer than your AI response time allows. Try again, or raise the response time in the AI settings.",
|
||
"errorReaderBusy": "The document reader is busy with other work. Try again in a minute."
|
||
},
|
||
"symptoms": {
|
||
"add": "New symptom",
|
||
"nameLabel": "Name",
|
||
"namePlaceholder": "e.g. Aura",
|
||
"iconLabel": "Icon",
|
||
"icons": {
|
||
"Tag": "Tag",
|
||
"Activity": "Activity",
|
||
"Heart": "Heart",
|
||
"HeartPulse": "Heartbeat",
|
||
"Brain": "Brain",
|
||
"Zap": "Lightning",
|
||
"Flame": "Flame",
|
||
"Snowflake": "Snowflake",
|
||
"Droplet": "Drop",
|
||
"CircleDot": "Dot",
|
||
"BatteryLow": "Low battery",
|
||
"MoonStar": "Moon and star",
|
||
"PersonStanding": "Person",
|
||
"Drama": "Masks",
|
||
"Frown": "Frowning face",
|
||
"Cookie": "Cookie",
|
||
"Soup": "Soup",
|
||
"Pill": "Pill",
|
||
"Thermometer": "Thermometer",
|
||
"Stethoscope": "Stethoscope"
|
||
},
|
||
"limitReached": "You have 8 symptoms. Hide one to add another.",
|
||
"saveError": "Couldn't save the symptom. Please try again.",
|
||
"nameRequired": "Give the symptom a name.",
|
||
"unreadableLabel": "Unreadable symptom",
|
||
"intensityPill": "{value}/10",
|
||
"entry": {
|
||
"sheetDescription": "One of your own symptoms, how strong and when.",
|
||
"symptom": "Symptom",
|
||
"symptomRequired": "Choose a symptom.",
|
||
"intensity": "Intensity",
|
||
"intensityRequired": "Set how strong it was.",
|
||
"intensityUnset": "Not set",
|
||
"anchorLow": "None",
|
||
"anchorHigh": "Worst imaginable",
|
||
"intensityValueText": "{value} of {max} ({low} to {high})",
|
||
"when": "When",
|
||
"during": "During an illness",
|
||
"duringNone": "Not linked",
|
||
"note": "Note",
|
||
"notePlaceholder": "What else was going on?",
|
||
"reset": "Reset form",
|
||
"emptyHint": "Add your first symptom, for example aura or headache.",
|
||
"emptyHintNoManage": "No symptoms have been set up for this record yet.",
|
||
"limitHint": "Up to {limit} symptoms. Hide one on the illness page to add another."
|
||
},
|
||
"section": {
|
||
"title": "Your symptoms",
|
||
"log": "Log",
|
||
"loadError": "Couldn't load your symptoms.",
|
||
"summaryOne": "Once in 30 days, {max}/10, last {date}",
|
||
"summaryFew": "{count} times in 30 days, up to {max}/10, last {date}",
|
||
"summaryOther": "{count} times in 30 days, up to {max}/10, last {date}",
|
||
"summaryNoneRecent": "Not in the last 30 days, last {date}",
|
||
"summaryNever": "Not logged yet",
|
||
"menuLabel": "Options for {symptom}",
|
||
"eventMenuLabel": "Options for this {symptom} entry",
|
||
"hide": "Hide",
|
||
"show": "Show again",
|
||
"deleteTitle": "Delete symptom?",
|
||
"deleteBody": "\"{symptom}\" and every entry of it will be deleted. To keep the history, hide it instead.",
|
||
"deleteEventTitle": "Delete entry?",
|
||
"deleteEventBody": "This entry will be deleted.",
|
||
"hiddenOne": "Hidden (1)",
|
||
"hiddenFew": "Hidden ({count})",
|
||
"hiddenOther": "Hidden ({count})",
|
||
"recent": "Last 30 days",
|
||
"recentEmpty": "Nothing logged in the last 30 days.",
|
||
"editEventTitle": "Edit {symptom}",
|
||
"editSymptomTitle": "Edit symptom"
|
||
},
|
||
"episode": {
|
||
"title": "Symptoms logged",
|
||
"during": "during {illness}"
|
||
}
|
||
},
|
||
"day": {
|
||
"scoreOfMax": "of {max}",
|
||
"cycleDay": "Cycle day {n}",
|
||
"cyclePhaseLine": {
|
||
"MENSTRUAL": "Cycle day {n}, menstrual phase",
|
||
"FOLLICULAR": "Cycle day {n}, follicular phase",
|
||
"OVULATORY": "Cycle day {n}, ovulatory phase",
|
||
"LUTEAL": "Cycle day {n}, luteal phase"
|
||
},
|
||
"previousDay": "Previous day",
|
||
"nextDay": "Next day",
|
||
"close": "Close day",
|
||
"hidePanel": "Hide day",
|
||
"showPanel": "Show {date}",
|
||
"openDay": "Open day",
|
||
"viewWholeDay": "View the whole day",
|
||
"captureForDay": "Add for this day",
|
||
"empty": "There are no entries for this day.",
|
||
"notShared": "Some areas are not shared with you.",
|
||
"inTimeline": "In the timeline",
|
||
"askCoach": "Ask the Coach about this day",
|
||
"loadFailed": "This day could not be loaded.",
|
||
"dayOf": "Day {n} of {m}",
|
||
"dayN": "Day {n}",
|
||
"usualRange": "Usually {lo} to {hi}",
|
||
"groups": {
|
||
"scores": "Scores",
|
||
"running": "Running that day",
|
||
"values": "Values",
|
||
"happened": "What happened",
|
||
"movement": "On the move"
|
||
},
|
||
"notable": {
|
||
"extremeHigh": "Highest daily value since {since}",
|
||
"extremeLow": "Lowest daily value since {since}",
|
||
"firstValue": "First reading of this kind",
|
||
"gap": "No reading for {days} days"
|
||
},
|
||
"previousDayShortcut": "Previous day (Alt + Left arrow)",
|
||
"nextDayShortcut": "Next day (Alt + Right arrow)",
|
||
"captureShort": "Log",
|
||
"inTimelineShort": "Timeline",
|
||
"askCoachPrompt": "What happened on {date}?",
|
||
"coachChips": "Days in this answer",
|
||
"description": "Everything your records hold for this day.",
|
||
"openDocument": "Open document",
|
||
"previousReading": "Before, {date}",
|
||
"sheetExpand": "Expand to full height",
|
||
"sheetShrink": "Shrink",
|
||
"valuesLegend": "Dot for this day, bar for the 30 days before",
|
||
"valuesAllOne": "All values",
|
||
"valuesAllFew": "All {count} values",
|
||
"valuesAllOther": "All {count} values",
|
||
"valuesFewer": "Fewer values",
|
||
"countEntriesOne": "1 entry",
|
||
"countEntriesFew": "{count} entries",
|
||
"countEntriesOther": "{count} entries",
|
||
"meanOfReadingsOne": "Average of 1 reading",
|
||
"meanOfReadingsFew": "Average of {count} readings",
|
||
"meanOfReadingsOther": "Average of {count} readings",
|
||
"sinceLastVisit": {
|
||
"countOne": "1 entry",
|
||
"countFew": "{count} entries",
|
||
"countOther": "{count} entries",
|
||
"allOne": "Show all",
|
||
"allFew": "Show all {count}",
|
||
"allOther": "Show all {count}",
|
||
"fewer": "Show fewer",
|
||
"note": "Compiled from your entries, without judgement. Every date opens the whole day.",
|
||
"report": "Doctor report from {date} to today",
|
||
"loadError": "Could not load what happened since the last visit."
|
||
},
|
||
"travel": "Away",
|
||
"event": {
|
||
"started": "{label} started",
|
||
"ended": "{label} ended",
|
||
"paused": "{label} paused",
|
||
"resumed": "{label} resumed",
|
||
"illnessBegan": "{label} began",
|
||
"illnessResolved": "{label} resolved"
|
||
},
|
||
"pickDate": "Choose a date",
|
||
"pickerTitle": "Go to a day",
|
||
"today": "Today",
|
||
"hasEntries": "has entries",
|
||
"dayNSince": "Day {n}, since {date}",
|
||
"sinceDate": "Since {date}",
|
||
"movement": {
|
||
"total": "Distance",
|
||
"driving": "By car",
|
||
"train": "By train",
|
||
"places": "Places visited",
|
||
"away": "Away from home",
|
||
"travel": "Travel day",
|
||
"travelYes": "Yes",
|
||
"kilometres": "{value} km",
|
||
"miles": "{value} mi"
|
||
}
|
||
},
|
||
"timeline": {
|
||
"title": "Timeline",
|
||
"subtitle": "What happened when, beside your values.",
|
||
"standing": "Ongoing",
|
||
"startUnknown": "start unknown",
|
||
"zoom": {
|
||
"all": "All",
|
||
"year": "12 months",
|
||
"quarter": "3 months",
|
||
"range": "Range"
|
||
},
|
||
"lanes": {
|
||
"life": "Life",
|
||
"illness": "Conditions",
|
||
"allergies": "Allergies",
|
||
"medications": "Medications",
|
||
"vaccinations": "Vaccinations",
|
||
"visits": "Doctor and procedures",
|
||
"labs": "Labs",
|
||
"documents": "Documents",
|
||
"cycle": "Cycle"
|
||
},
|
||
"readiness": {
|
||
"title": "What your timeline already carries",
|
||
"subtitle": "An honest inventory before you open it.",
|
||
"menuEntry": "Data coverage",
|
||
"hint": "Empty lanes stay hidden until something is there. Modules you switched off never appear. You find this overview later under Data coverage in the timeline.",
|
||
"later": "Later",
|
||
"open": "Open timeline",
|
||
"verdict": {
|
||
"carries": "It carries already.",
|
||
"thin": "Still thin. For now the timeline shows mostly your values."
|
||
},
|
||
"status": {
|
||
"carries": "carries",
|
||
"thin": "thin",
|
||
"empty": "empty"
|
||
},
|
||
"lanes": {
|
||
"values": "Values",
|
||
"mood": "Mood",
|
||
"environment": "Environment",
|
||
"life": "Life events"
|
||
},
|
||
"meter": "{carrying} of {total} lanes carry",
|
||
"carriesDetail": "{carrying} of {total} lanes give an overview from {since}.",
|
||
"loadFailed": "The inventory could not be loaded.",
|
||
"card": {
|
||
"title": "What the timeline already carries",
|
||
"summary": "It reaches back to {since}; {carrying} of {total} lanes already carry.",
|
||
"dismiss": "Hide"
|
||
},
|
||
"detail": {
|
||
"valuesOne": "{count} measure since {since}",
|
||
"valuesFew": "{count} measures since {since}",
|
||
"valuesOther": "{count} measures since {since}",
|
||
"illnessOne": "{count} episode, {chronic} of them chronic",
|
||
"illnessFew": "{count} episodes, {chronic} of them chronic",
|
||
"illnessOther": "{count} episodes, {chronic} of them chronic",
|
||
"allergiesOne": "{count} allergy",
|
||
"allergiesFew": "{count} allergies",
|
||
"allergiesOther": "{count} allergies",
|
||
"medicationsOne": "{count} medication, {missingStart} without a start date",
|
||
"medicationsFew": "{count} medications, {missingStart} without a start date",
|
||
"medicationsOther": "{count} medications, {missingStart} without a start date",
|
||
"medicationsDatedOne": "{count} medication with a start date",
|
||
"medicationsDatedFew": "{count} medications with a start date",
|
||
"medicationsDatedOther": "{count} medications with a start date",
|
||
"vaccinationsOne": "{count} vaccination",
|
||
"vaccinationsFew": "{count} vaccinations",
|
||
"vaccinationsOther": "{count} vaccinations",
|
||
"visitsOne": "{count} visit, {procedures} with a procedure",
|
||
"visitsFew": "{count} visits, {procedures} with a procedure",
|
||
"visitsOther": "{count} visits, {procedures} with a procedure",
|
||
"visitsPlannedOne": "{count} visit, planned only",
|
||
"visitsPlannedFew": "{count} visits, planned only",
|
||
"visitsPlannedOther": "{count} visits, planned only",
|
||
"labsOne": "{count} day with results",
|
||
"labsFew": "{count} days with results",
|
||
"labsOther": "{count} days with results",
|
||
"documentsOne": "{count} dated document",
|
||
"documentsFew": "{count} dated documents",
|
||
"documentsOther": "{count} dated documents",
|
||
"lifeOne": "{count} life event",
|
||
"lifeFew": "{count} life events",
|
||
"lifeOther": "{count} life events",
|
||
"cycleOne": "{count} cycle",
|
||
"cycleFew": "{count} cycles",
|
||
"cycleOther": "{count} cycles",
|
||
"moodOne": "{count} entry since {since}",
|
||
"moodFew": "{count} entries since {since}",
|
||
"moodOther": "{count} entries since {since}",
|
||
"environmentOne": "{count} day with environment data",
|
||
"environmentFew": "{count} days with environment data",
|
||
"environmentOther": "{count} days with environment data",
|
||
"empty": "None yet"
|
||
},
|
||
"gap": {
|
||
"valuesEmpty": "Connect sources",
|
||
"illnessEmpty": "Add an episode",
|
||
"medicationsWithoutStart": "Complete",
|
||
"visitsEmpty": "Add a visit",
|
||
"documentsUndated": "Review",
|
||
"labsEmpty": "Add a result",
|
||
"vaccinationsEmpty": "Add vaccinations",
|
||
"lifeEventsEmpty": "Add"
|
||
},
|
||
"gapLine": {
|
||
"medicationsWithoutStartOne": "{count} medication without a start date",
|
||
"medicationsWithoutStartFew": "{count} medications without a start date",
|
||
"medicationsWithoutStartOther": "{count} medications without a start date",
|
||
"documentsUndatedOne": "{count} document without a date",
|
||
"documentsUndatedFew": "{count} documents without a date",
|
||
"documentsUndatedOther": "{count} documents without a date",
|
||
"valuesEmpty": "No values over a longer period yet",
|
||
"illnessEmpty": "No conditions with a start date yet",
|
||
"visitsEmpty": "No completed doctor visits yet",
|
||
"labsEmpty": "No lab results yet",
|
||
"vaccinationsEmpty": "No vaccinations yet",
|
||
"lifeEventsEmpty": "No life events yet"
|
||
}
|
||
},
|
||
"legendSpan": "Period",
|
||
"legendEvent": "Event",
|
||
"legendMeanQuarter": "Quarterly mean",
|
||
"legendMeanMonth": "Monthly mean",
|
||
"legendMeanWeek": "Weekly mean",
|
||
"legendThin": "Fewer than 3 readings",
|
||
"legendGap": "Short gap without measurements",
|
||
"today": "Today",
|
||
"noDataYet": "No data yet",
|
||
"layers": "Layers",
|
||
"layersLanes": "Lanes",
|
||
"zoomLabel": "View range",
|
||
"chartLabel": "Timeline from {from} to {to}",
|
||
"keyboardHint": "Arrow keys move the selection, Home and End jump to either end, Enter opens the day.",
|
||
"loadFailed": "The timeline could not be loaded.",
|
||
"empty": {
|
||
"title": "Nothing on the timeline yet",
|
||
"description": "Dated entries appear here as soon as there are some."
|
||
},
|
||
"values": {
|
||
"menuTitle": "Values under the lanes",
|
||
"trigger": "Values ({count})",
|
||
"noneInWindow": "No values in this range",
|
||
"series": {
|
||
"BLOOD_PRESSURE_SYS": "Blood pressure sys.",
|
||
"BLOOD_PRESSURE_DIA": "Blood pressure dia."
|
||
},
|
||
"noValue": "no value",
|
||
"bloodPressure": "Blood pressure",
|
||
"readingsOne": "1 reading",
|
||
"readingsFew": "mean of {count} readings",
|
||
"readingsOther": "mean of {count} readings"
|
||
},
|
||
"table": {
|
||
"caption": "Timeline entries",
|
||
"lane": "Lane",
|
||
"entry": "Entry",
|
||
"start": "Start",
|
||
"end": "End",
|
||
"seriesCaption": "Value means by period",
|
||
"period": "Period",
|
||
"labsCaption": "Lab values by day",
|
||
"marker": "Marker",
|
||
"date": "Date",
|
||
"value": "Value"
|
||
},
|
||
"selection": {
|
||
"empty": "No entries in this period",
|
||
"since": "since {date}",
|
||
"range": "{from} to {to}",
|
||
"mean": "Ø {values}",
|
||
"week": "Week of {date}",
|
||
"hintClick": "Click a point in time to see it here",
|
||
"hintTap": "Tap a point in time to see it here"
|
||
},
|
||
"chronicle": {
|
||
"months": "Months",
|
||
"years": "Years",
|
||
"groupingLabel": "Grouping",
|
||
"empty": "No entries from {from} to {to}",
|
||
"emptySingle": "No entries in {period}",
|
||
"ended": "{label} ended",
|
||
"afterDaysOne": "after 1 day",
|
||
"afterDaysFew": "after {count} days",
|
||
"afterDaysOther": "after {count} days",
|
||
"notable": {
|
||
"extremeHigh": "Highest value in a long while",
|
||
"extremeLow": "Lowest value in a long while",
|
||
"firstValue": "First value of a measure",
|
||
"gap": "A longer gap in the values"
|
||
},
|
||
"notableMeta": "Open the day for details"
|
||
},
|
||
"standingAllergiesOne": "{count} allergy",
|
||
"standingAllergiesFew": "{count} allergies",
|
||
"standingAllergiesOther": "{count} allergies",
|
||
"legendMeanDay": "Daily mean",
|
||
"range": {
|
||
"from": "From",
|
||
"to": "To",
|
||
"label": "Chosen range",
|
||
"open": "Choose a range",
|
||
"clear": "Show everything",
|
||
"apply": "Apply"
|
||
},
|
||
"item": {
|
||
"labValuesOne": "1 lab value",
|
||
"labValuesFew": "{count} lab values",
|
||
"labValuesOther": "{count} lab values"
|
||
},
|
||
"labs": {
|
||
"menuTitle": "Lab values",
|
||
"otherPanel": "Other",
|
||
"full": "Up to {max} lab values at once. Remove one to add another.",
|
||
"above": "above range",
|
||
"below": "below range",
|
||
"reference": "reference {range}",
|
||
"report": "Report: {title}",
|
||
"reportUntitled": "Open the report",
|
||
"excludedOne": "{name}: {count} value in another unit is not drawn",
|
||
"excludedFew": "{name}: {count} values in another unit are not drawn",
|
||
"excludedOther": "{name}: {count} values in another unit are not drawn"
|
||
},
|
||
"legendLabValue": "Lab value, as measured",
|
||
"legendLabOutside": "Outside the reference range",
|
||
"legendLabRange": "Reference range"
|
||
},
|
||
"lifeEvents": {
|
||
"title": "Life event",
|
||
"add": "Life event",
|
||
"privacy": "Title and note are stored encrypted. They go to no AI.",
|
||
"emptyHint": "A move, a birth or a new job gives the years an anchor.",
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete life event",
|
||
"saved": "Life event saved",
|
||
"deleted": "Life event deleted",
|
||
"fields": {
|
||
"title": "What happened?",
|
||
"category": "Kind",
|
||
"when": "When",
|
||
"precision": "Precision",
|
||
"addEnd": "End date, if it was a period",
|
||
"endDate": "Until",
|
||
"note": "Note",
|
||
"optionalTag": "optional",
|
||
"notePlaceholder": "Something you want to know later",
|
||
"removeEnd": "Remove end date"
|
||
},
|
||
"category": {
|
||
"FAMILY": "Family",
|
||
"HOME": "Home",
|
||
"WORK": "Work",
|
||
"LOSS": "Loss",
|
||
"OTHER": "Other"
|
||
},
|
||
"precision": {
|
||
"DAY": "Day",
|
||
"MONTH": "Month",
|
||
"YEAR": "Year"
|
||
},
|
||
"edit": "Edit life event",
|
||
"errors": {
|
||
"titleRequired": "Give the event a name.",
|
||
"titleTooLong": "At most 120 characters.",
|
||
"categoryRequired": "Choose a kind.",
|
||
"dateRequired": "Enter a valid date.",
|
||
"endBeforeStart": "The end is before the start.",
|
||
"noteTooLong": "At most 2000 characters."
|
||
},
|
||
"saveFailed": "Saving did not work.",
|
||
"deleteFailed": "Deleting did not work.",
|
||
"deleteConfirm": {
|
||
"title": "Delete this life event?",
|
||
"body": "Its title and note will be gone."
|
||
}
|
||
},
|
||
"palette": {
|
||
"title": "Search",
|
||
"description": "Find a page, a setting, a module, an action or an entry in your records.",
|
||
"placeholder": "Search pages, settings, your records…",
|
||
"results": "Results",
|
||
"noResults": "Nothing found for “{query}”.",
|
||
"moduleOn": "On",
|
||
"moduleOff": "Off",
|
||
"hintMove": "Move",
|
||
"hintOpen": "Open",
|
||
"hintClose": "Close",
|
||
"groups": {
|
||
"recent": "Recent",
|
||
"pages": "Pages",
|
||
"insights": "Insights",
|
||
"settings": "Settings",
|
||
"modules": "Modules",
|
||
"actions": "Actions",
|
||
"records": "In your records"
|
||
},
|
||
"actions": {
|
||
"capture": "New entry",
|
||
"coach": "Ask the Coach",
|
||
"backup": "Create a backup",
|
||
"today": "Open today",
|
||
"shortcuts": "Show keyboard shortcuts"
|
||
},
|
||
"records": {
|
||
"loading": "Searching your records…",
|
||
"empty": "Nothing in your records for “{query}”.",
|
||
"error": "Your records could not be searched. Try again in a moment.",
|
||
"truncated": "Only the most recent entries were searched.",
|
||
"kind": {
|
||
"visit": "Visit",
|
||
"condition": "Condition",
|
||
"document": "Document",
|
||
"vaccination": "Vaccination",
|
||
"lab": "Lab result",
|
||
"medication": "Medication",
|
||
"symptom": "Symptom",
|
||
"workout": "Workout",
|
||
"note": "Note"
|
||
},
|
||
"source": {
|
||
"mood": "Mood note",
|
||
"measurement": "Note on a reading",
|
||
"illness": "Illness diary"
|
||
}
|
||
}
|
||
},
|
||
"shortcuts": {
|
||
"title": "Keyboard shortcuts",
|
||
"description": "Keys that work anywhere in the app, except while you type in a field.",
|
||
"menuEntry": "Keyboard shortcuts",
|
||
"then": "then",
|
||
"search": "Search",
|
||
"help": "Show this list",
|
||
"close": "Close a dialog or panel",
|
||
"previousDay": "Previous day",
|
||
"nextDay": "Next day",
|
||
"toggleDay": "Open or close the day",
|
||
"dayHint": "Previous and next day work while a day is open.",
|
||
"groups": {
|
||
"navigation": "Navigation",
|
||
"actions": "Actions",
|
||
"day": "Day"
|
||
}
|
||
},
|
||
"aboutPage": {
|
||
"eyebrow": "About",
|
||
"title": "About HealthLog",
|
||
"lastUpdated": "Last updated: {date}",
|
||
"project": "Project",
|
||
"credits": "Credits"
|
||
},
|
||
"series": {
|
||
"reference": {
|
||
"targetUpper": "Your target, upper limit",
|
||
"targetLower": "Your target, lower limit",
|
||
"clinicalUpper": "Clinical upper limit",
|
||
"clinicalLower": "Clinical lower limit"
|
||
}
|
||
},
|
||
"activityCalendar": {
|
||
"title": "Activity calendar",
|
||
"periodLabel": "Calendar span",
|
||
"period": {
|
||
"week": "Week",
|
||
"month": "Month"
|
||
},
|
||
"weekRange": "{start} to {end}",
|
||
"previous": "Previous period",
|
||
"next": "Next period",
|
||
"metricLabel": "Colour the days by",
|
||
"metric": {
|
||
"steps": "Steps",
|
||
"activeMinutes": "Active minutes",
|
||
"load": "Training load"
|
||
},
|
||
"empty": "No steps, active minutes or workouts in this period yet.",
|
||
"loadError": "The activity calendar could not be loaded.",
|
||
"weekGoalsColumn": "Weekly goals",
|
||
"weekGoalsMet": "All weekly goals met",
|
||
"weekGoalsNotMet": "Not all weekly goals met",
|
||
"cell": {
|
||
"steps": "{value} steps",
|
||
"activeMinutes": "{value} active minutes",
|
||
"workouts": "{value} workouts: {sports}"
|
||
},
|
||
"level": {
|
||
"none": "No data",
|
||
"unrated": "Not enough history yet",
|
||
"low": "Far below your usual",
|
||
"below": "Below your usual",
|
||
"usual": "About your usual",
|
||
"above": "Above your usual",
|
||
"high": "Far above your usual",
|
||
"in_progress": "Today, still in progress"
|
||
},
|
||
"legend": "Compared with your 12 weeks before:",
|
||
"noBaseline": "Your usual range shows after 14 days with data.",
|
||
"summary": {
|
||
"steps": "{value} steps",
|
||
"activeMinutes": "{value} active minutes",
|
||
"workouts": "{value} workouts",
|
||
"load": "Average training load {value}",
|
||
"usual": "Your usual by this point: {value}",
|
||
"noUsual": "Not enough earlier weeks or months to compare with yet.",
|
||
"usualThroughYesterday": "Through yesterday {value}, your usual by then {usual}",
|
||
"firstDay": "Compared with your usual once the first day is over."
|
||
},
|
||
"sportCount": "{sport}: {count}",
|
||
"goal": {
|
||
"workoutsPerWeek": "Workouts per week",
|
||
"activeMinutesPerWeek": "Active minutes per week",
|
||
"stepsPerWeek": "Steps per week",
|
||
"stepsPerMonth": "Steps per month"
|
||
},
|
||
"goalOf": "{value} of {target}",
|
||
"setGoals": "Set goals",
|
||
"editGoals": "Change goals",
|
||
"goalsSheet": {
|
||
"title": "Activity goals",
|
||
"description": "Leave a field empty for no goal.",
|
||
"none": "No goal",
|
||
"invalid": "A whole number from {min} to {max}.",
|
||
"saveError": "The goals could not be saved."
|
||
},
|
||
"crossLink": {
|
||
"title": "Activity calendar",
|
||
"body": "Your steps as a week or a month, against your own usual.",
|
||
"cta": "Open calendar"
|
||
}
|
||
},
|
||
"sourceProvenance": {
|
||
"title": "Where values come from",
|
||
"description": "Which source delivered a metric each day, and which one your source priority uses.",
|
||
"metric": "Metric",
|
||
"day": "Day",
|
||
"dayTitle": "Sources on this day",
|
||
"loadError": "The sources could not be loaded.",
|
||
"dayEmpty": "No readings of this metric on this day.",
|
||
"reason": {
|
||
"only_source": "{source} is the only source on this day.",
|
||
"highest_on_ladder": "{source} is used: it stands highest in your source priority among this day's sources.",
|
||
"name_tiebreak": "{source} is used: none of this day's sources is in your source priority, so the name decided.",
|
||
"not_ranked": "This metric has no source priority: every source's readings count."
|
||
},
|
||
"pass": {
|
||
"lower_on_ladder": "Lower in your source priority.",
|
||
"not_on_ladder": "Not in your source priority for this metric.",
|
||
"name_tiebreak": "Same rank as the source used; the name decided."
|
||
},
|
||
"used": "Used",
|
||
"readings": "{count} readings, devices: {devices}",
|
||
"ladder": "Your order for this metric: {ladder}",
|
||
"utcNote": "The source is chosen per day from midnight to midnight UTC, the same way the charts choose it.",
|
||
"openSettings": "Change the order in Source priority",
|
||
"compareTitle": "Compare two sources",
|
||
"range": "Range",
|
||
"rangeDays": "{days} days",
|
||
"compareNeedsTwo": "Only one source has readings of this metric in this range.",
|
||
"side": {
|
||
"a": "First source",
|
||
"b": "Second source"
|
||
},
|
||
"daysBoth": "Days with both",
|
||
"meanOf": "Average from {source}",
|
||
"meanAbsDiff": "Average difference",
|
||
"pickedDays": "Days used (first / second)",
|
||
"pickedSplit": "{a} / {b}",
|
||
"compareNote": "Averages cover only the days both sources have, so they compare like with like. The value in bold is the one the charts use.",
|
||
"settingsHint": "To see what this order decides day by day:",
|
||
"settingsHintLink": "Where values come from",
|
||
"metricLink": "Where these values come from"
|
||
},
|
||
"recordImport": {
|
||
"title": "Lab results and medications from a spreadsheet",
|
||
"description": "Bring years of lab results or a medication list in from a CSV file.",
|
||
"detail": "You choose which column holds what, HealthLog checks every row first and imports nothing until you confirm. Rows already in your record are skipped.",
|
||
"kind": {
|
||
"labs": "Lab results",
|
||
"medications": "Medications"
|
||
},
|
||
"sheetTitle": {
|
||
"labs": "Import lab results",
|
||
"medications": "Import medications"
|
||
},
|
||
"sheetDescription": {
|
||
"labs": "Markers are matched to yours, units converted where the conversion is known.",
|
||
"medications": "Name, dose, daily times, as needed, start and end. Other rhythms you set up in the app afterwards."
|
||
},
|
||
"file": "CSV file",
|
||
"template": "Download template",
|
||
"mapping": "Which column holds what",
|
||
"required": "(required)",
|
||
"notInFile": "Not in the file",
|
||
"column": "Column {n}",
|
||
"delimiter": "Separator",
|
||
"delimiterOption": {
|
||
"comma": "Comma",
|
||
"semicolon": "Semicolon",
|
||
"tab": "Tab"
|
||
},
|
||
"decimal": "Decimal mark",
|
||
"decimalOption": {
|
||
"dot": "Dot (5.4)",
|
||
"comma": "Comma (5,4)"
|
||
},
|
||
"dateOrder": "Date format",
|
||
"dateOrderOption": {
|
||
"iso": "2025-03-01",
|
||
"dmy": "01.03.2025 (day first)",
|
||
"mdy": "03/01/2025 (month first)"
|
||
},
|
||
"header": "The first row holds column names",
|
||
"reminders": "Turn reminders on for imported medications",
|
||
"timezoneNote": "Times without a time zone are read in your account's time zone. A date without a time is kept as that calendar date.",
|
||
"missing": "Still to choose: {fields}",
|
||
"check": "Check file",
|
||
"runIdle": "Import",
|
||
"run": "Import {count} rows",
|
||
"close": "Close",
|
||
"summaryCheck": "{rows} rows read: {inserted} can be imported, {duplicates} already in your record, {failed} with a problem.",
|
||
"summaryDone": "Imported {inserted} rows. Skipped {duplicates} already in your record, {failed} with a problem.",
|
||
"markersMatched": "Matched to your markers:",
|
||
"markersCreated": "New markers:",
|
||
"line": "Line {line}",
|
||
"errorsTruncated": "Only the first 500 problems are listed.",
|
||
"error": {
|
||
"tooLarge": "The file is larger than 16 MB.",
|
||
"rateLimited": "Too many imports in the last hour. Try again later.",
|
||
"invalid": "The file or the column choice could not be read.",
|
||
"failed": "The import did not go through. Please try again."
|
||
},
|
||
"reason": {
|
||
"missing_value": "A required cell is empty",
|
||
"invalid_number": "Not a number",
|
||
"ambiguous_number": "The number reads two ways; check the decimal mark",
|
||
"missing_unit": "A number needs a unit",
|
||
"invalid_date": "Not a date in the chosen order",
|
||
"invalid_time": "Not a time of day",
|
||
"ambiguous_date": "The date reads two ways; use a four-digit year and the chosen order",
|
||
"future_date": "The date lies in the future",
|
||
"text_too_long": "The text is too long",
|
||
"unit_mismatch": "This unit does not convert into the marker's unit",
|
||
"invalid_reference_range": "The reference range cannot be read",
|
||
"invalid_times": "The times cannot be read (use 08:00 20:00)",
|
||
"missing_times": "Add intake times, or mark the medication as needed",
|
||
"invalid_yes_no": "Use yes or no",
|
||
"as_needed_with_times": "An as-needed medication has no fixed times",
|
||
"end_before_start": "The end lies before the start",
|
||
"invalid_medication": "The medication cannot be saved like this",
|
||
"oversized_row": "The row is too long or too wide",
|
||
"row_limit": "Past the row limit for one import",
|
||
"duplicate": "Already in your record, skipped"
|
||
},
|
||
"field": {
|
||
"analyte": "Marker",
|
||
"value": "Result",
|
||
"unit": "Unit",
|
||
"date": "Date",
|
||
"time": "Time",
|
||
"referenceRange": "Reference range",
|
||
"referenceLow": "Reference low",
|
||
"referenceHigh": "Reference high",
|
||
"panel": "Panel",
|
||
"note": "Note",
|
||
"name": "Name",
|
||
"dose": "Dose",
|
||
"times": "Times",
|
||
"asNeeded": "As needed",
|
||
"startsOn": "Start",
|
||
"endsOn": "End"
|
||
},
|
||
"unitlessHint": "A ratio or an index without a unit (INR, cholesterol/HDL): write 1 in the unit column. An empty unit cell stays an error."
|
||
}
|
||
}
|