chore(i18n): retire 414 dead translation keys across six locale bundles

Sweeps 154 dead keys per locale bundle (~924 strings across six
locales) flagged by the v1.4.27 dead-key audit. Drops the
insights.*Status* trio (loading / noKey / unavailable) across six
metrics, the legacy `insights.aiInsights` / `dashboard.insightsPreview`
roots that B1 replaced with the gated tab strip, the
`insights.healthScore.askCoach` / `coachPrompt` pair retired with the
inline button, the orphan onboarding.v2.* stub set, plus the
ad-hoc `medications.glp1.drug.*.class` and `notifications.eventPersonalRecord*`
strings that lost their callers in v1.4.25/W17.

Also drops the stale prefill-format test under
`health-score-card.test.tsx` that asserted the now-removed coachPrompt
key shape — the negative-assertion test for the retired inline button
stays in place.

The locale-integrity test already validates the new shape: no
re-baselining needed because the test asserts parity + no-empties
rather than a key-count threshold.
This commit is contained in:
Marc-André Bombeck committed 2026-05-15 17:11:26 +02:00
1 parent 39fef7d316
commit 2960f7352c
7 files changed
+54 -1063

No files matched your search

+8 -172
View File
@@ -218,8 +218,6 @@
"streakLabel": "Tage in Folge",
"weight": "Gewicht",
"bloodPressure": "Blutdruck",
"bloodPressureSys": "Blutdruck (Sys)",
"bloodPressureDia": "Blutdruck (Dia)",
"pulse": "Puls",
"bodyFat": "Körperfett",
"sleep": "Schlaf",
@@ -238,7 +236,6 @@
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BD-Ziel",
"medications": "Medikamente",
"insightsPreview": "KI-Insights-Vorschau",
"quickAddMeasurement": "Messung erfassen",
"quickAddMood": "Stimmung erfassen",
"compliance7d": "Einnahmetreue (7 Tage)",
@@ -629,8 +626,7 @@
"missedLast30": "Verpasst (30 T.)",
"unit": {
"days": "T.",
"doses": "Dosen",
"percent": "%"
"doses": "Dosen"
},
"chips": {
"adherenceTooltip": "Anteil genommener Dosen im 30-Tage-Fenster (ausgelassene Dosen werden ausgenommen).",
@@ -651,7 +647,6 @@
"ceilingMessage": "Du bist auf der höchsten Standardstufe.",
"escalationDueHint": "Du bist seit {weeks} Wochen auf dieser Stufe; das Schema sieht eine Steigerung typischerweise nach ~{typical} Wochen vor.",
"currentStepDwell": "Seit {weeks} Wochen auf dieser Stufe",
"weeksUnit": "Wo.",
"doseUnitMg": "mg",
"emptyState": "Noch keine Dosis-Historie. Erfasse eine Dosis, um deine Position im Schema zu sehen.",
"nonStandardDose": "Aktuelle Dosis liegt außerhalb des Standard-Schemas.",
@@ -704,7 +699,6 @@
"purgeError": "Fehler beim Löschen der Aufzeichnungen",
"invalidTimestamp": "Bitte einen gültigen Zeitpunkt wählen.",
"noIntakesYet": "Noch keine Einnahmen vorhanden",
"deleteIntakeAriaLabel": "Einnahme löschen",
"actions": "Aktionen",
"pageInfo": "Seite {page} von {total}",
"loginRequiredIntakes": "Bitte anmelden, um Einnahmen zu sehen.",
@@ -738,29 +732,20 @@
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatid",
"class": "GIP-GLP-1-Doppel-Agonist"
"name": "Tirzepatid"
},
"semaglutide": {
"name": "Semaglutid",
"class": "GLP-1-Rezeptoragonist"
"name": "Semaglutid"
},
"liraglutide": {
"name": "Liraglutid",
"class": "GLP-1-Rezeptoragonist"
"name": "Liraglutid"
},
"dulaglutide": {
"name": "Dulaglutid",
"class": "GLP-1-Rezeptoragonist"
"name": "Dulaglutid"
},
"exenatide": {
"name": "Exenatid",
"class": "GLP-1-Rezeptoragonist"
"name": "Exenatid"
}
},
"source": {
"ema": "EMA-Quelle",
"psp4": "Peer-Reviewed Pharmakometrik"
}
},
"researchMode": {
@@ -830,10 +815,6 @@
"trend": "Trend",
"perWeek": "/Woche",
"totalDelta": "Gesamt",
"selectMedication": "Medikament wählen",
"noComplianceData": "Keine Compliance-Daten verfügbar",
"history": "Verlauf",
"complianceDays90": "Einnahmetreue (90 Tage)",
"colorGreen": "Grün:",
"colorOrange": "Orange:",
"colorRed": "Rot:",
@@ -968,10 +949,6 @@
"confidenceMittel": "Mittel",
"confidenceGering": "Gering",
"loadError": "Auswertungen konnten nicht geladen werden",
"generationFailed": "Die Analyse konnte nicht erstellt werden. Bitte versuche es erneut.",
"title": "Insights",
"subtitle": "KI-basierte Analyse deiner Gesundheitsdaten",
"overviewSubtitle": "Trends, Risiken, Fortschritt auf einen Blick",
"heroGenerated": "Erstellt {time}",
"heroPersonalBaseline": "Basierend auf deinen letzten 90 Tagen",
"heroRegenerate": "Neu generieren",
@@ -985,7 +962,6 @@
"heroComingSoonTooltip": "Kommt bald",
"heroActionWeeklyReport": "Wochenbericht erstellen",
"heroActionAskCoach": "Coach fragen",
"heroActionRerun": "Analyse neu starten",
"heroBanner": {
"ready": "Dein {week}-Bericht ist bereit",
"read": "Lesen",
@@ -1005,8 +981,6 @@
"componentMood": "Stimmung",
"componentCompliance": "Einnahmetreue",
"disclaimer": "Orientierungshilfe — keine ärztliche Bewertung.",
"askCoach": "Coach fragen",
"coachPrompt": "Warum ist mein Gesundheitsscore {score} von 100?",
"provenance": {
"toggle": "Zusammensetzung",
"weightLabel": "Anteil",
@@ -1179,13 +1153,10 @@
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider ist temporär überlastet; Reset in ~5 min."
},
"viewAll": "Alle ansehen",
"previewEmpty": "Noch keine Empfehlungen.",
"relativeJustNow": "gerade eben",
"relativeMinutesAgo": "vor {count} Minuten",
"relativeHoursAgo": "vor {count} Stunden",
"relativeDaysAgo": "vor {count} Tagen",
"navGeneral": "Allgemein",
"navOverview": "Übersicht",
"navBloodPressure": "Blutdruck",
"navWeight": "Gewicht",
@@ -1234,38 +1205,7 @@
"action": "Geräte verwalten"
}
},
"measurementsOverDays": "{count} Messungen über {days} Tage",
"healthStatus": "Gesundheitsstatus",
"noWeightData": "Keine Gewichtsdaten oder Größe nicht hinterlegt.",
"notEnoughBpData": "Nicht genügend Blutdruckdaten.",
"bpTargetRange": "Zielbereich Blutdruck",
"inTargetRange": "im Zielbereich",
"bpTarget": "Ziel: {range}",
"noDobSet": "Geburtsdatum nicht hinterlegt.",
"avg30dEsc": "30T-Durchschnitt · ESH 2023",
"whoClassification": "WHO-Klassifikation",
"correlations": "Korrelationen",
"weightVsBp": "Gewicht vs. Blutdruck (Systolisch)",
"strengthStrong": "Starke Korrelation",
"strengthModerate": "Moderate Korrelation",
"strengthWeak": "Schwache Korrelation",
"strengthNone": "Keine Korrelation",
"weightBpStrong": "Es besteht ein starker Zusammenhang zwischen Gewicht und Blutdruck.",
"weightBpModerate": "Es besteht ein moderater Zusammenhang zwischen Gewicht und Blutdruck.",
"weightBpWeak": "Es besteht ein schwacher Zusammenhang zwischen Gewicht und Blutdruck.",
"weightBpNone": "Kein erkennbarer Zusammenhang zwischen Gewicht und Blutdruck.",
"notEnoughCorrelationData": "Zu wenig Daten für Korrelationsanalyse.",
"minCorrelationData": "Mindestens 5 zeitlich übereinstimmende Gewichts- und Blutdruckmessungen nötig.",
"bpMedContinuity": "Blutdrucksenker-Kontinuität vs. Blutdruck (Systolisch)",
"continuityLabel": "Kontinuität",
"continuityBpLabel": "Kontinuität Blutdrucksenker (%)",
"weightKgLabel": "Gewicht (kg)",
"bpMedNegative": "Negativer Zusammenhang: höhere Kontinuität geht eher mit niedrigerem systolischen Blutdruck einher.",
"bpMedPositive": "Positiver Zusammenhang: höhere Kontinuität geht in deinen Daten eher mit höherem systolischen Blutdruck einher.",
"bpMedNone": "Kein erkennbarer Zusammenhang in deinen Daten.",
"bpMedCount": "{count} Blutdrucksenker",
"notEnoughMedData": "Zu wenig Daten für diese Analyse.",
"notEnoughMedDataHint": "Markiere Medikamente als Blutdrucksenker und erfasse ausreichend Einnahmen + Blutdruckmessungen.",
"medicationCompliance": "Medikamenten-Compliance",
"dayStreak": "{count} Tage Serie",
"compliance7d": "7-Tage-Compliance",
@@ -1273,11 +1213,6 @@
"taken": "genommen",
"skipped": "übersprungen",
"missed": "verpasst",
"complianceTrend": "Compliance-Verlauf",
"generalStatusTitle": "Allgemeiner Gesundheitszustand",
"generalStatusLoading": "Allgemeiner Zustand wird erstellt...",
"generalStatusNoKey": "Der allgemeine Zustand kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"generalStatusUnavailable": "Der allgemeine Zustand konnte aktuell nicht geladen werden.",
"generalStatusBadge": {
"good": "Gut",
"watch": "Beobachten",
@@ -1285,70 +1220,14 @@
},
"assessmentTitle": "Einschätzung",
"bloodPressureSectionTitle": "Blutdruck",
"bloodPressureMedicationListTitle": "Blutdrucksenker & Compliance",
"bloodPressureMedicationListEmpty": "Keine aktiven Blutdrucksenker hinterlegt.",
"bloodPressureStatusLoading": "Blutdruck-Zusammenfassung wird erstellt...",
"bloodPressureStatusNoKey": "Die Blutdruck-Zusammenfassung kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"bloodPressureStatusUnavailable": "Die Blutdruck-Zusammenfassung konnte aktuell nicht geladen werden.",
"weightSectionTitle": "Gewicht",
"weightStatusLoading": "Gewichts-Zusammenfassung wird erstellt...",
"weightStatusNoKey": "Die Gewichts-Zusammenfassung kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"weightStatusUnavailable": "Die Gewichts-Zusammenfassung konnte aktuell nicht geladen werden.",
"pulseSectionTitle": "Puls",
"pulseStatusLoading": "Puls-Zusammenfassung wird erstellt...",
"pulseStatusNoKey": "Die Puls-Zusammenfassung kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"pulseStatusUnavailable": "Die Puls-Zusammenfassung konnte aktuell nicht geladen werden.",
"bmiSectionTitle": "BMI",
"bmiStatusLoading": "BMI-Zusammenfassung wird erstellt...",
"bmiStatusNoKey": "Die BMI-Zusammenfassung kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"bmiStatusUnavailable": "Die BMI-Zusammenfassung konnte aktuell nicht geladen werden.",
"medicationComplianceStatusLoading": "Text zur Medikamentencompliance wird erstellt...",
"medicationComplianceStatusNoKey": "Der Text zur Medikamentencompliance kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"medicationComplianceStatusUnavailable": "Der Text zur Medikamentencompliance konnte aktuell nicht geladen werden.",
"complianceNoData": "Keine Compliance-Daten verfügbar",
"aiInsights": "KI-Insights",
"configureApiKey": "Konfiguriere einen OpenAI API-Key in den Einstellungen, um KI-basierte Insights zu erhalten.",
"alertsTitle": "Hinweise & Empfehlungen",
"showLess": "Weniger anzeigen",
"showMore": "+{count} weitere",
"generate": "Neue Analyse erstellen",
"generating": "Analyse wird erstellt...",
"lastGenerated": "Letzte Analyse",
"noInsights": "Noch keine Analyse vorhanden.",
"rateLimit": "Bitte warte, bevor du eine neue Analyse erstellst.",
"noApiKey": "Bitte hinterlege zuerst einen OpenAI API-Key in den Einstellungen.",
"sendRawData": "Rohdaten mitsenden",
"minMoodCorrelationData": "Mindestens 5 zeitlich übereinstimmende Stimmungs- und Messdaten nötig.",
"moodBpModerate": "Es besteht ein moderater Zusammenhang zwischen Stimmung und Blutdruck.",
"moodBpNone": "Kein erkennbarer Zusammenhang zwischen Stimmung und Blutdruck.",
"moodBpStrong": "Es besteht ein starker Zusammenhang zwischen Stimmung und Blutdruck.",
"moodBpWeak": "Es besteht ein schwacher Zusammenhang zwischen Stimmung und Blutdruck.",
"moodScoreLabel": "Stimmung (Ø)",
"moodSectionTitle": "Stimmung",
"moodStatusLoading": "Stimmungsanalyse wird erstellt...",
"moodStatusNoKey": "Die Stimmungs-Zusammenfassung kann nicht erstellt werden, da kein OpenAI-KI-Schlüssel hinterlegt ist.",
"moodStatusUnavailable": "Stimmungsanalyse nicht verfügbar",
"moodVsBp": "Stimmung vs. Blutdruck (Systolisch)",
"moodVsPulse": "Stimmung vs. Puls",
"moodVsWeight": "Stimmung vs. Gewicht",
"moodWeightModerate": "Es besteht ein moderater Zusammenhang zwischen Stimmung und Gewicht.",
"moodWeightNone": "Kein erkennbarer Zusammenhang zwischen Stimmung und Gewicht.",
"moodWeightStrong": "Es besteht ein starker Zusammenhang zwischen Stimmung und Gewicht.",
"moodWeightWeak": "Es besteht ein schwacher Zusammenhang zwischen Stimmung und Gewicht.",
"notEnoughMoodCorrelationData": "Zu wenig Stimmungsdaten für Korrelationsanalyse.",
"refreshButton": "Aktualisieren",
"generateButton": "Generieren",
"analyzing": "Analysiere Gesundheitsdaten...",
"confidence": "Konfidenz",
"confidence_niedrig": "niedrig",
"confidence_mittel": "mittel",
"confidence_hoch": "hoch",
"cached": "Gecacht",
"sectionChanged": "Was hat sich verändert",
"sectionStable": "Was ist stabil",
"sectionDrivers": "Mögliche Zusammenhänge",
"sectionNextSteps": "Nächste Schritte",
"generatePrompt": "Klicke auf \"Generieren\" für KI-basierte Insights deiner Gesundheitsdaten."
"cached": "Gecacht"
},
"thresholds": {
"defaultLabel": "Default",
@@ -1382,45 +1261,7 @@
"unsetExplanation": "Kein eigener Wert — berechneter Default aktiv."
},
"onboarding": {
"errorProfile": "Dein Profil konnte nicht gespeichert werden. Bitte versuche es erneut.",
"errorGeneric": "Beim Abschluss des Setups ist etwas schiefgelaufen. Bitte versuche es erneut.",
"v2": {
"title": "Willkommen bei HealthLog",
"subtitle": "Drei schnelle Schritte. Alles weitere kannst du später in den Einstellungen erledigen.",
"stepOf": "Schritt {current} von {total}",
"back": "Zurück",
"continue": "Weiter",
"finish": "Setup abschließen",
"skipStep": "Schritt überspringen — du kannst das Setup später in den Einstellungen abschließen.",
"step1": {
"title": "Über dich",
"description": "Wird für Blutdruck-Zielwerte, BMI und passende Erinnerungen genutzt.",
"displayNameLabel": "Anzeigename",
"displayNameHint": "Erscheint in der Dashboard-Begrüßung und in Berichten.",
"languageLabel": "Sprache",
"languageHint": "Wird für App, PDFs und Benachrichtigungen verwendet."
},
"step2": {
"title": "Lege deine erste Messung an",
"description": "Gewicht, Blutdruck oder Puls — was du gerade zur Hand hast. Schon eine Messung lässt das Dashboard lebendig wirken.",
"added": "Top — weitere Messungen kannst du jederzeit über das Dashboard hinzufügen.",
"skipHint": "Keine Messung zur Hand? Überspringe und logge eine, wenn du soweit bist."
},
"step3": {
"title": "Wähle einen Benachrichtigungs-Kanal",
"description": "Wir senden nur, was du auch willst. Du kannst weitere Kanäle und Events später feinjustieren.",
"channelTelegramTitle": "Telegram-Bot",
"channelTelegramHint": "Erinnerungen mit Snooze-Buttons direkt in Telegram.",
"channelWebPushTitle": "Web Push",
"channelWebPushHint": "Native Browser-Benachrichtigungen auf diesem Gerät.",
"channelNtfyTitle": "ntfy.sh",
"channelNtfyHint": "Open-Source-Push an Handy oder Desktop, ohne Account.",
"channelNoneTitle": "Vorerst überspringen",
"channelNoneHint": "Ich richte Benachrichtigungen später in den Einstellungen ein.",
"openSettings": "In den Einstellungen fortsetzen"
},
"doneToast": "Alles eingerichtet — willkommen an Bord."
},
"tour": {
"stepOf": "Schritt {current} von {total}",
"next": "Weiter",
@@ -1466,7 +1307,6 @@
"title": "Was möchtest du erfassen?",
"body": "Wähle die Bereiche, die dir wichtig sind. Dashboard und Erinnerungen richten sich danach.",
"helpHint": "Ein bis drei Schwerpunkte funktionieren erfahrungsgemäß am besten – mehr geht aber jederzeit.",
"placeholder": "Auswahl der Ziele folgt.",
"options": {
"weightManagement": "Gewicht im Griff",
"bpTracking": "Blutdruck",
@@ -1479,7 +1319,6 @@
"source": {
"title": "Quelle verbinden",
"body": "Werte automatisch übernehmen oder weiter manuell eintragen – deine Entscheidung.",
"placeholder": "Quellenauswahl folgt.",
"recommended": "Empfohlen",
"manual": {
"title": "Manuelle Eingabe",
@@ -1500,7 +1339,6 @@
"baseline": {
"title": "Kurz zu dir",
"body": "Vier optionale Angaben verbessern Zielwerte, BMI und Erinnerungen. Du kannst alles später in den Einstellungen anpassen.",
"placeholder": "Eingabe der Erstmessung folgt.",
"displayNameLabel": "Anzeigename",
"displayNamePlaceholder": "Wie soll dich HealthLog ansprechen?",
"displayNameHint": "Erscheint im Dashboard-Gruß und in Berichten.",
@@ -2753,9 +2591,7 @@
"loadError": "Benachrichtigungseinstellungen konnten nicht geladen werden.",
"noChannels": "Konfiguriere zuerst einen Benachrichtigungskanal in den Einstellungen.",
"goToSettings": "Zu den Einstellungen",
"channelDisabled": "Deaktiviert",
"eventPersonalRecord": "Persönlicher Rekord",
"eventPersonalRecordDesc": "Push bei einem neuen Bestwert für eine erfasste Kennzahl oder ein Training. Standardmäßig aus."
"channelDisabled": "Deaktiviert"
},
"i18n": {
"maintainershipBanner": {
+8 -172
View File
@@ -218,8 +218,6 @@
"streakLabel": "days in a row",
"weight": "Weight",
"bloodPressure": "Blood Pressure",
"bloodPressureSys": "Blood Pressure (Sys)",
"bloodPressureDia": "Blood Pressure (Dia)",
"pulse": "Pulse",
"bodyFat": "Body Fat",
"sleep": "Sleep",
@@ -238,7 +236,6 @@
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BP in Target",
"medications": "Medications",
"insightsPreview": "AI Insights preview",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"compliance7d": "Compliance (7 days)",
@@ -629,8 +626,7 @@
"missedLast30": "Missed (30 d.)",
"unit": {
"days": "d.",
"doses": "doses",
"percent": "%"
"doses": "doses"
},
"chips": {
"adherenceTooltip": "Share of doses taken across the last 30 days (skipped doses are excluded from the denominator).",
@@ -651,7 +647,6 @@
"ceilingMessage": "You are at the top of the standard ladder.",
"escalationDueHint": "You've been on this step for {weeks} weeks; the ladder typically steps up around {typical} weeks.",
"currentStepDwell": "On this step for {weeks} weeks",
"weeksUnit": "wks",
"doseUnitMg": "mg",
"emptyState": "No dose history yet. Log a dose to see where you are on the ladder.",
"nonStandardDose": "Current dose is outside the standard ladder buckets.",
@@ -704,7 +699,6 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Actions",
"pageInfo": "Page {page} of {total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
@@ -738,29 +732,20 @@
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatide",
"class": "GIP-GLP-1 dual agonist"
"name": "Tirzepatide"
},
"semaglutide": {
"name": "Semaglutide",
"class": "GLP-1 receptor agonist"
"name": "Semaglutide"
},
"liraglutide": {
"name": "Liraglutide",
"class": "GLP-1 receptor agonist"
"name": "Liraglutide"
},
"dulaglutide": {
"name": "Dulaglutide",
"class": "GLP-1 receptor agonist"
"name": "Dulaglutide"
},
"exenatide": {
"name": "Exenatide",
"class": "GLP-1 receptor agonist"
"name": "Exenatide"
}
},
"source": {
"ema": "EMA source",
"psp4": "Peer-reviewed pharmacometrics"
}
},
"researchMode": {
@@ -830,10 +815,6 @@
"trend": "Trend",
"perWeek": "/week",
"totalDelta": "Total",
"selectMedication": "Select medication",
"noComplianceData": "No compliance data available",
"history": "History",
"complianceDays90": "Compliance (90 days)",
"colorGreen": "Green:",
"colorOrange": "Orange:",
"colorRed": "Red:",
@@ -968,10 +949,6 @@
"confidenceMittel": "Medium",
"confidenceGering": "Low",
"loadError": "Failed to load insights",
"generationFailed": "The analysis couldn't be generated. Please try again.",
"title": "Insights",
"subtitle": "AI-powered analysis of your health data",
"overviewSubtitle": "Trends, risks, progress at a glance",
"heroGenerated": "Generated {time}",
"heroPersonalBaseline": "Based on your last 90 days",
"heroRegenerate": "Regenerate",
@@ -985,7 +962,6 @@
"heroComingSoonTooltip": "Coming soon",
"heroActionWeeklyReport": "Generate weekly report",
"heroActionAskCoach": "Ask the coach",
"heroActionRerun": "Re-run analysis",
"heroBanner": {
"ready": "Your {week} report is ready",
"read": "Read",
@@ -1005,8 +981,6 @@
"componentMood": "Mood",
"componentCompliance": "Meds",
"disclaimer": "Indicative — not a clinical assessment.",
"askCoach": "Ask the Coach",
"coachPrompt": "Why is my health score {score} out of 100?",
"provenance": {
"toggle": "Driven by",
"weightLabel": "share",
@@ -1179,13 +1153,10 @@
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min."
},
"viewAll": "View all",
"previewEmpty": "No recommendations yet.",
"relativeJustNow": "just now",
"relativeMinutesAgo": "{count} minutes ago",
"relativeHoursAgo": "{count} hours ago",
"relativeDaysAgo": "{count} days ago",
"navGeneral": "General",
"navOverview": "Overview",
"navBloodPressure": "Blood Pressure",
"navWeight": "Weight",
@@ -1234,38 +1205,7 @@
"action": "Manage devices"
}
},
"measurementsOverDays": "{count} measurements over {days} days",
"healthStatus": "Health Status",
"noWeightData": "No weight data or height not set.",
"notEnoughBpData": "Not enough blood pressure data.",
"bpTargetRange": "BP Target Range",
"inTargetRange": "in target range",
"bpTarget": "Target: {range}",
"noDobSet": "Date of birth not set.",
"avg30dEsc": "30d average · ESH 2023",
"whoClassification": "WHO Classification",
"correlations": "Correlations",
"weightVsBp": "Weight vs. Blood Pressure (Systolic)",
"strengthStrong": "Strong correlation",
"strengthModerate": "Moderate correlation",
"strengthWeak": "Weak correlation",
"strengthNone": "No correlation",
"weightBpStrong": "There is a strong correlation between weight and blood pressure.",
"weightBpModerate": "There is a moderate correlation between weight and blood pressure.",
"weightBpWeak": "There is a weak correlation between weight and blood pressure.",
"weightBpNone": "No discernible correlation between weight and blood pressure.",
"notEnoughCorrelationData": "Not enough data for correlation analysis.",
"minCorrelationData": "At least 5 time-matched weight and blood pressure measurements needed.",
"bpMedContinuity": "BP Medication Continuity vs. Blood Pressure (Systolic)",
"continuityLabel": "Continuity",
"continuityBpLabel": "BP Medication Continuity (%)",
"weightKgLabel": "Weight (kg)",
"bpMedNegative": "Negative correlation: higher continuity tends to be associated with lower systolic blood pressure.",
"bpMedPositive": "Positive correlation: higher continuity tends to be associated with higher systolic blood pressure in your data.",
"bpMedNone": "No discernible correlation in your data.",
"bpMedCount": "{count} BP medications",
"notEnoughMedData": "Not enough data for this analysis.",
"notEnoughMedDataHint": "Tag medications as blood pressure medications and record sufficient intakes + blood pressure measurements.",
"medicationCompliance": "Medication Compliance",
"dayStreak": "{count} day streak",
"compliance7d": "7-day compliance",
@@ -1273,11 +1213,6 @@
"taken": "taken",
"skipped": "skipped",
"missed": "missed",
"complianceTrend": "Compliance Trend",
"generalStatusTitle": "General Health Status",
"generalStatusLoading": "Generating general status...",
"generalStatusNoKey": "The general status cannot be generated because no OpenAI key is configured.",
"generalStatusUnavailable": "The general status is currently unavailable.",
"generalStatusBadge": {
"good": "Good",
"watch": "Watch",
@@ -1285,70 +1220,14 @@
},
"assessmentTitle": "Assessment",
"bloodPressureSectionTitle": "Blood Pressure",
"bloodPressureMedicationListTitle": "Blood Pressure Medication & Compliance",
"bloodPressureMedicationListEmpty": "No active blood pressure medication configured.",
"bloodPressureStatusLoading": "Generating blood pressure summary...",
"bloodPressureStatusNoKey": "The blood pressure summary cannot be generated because no OpenAI key is configured.",
"bloodPressureStatusUnavailable": "The blood pressure summary is currently unavailable.",
"weightSectionTitle": "Weight",
"weightStatusLoading": "Generating weight summary...",
"weightStatusNoKey": "The weight summary cannot be generated because no OpenAI key is configured.",
"weightStatusUnavailable": "The weight summary is currently unavailable.",
"pulseSectionTitle": "Pulse",
"pulseStatusLoading": "Generating pulse summary...",
"pulseStatusNoKey": "The pulse summary cannot be generated because no OpenAI key is configured.",
"pulseStatusUnavailable": "The pulse summary is currently unavailable.",
"bmiSectionTitle": "BMI",
"bmiStatusLoading": "Generating BMI summary...",
"bmiStatusNoKey": "The BMI summary cannot be generated because no OpenAI key is configured.",
"bmiStatusUnavailable": "The BMI summary is currently unavailable.",
"medicationComplianceStatusLoading": "Generating medication compliance text...",
"medicationComplianceStatusNoKey": "The medication compliance text cannot be generated because no OpenAI key is configured.",
"medicationComplianceStatusUnavailable": "The medication compliance text is currently unavailable.",
"complianceNoData": "No compliance data available.",
"aiInsights": "AI Insights",
"configureApiKey": "Configure an OpenAI API key in Settings to get AI-powered insights.",
"alertsTitle": "Notes & Recommendations",
"showLess": "Show less",
"showMore": "+{count} more",
"generate": "Generate new analysis",
"generating": "Generating analysis...",
"lastGenerated": "Last analysis",
"noInsights": "No analysis available yet.",
"rateLimit": "Please wait before generating a new analysis.",
"noApiKey": "Please add an OpenAI API key in Settings first.",
"sendRawData": "Send raw data",
"minMoodCorrelationData": "At least 5 temporally matched mood and measurement data points required.",
"moodBpModerate": "There is a moderate correlation between mood and blood pressure.",
"moodBpNone": "No detectable correlation between mood and blood pressure.",
"moodBpStrong": "There is a strong correlation between mood and blood pressure.",
"moodBpWeak": "There is a weak correlation between mood and blood pressure.",
"moodScoreLabel": "Mood (avg)",
"moodSectionTitle": "Mood",
"moodStatusLoading": "Generating mood analysis...",
"moodStatusNoKey": "Mood summary cannot be generated because no OpenAI API key is configured.",
"moodStatusUnavailable": "Mood analysis unavailable",
"moodVsBp": "Mood vs. Blood Pressure (Systolic)",
"moodVsPulse": "Mood vs. Pulse",
"moodVsWeight": "Mood vs. Weight",
"moodWeightModerate": "There is a moderate correlation between mood and weight.",
"moodWeightNone": "No detectable correlation between mood and weight.",
"moodWeightStrong": "There is a strong correlation between mood and weight.",
"moodWeightWeak": "There is a weak correlation between mood and weight.",
"notEnoughMoodCorrelationData": "Not enough mood data for correlation analysis.",
"refreshButton": "Refresh",
"generateButton": "Generate",
"analyzing": "Analyzing health data...",
"confidence": "Confidence",
"confidence_niedrig": "low",
"confidence_mittel": "medium",
"confidence_hoch": "high",
"cached": "Cached",
"sectionChanged": "What has changed",
"sectionStable": "What is stable",
"sectionDrivers": "Possible correlations",
"sectionNextSteps": "Next steps",
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
"cached": "Cached"
},
"thresholds": {
"defaultLabel": "Default",
@@ -1382,45 +1261,7 @@
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"errorProfile": "Could not save your profile. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
"stepOf": "Step {current} of {total}",
"back": "Back",
"continue": "Continue",
"finish": "Finish setup",
"skipStep": "Skip this step — you can finish setup later from Settings.",
"step1": {
"title": "About you",
"description": "Used for blood-pressure targets, BMI, and the right reminders.",
"displayNameLabel": "Display name",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
"languageLabel": "Language",
"languageHint": "We'll use this for the app, PDFs, and notifications."
},
"step2": {
"title": "Log your first measurement",
"description": "Weight, blood pressure, or pulse — whatever you have right now. The dashboard comes alive with one entry.",
"added": "Got it — you can add more anytime from the dashboard.",
"skipHint": "No measurement at hand? Skip and log one when you're ready."
},
"step3": {
"title": "Pick one notification channel",
"description": "We'll only send what you ask for. You can add more channels or fine-tune events later.",
"channelTelegramTitle": "Telegram bot",
"channelTelegramHint": "Reminders with snooze buttons inside Telegram.",
"channelWebPushTitle": "Web Push",
"channelWebPushHint": "Native browser notifications on this device.",
"channelNtfyTitle": "ntfy.sh",
"channelNtfyHint": "Open-source push to phone or desktop, no account.",
"channelNoneTitle": "Skip for now",
"channelNoneHint": "I'll set up notifications later from Settings.",
"openSettings": "Continue in Settings"
},
"doneToast": "You're all set — welcome aboard."
},
"tour": {
"stepOf": "Step {current} of {total}",
"next": "Next",
@@ -1466,7 +1307,6 @@
"title": "What would you like to track?",
"body": "Pick the areas you care about. Your dashboard and the default reminders follow your choice.",
"helpHint": "One to three priorities tend to work best — you can always add more later.",
"placeholder": "Goal selection coming soon.",
"options": {
"weightManagement": "Weight management",
"bpTracking": "Blood pressure",
@@ -1479,7 +1319,6 @@
"source": {
"title": "Connect a source",
"body": "Bring in measurements automatically, or stay on manual entry — your call.",
"placeholder": "Source picker coming soon.",
"recommended": "Recommended",
"manual": {
"title": "Manual entry",
@@ -1500,7 +1339,6 @@
"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.",
"placeholder": "Baseline entry coming soon.",
"displayNameLabel": "Display name",
"displayNamePlaceholder": "How should HealthLog address you?",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
@@ -2753,9 +2591,7 @@
"loadError": "Notification preferences could not be loaded.",
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Disabled",
"eventPersonalRecord": "Personal Record",
"eventPersonalRecordDesc": "Push when an all-time best is reached for a tracked metric or workout. Off by default."
"channelDisabled": "Disabled"
},
"i18n": {
"maintainershipBanner": {
+8 -172
View File
@@ -218,8 +218,6 @@
"streakLabel": "days in a row",
"weight": "Peso",
"bloodPressure": "Presión arterial",
"bloodPressureSys": "Blood Pressure (Sys)",
"bloodPressureDia": "Blood Pressure (Dia)",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"sleep": "Sueño",
@@ -238,7 +236,6 @@
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "PA-objetivo",
"medications": "Medicamentos",
"insightsPreview": "AI Insights preview",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"compliance7d": "Compliance (7 days)",
@@ -629,8 +626,7 @@
"missedLast30": "Olvidadas (30 d.)",
"unit": {
"days": "d.",
"doses": "dosis",
"percent": "%"
"doses": "dosis"
},
"chips": {
"adherenceTooltip": "Proporción de dosis tomadas en los últimos 30 días (las dosis omitidas se excluyen del denominador).",
@@ -651,7 +647,6 @@
"ceilingMessage": "Estás en el último escalón estándar.",
"escalationDueHint": "Llevas {weeks} semanas en este escalón; el esquema suele avanzar tras ~{typical} semanas.",
"currentStepDwell": "En este escalón desde hace {weeks} semanas",
"weeksUnit": "sem.",
"doseUnitMg": "mg",
"emptyState": "Aún no hay historial de dosis. Registra una dosis para ver tu posición en el escalado.",
"nonStandardDose": "La dosis actual está fuera de los escalones estándar.",
@@ -704,7 +699,6 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Acciones",
"pageInfo": "Page {page} de{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
@@ -738,29 +732,20 @@
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatida",
"class": "Agonista dual GIP-GLP-1"
"name": "Tirzepatida"
},
"semaglutide": {
"name": "Semaglutida",
"class": "Agonista del receptor GLP-1"
"name": "Semaglutida"
},
"liraglutide": {
"name": "Liraglutida",
"class": "Agonista del receptor GLP-1"
"name": "Liraglutida"
},
"dulaglutide": {
"name": "Dulaglutida",
"class": "Agonista del receptor GLP-1"
"name": "Dulaglutida"
},
"exenatide": {
"name": "Exenatida",
"class": "Agonista del receptor GLP-1"
"name": "Exenatida"
}
},
"source": {
"ema": "Fuente EMA",
"psp4": "Farmacometría revisada por pares"
}
},
"researchMode": {
@@ -830,10 +815,6 @@
"trend": "Tendencia",
"perWeek": "/week",
"totalDelta": "Total",
"selectMedication": "Select medication",
"noComplianceData": "No compliance data available",
"history": "Historial",
"complianceDays90": "Compliance (90 days)",
"colorGreen": "Green:",
"colorOrange": "Orange:",
"colorRed": "Red:",
@@ -968,10 +949,6 @@
"confidenceMittel": "Medium",
"confidenceGering": "Low",
"loadError": "Failed to load insights",
"generationFailed": "The analysis couldn't be generated. Please try again.",
"title": "Análisis",
"subtitle": "AI-powered analysis of your health data",
"overviewSubtitle": "Trends, risks, progress at a glance",
"heroGenerated": "Generated {time}",
"heroPersonalBaseline": "Based on your last 90 days",
"heroRegenerate": "Regenerate",
@@ -985,7 +962,6 @@
"heroComingSoonTooltip": "Coming soon",
"heroActionWeeklyReport": "Generate weekly report",
"heroActionAskCoach": "Ask the coach",
"heroActionRerun": "Re-run analysis",
"heroBanner": {
"ready": "Your {week} report is ready",
"read": "Read",
@@ -1005,8 +981,6 @@
"componentMood": "Estado de ánimo",
"componentCompliance": "Meds",
"disclaimer": "Indicative — not a clinical assessment.",
"askCoach": "Ask the Coach",
"coachPrompt": "Why is my health score {score} out of 100?",
"provenance": {
"toggle": "Compuesto por",
"weightLabel": "peso",
@@ -1179,13 +1153,10 @@
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min."
},
"viewAll": "View all",
"previewEmpty": "No recommendations yet.",
"relativeJustNow": "just now",
"relativeMinutesAgo": "{count} minutes ago",
"relativeHoursAgo": "{count} hours ago",
"relativeDaysAgo": "{count} days ago",
"navGeneral": "General",
"navOverview": "Resumen",
"navBloodPressure": "Presión arterial",
"navWeight": "Peso",
@@ -1234,38 +1205,7 @@
"action": "Manage devices"
}
},
"measurementsOverDays": "{count} measurements over {days} days",
"healthStatus": "Health Status",
"noWeightData": "No weight data or height not set.",
"notEnoughBpData": "Not enough blood pressure data.",
"bpTargetRange": "BP Target Range",
"inTargetRange": "in target range",
"bpTarget": "Target: {range}",
"noDobSet": "Date of birth not set.",
"avg30dEsc": "30d average · ESH 2023",
"whoClassification": "WHO Classification",
"correlations": "Correlations",
"weightVsBp": "Weight vs. Blood Pressure (Systolic)",
"strengthStrong": "Strong correlation",
"strengthModerate": "Moderate correlation",
"strengthWeak": "Weak correlation",
"strengthNone": "No correlation",
"weightBpStrong": "There is a strong correlation between weight and blood pressure.",
"weightBpModerate": "There is a moderate correlation between weight and blood pressure.",
"weightBpWeak": "There is a weak correlation between weight and blood pressure.",
"weightBpNone": "No discernible correlation between weight and blood pressure.",
"notEnoughCorrelationData": "Not enough data for correlation analysis.",
"minCorrelationData": "At least 5 time-matched weight and blood pressure measurements needed.",
"bpMedContinuity": "BP Medication Continuity vs. Blood Pressure (Systolic)",
"continuityLabel": "Continuity",
"continuityBpLabel": "BP Medication Continuity (%)",
"weightKgLabel": "Weight (kg)",
"bpMedNegative": "Negative correlation: higher continuity tends to be associated with lower systolic blood pressure.",
"bpMedPositive": "Positive correlation: higher continuity tends to be associated with higher systolic blood pressure in your data.",
"bpMedNone": "No discernible correlation in your data.",
"bpMedCount": "{count} BP medications",
"notEnoughMedData": "Not enough data for this analysis.",
"notEnoughMedDataHint": "Tag medications as blood pressure medications and record sufficient intakes + blood pressure measurements.",
"medicationCompliance": "Medication Compliance",
"dayStreak": "{count} day streak",
"compliance7d": "7-day compliance",
@@ -1273,11 +1213,6 @@
"taken": "Tomada",
"skipped": "Omitida",
"missed": "Perdida",
"complianceTrend": "Compliance Trend",
"generalStatusTitle": "General Health Status",
"generalStatusLoading": "Generating general status...",
"generalStatusNoKey": "The general status cannot be generated because no OpenAI key is configured.",
"generalStatusUnavailable": "The general status is currently unavailable.",
"generalStatusBadge": {
"good": "Bien",
"watch": "Watch",
@@ -1285,70 +1220,14 @@
},
"assessmentTitle": "Assessment",
"bloodPressureSectionTitle": "Presión arterial",
"bloodPressureMedicationListTitle": "Blood Pressure Medication & Compliance",
"bloodPressureMedicationListEmpty": "No active blood pressure medication configured.",
"bloodPressureStatusLoading": "Generating blood pressure summary...",
"bloodPressureStatusNoKey": "The blood pressure summary cannot be generated because no OpenAI key is configured.",
"bloodPressureStatusUnavailable": "The blood pressure summary is currently unavailable.",
"weightSectionTitle": "Peso",
"weightStatusLoading": "Generating weight summary...",
"weightStatusNoKey": "The weight summary cannot be generated because no OpenAI key is configured.",
"weightStatusUnavailable": "The weight summary is currently unavailable.",
"pulseSectionTitle": "Pulso",
"pulseStatusLoading": "Generating pulse summary...",
"pulseStatusNoKey": "The pulse summary cannot be generated because no OpenAI key is configured.",
"pulseStatusUnavailable": "The pulse summary is currently unavailable.",
"bmiSectionTitle": "IMC",
"bmiStatusLoading": "Generating BMI summary...",
"bmiStatusNoKey": "The BMI summary cannot be generated because no OpenAI key is configured.",
"bmiStatusUnavailable": "The BMI summary is currently unavailable.",
"medicationComplianceStatusLoading": "Generating medication compliance text...",
"medicationComplianceStatusNoKey": "The medication compliance text cannot be generated because no OpenAI key is configured.",
"medicationComplianceStatusUnavailable": "The medication compliance text is currently unavailable.",
"complianceNoData": "No compliance data available.",
"aiInsights": "AI Insights",
"configureApiKey": "Configure an OpenAI API key in Settings to get AI-powered insights.",
"alertsTitle": "Notes & Recommendations",
"showLess": "Show less",
"showMore": "+{count} more",
"generate": "Generate new analysis",
"generating": "Generating analysis...",
"lastGenerated": "Last analysis",
"noInsights": "No analysis available yet.",
"rateLimit": "Please wait before generating a new analysis.",
"noApiKey": "Please add an OpenAI API key in Settings first.",
"sendRawData": "Send raw data",
"minMoodCorrelationData": "At least 5 temporally matched mood and measurement data points required.",
"moodBpModerate": "There is a moderate correlation between mood and blood pressure.",
"moodBpNone": "No detectable correlation between mood and blood pressure.",
"moodBpStrong": "There is a strong correlation between mood and blood pressure.",
"moodBpWeak": "There is a weak correlation between mood and blood pressure.",
"moodScoreLabel": "Mood (avg)",
"moodSectionTitle": "Estado de ánimo",
"moodStatusLoading": "Generating mood analysis...",
"moodStatusNoKey": "Mood summary cannot be generated because no OpenAI API key is configured.",
"moodStatusUnavailable": "Mood analysis unavailable",
"moodVsBp": "Mood vs. Blood Pressure (Systolic)",
"moodVsPulse": "Mood vs. Pulse",
"moodVsWeight": "Mood vs. Weight",
"moodWeightModerate": "There is a moderate correlation between mood and weight.",
"moodWeightNone": "No detectable correlation between mood and weight.",
"moodWeightStrong": "There is a strong correlation between mood and weight.",
"moodWeightWeak": "There is a weak correlation between mood and weight.",
"notEnoughMoodCorrelationData": "Not enough mood data for correlation analysis.",
"refreshButton": "Refresh",
"generateButton": "Generate",
"analyzing": "Analyzing health data...",
"confidence": "Confidence",
"confidence_niedrig": "low",
"confidence_mittel": "medium",
"confidence_hoch": "high",
"cached": "Cached",
"sectionChanged": "What has changed",
"sectionStable": "What is stable",
"sectionDrivers": "Possible correlations",
"sectionNextSteps": "Next steps",
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
"cached": "Cached"
},
"thresholds": {
"defaultLabel": "Default",
@@ -1382,45 +1261,7 @@
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"errorProfile": "Could not save your profile. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
"stepOf": "Step {current} de{total}",
"back": "Atrás",
"continue": "Continuar",
"finish": "Finish setup",
"skipStep": "Skip this step — you can finish setup later from Settings.",
"step1": {
"title": "About you",
"description": "Used for blood-pressure targets, BMI, and the right reminders.",
"displayNameLabel": "Display name",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
"languageLabel": "Idioma",
"languageHint": "We'll use this for the app, PDFs, and notifications."
},
"step2": {
"title": "Log your first measurement",
"description": "Weight, blood pressure, or pulse — whatever you have right now. The dashboard comes alive with one entry.",
"added": "Got it — you can add more anytime from the dashboard.",
"skipHint": "No measurement at hand? Skip and log one when you're ready."
},
"step3": {
"title": "Pick one notification channel",
"description": "We'll only send what you ask for. You can add more channels or fine-tune events later.",
"channelTelegramTitle": "Telegram bot",
"channelTelegramHint": "Reminders with snooze buttons inside Telegram.",
"channelWebPushTitle": "Web Push",
"channelWebPushHint": "Native browser notifications on this device.",
"channelNtfyTitle": "ntfy.sh",
"channelNtfyHint": "Open-source push to phone or desktop, no account.",
"channelNoneTitle": "Skip for now",
"channelNoneHint": "I'll set up notifications later from Settings.",
"openSettings": "Continue in Settings"
},
"doneToast": "You're all set — welcome aboard."
},
"tour": {
"stepOf": "Step {current} de{total}",
"next": "Siguiente",
@@ -1466,7 +1307,6 @@
"title": "¿Qué te gustaría registrar?",
"body": "Elige las áreas que te interesan. El panel y los recordatorios se ajustarán a tu elección.",
"helpHint": "Una a tres prioridades suelen funcionar mejor — siempre podrás añadir más más adelante.",
"placeholder": "Selección de objetivos próximamente.",
"options": {
"weightManagement": "Control del peso",
"bpTracking": "Presión arterial",
@@ -1479,7 +1319,6 @@
"source": {
"title": "Conectar una fuente",
"body": "Importa las mediciones automáticamente o sigue con la entrada manual, tú decides.",
"placeholder": "Selector de fuente próximamente.",
"recommended": "Recomendado",
"manual": {
"title": "Entrada manual",
@@ -1500,7 +1339,6 @@
"baseline": {
"title": "Cuéntanos sobre ti",
"body": "Cuatro campos opcionales afinan los valores objetivo, el IMC y los recordatorios. Podrás ajustarlo todo más tarde desde Ajustes.",
"placeholder": "Entrada inicial próximamente.",
"displayNameLabel": "Nombre para mostrar",
"displayNamePlaceholder": "¿Cómo debería llamarte HealthLog?",
"displayNameHint": "Aparece en el saludo del panel y en los informes.",
@@ -2753,9 +2591,7 @@
"loadError": "Notification preferences could not be loaded.",
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Desactivado",
"eventPersonalRecord": "Récord personal",
"eventPersonalRecordDesc": "Notificación cuando se alcanza un nuevo récord en una métrica o entrenamiento. Desactivado por defecto."
"channelDisabled": "Desactivado"
},
"i18n": {
"maintainershipBanner": {
+8 -172
View File
@@ -218,8 +218,6 @@
"streakLabel": "days in a row",
"weight": "Poids",
"bloodPressure": "Tension artérielle",
"bloodPressureSys": "Blood Pressure (Sys)",
"bloodPressureDia": "Blood Pressure (Dia)",
"pulse": "Pouls",
"bodyFat": "Masse grasse",
"sleep": "Sommeil",
@@ -238,7 +236,6 @@
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "TA-cible",
"medications": "Médicaments",
"insightsPreview": "AI Insights preview",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"compliance7d": "Compliance (7 days)",
@@ -629,8 +626,7 @@
"missedLast30": "Manquées (30 j.)",
"unit": {
"days": "j.",
"doses": "doses",
"percent": "%"
"doses": "doses"
},
"chips": {
"adherenceTooltip": "Part des doses prises sur les 30 derniers jours (les doses sautées sont exclues du dénominateur).",
@@ -651,7 +647,6 @@
"ceilingMessage": "Vous êtes au sommet du palier standard.",
"escalationDueHint": "Vous êtes à ce palier depuis {weeks} semaines ; le schéma prévoit une progression typique après ~{typical} semaines.",
"currentStepDwell": "À ce palier depuis {weeks} semaines",
"weeksUnit": "sem.",
"doseUnitMg": "mg",
"emptyState": "Aucun historique de dose. Enregistrez une dose pour voir votre position dans le schéma.",
"nonStandardDose": "La dose actuelle est en dehors des paliers standard.",
@@ -704,7 +699,6 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Actions",
"pageInfo": "Page {page} de{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
@@ -738,29 +732,20 @@
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzépatide",
"class": "Agoniste double GIP-GLP-1"
"name": "Tirzépatide"
},
"semaglutide": {
"name": "Sémaglutide",
"class": "Agoniste du récepteur GLP-1"
"name": "Sémaglutide"
},
"liraglutide": {
"name": "Liraglutide",
"class": "Agoniste du récepteur GLP-1"
"name": "Liraglutide"
},
"dulaglutide": {
"name": "Dulaglutide",
"class": "Agoniste du récepteur GLP-1"
"name": "Dulaglutide"
},
"exenatide": {
"name": "Exénatide",
"class": "Agoniste du récepteur GLP-1"
"name": "Exénatide"
}
},
"source": {
"ema": "Source EMA",
"psp4": "Pharmacométrie évaluée par les pairs"
}
},
"researchMode": {
@@ -830,10 +815,6 @@
"trend": "Tendance",
"perWeek": "/week",
"totalDelta": "Total",
"selectMedication": "Select medication",
"noComplianceData": "No compliance data available",
"history": "Historique",
"complianceDays90": "Compliance (90 days)",
"colorGreen": "Green:",
"colorOrange": "Orange:",
"colorRed": "Red:",
@@ -968,10 +949,6 @@
"confidenceMittel": "Medium",
"confidenceGering": "Low",
"loadError": "Failed to load insights",
"generationFailed": "The analysis couldn't be generated. Please try again.",
"title": "Analyses",
"subtitle": "AI-powered analysis of your health data",
"overviewSubtitle": "Trends, risks, progress at a glance",
"heroGenerated": "Generated {time}",
"heroPersonalBaseline": "Based on your last 90 days",
"heroRegenerate": "Regenerate",
@@ -985,7 +962,6 @@
"heroComingSoonTooltip": "Coming soon",
"heroActionWeeklyReport": "Generate weekly report",
"heroActionAskCoach": "Ask the coach",
"heroActionRerun": "Re-run analysis",
"heroBanner": {
"ready": "Your {week} report is ready",
"read": "Read",
@@ -1005,8 +981,6 @@
"componentMood": "Humeur",
"componentCompliance": "Meds",
"disclaimer": "Indicative — not a clinical assessment.",
"askCoach": "Ask the Coach",
"coachPrompt": "Why is my health score {score} out of 100?",
"provenance": {
"toggle": "Composé de",
"weightLabel": "part",
@@ -1179,13 +1153,10 @@
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min."
},
"viewAll": "View all",
"previewEmpty": "No recommendations yet.",
"relativeJustNow": "just now",
"relativeMinutesAgo": "{count} minutes ago",
"relativeHoursAgo": "{count} hours ago",
"relativeDaysAgo": "{count} days ago",
"navGeneral": "General",
"navOverview": "Vue d'ensemble",
"navBloodPressure": "Tension artérielle",
"navWeight": "Poids",
@@ -1234,38 +1205,7 @@
"action": "Manage devices"
}
},
"measurementsOverDays": "{count} measurements over {days} days",
"healthStatus": "Health Status",
"noWeightData": "No weight data or height not set.",
"notEnoughBpData": "Not enough blood pressure data.",
"bpTargetRange": "BP Target Range",
"inTargetRange": "in target range",
"bpTarget": "Target: {range}",
"noDobSet": "Date of birth not set.",
"avg30dEsc": "30d average · ESH 2023",
"whoClassification": "WHO Classification",
"correlations": "Correlations",
"weightVsBp": "Weight vs. Blood Pressure (Systolic)",
"strengthStrong": "Strong correlation",
"strengthModerate": "Moderate correlation",
"strengthWeak": "Weak correlation",
"strengthNone": "No correlation",
"weightBpStrong": "There is a strong correlation between weight and blood pressure.",
"weightBpModerate": "There is a moderate correlation between weight and blood pressure.",
"weightBpWeak": "There is a weak correlation between weight and blood pressure.",
"weightBpNone": "No discernible correlation between weight and blood pressure.",
"notEnoughCorrelationData": "Not enough data for correlation analysis.",
"minCorrelationData": "At least 5 time-matched weight and blood pressure measurements needed.",
"bpMedContinuity": "BP Medication Continuity vs. Blood Pressure (Systolic)",
"continuityLabel": "Continuity",
"continuityBpLabel": "BP Medication Continuity (%)",
"weightKgLabel": "Weight (kg)",
"bpMedNegative": "Negative correlation: higher continuity tends to be associated with lower systolic blood pressure.",
"bpMedPositive": "Positive correlation: higher continuity tends to be associated with higher systolic blood pressure in your data.",
"bpMedNone": "No discernible correlation in your data.",
"bpMedCount": "{count} BP medications",
"notEnoughMedData": "Not enough data for this analysis.",
"notEnoughMedDataHint": "Tag medications as blood pressure medications and record sufficient intakes + blood pressure measurements.",
"medicationCompliance": "Medication Compliance",
"dayStreak": "{count} day streak",
"compliance7d": "7-day compliance",
@@ -1273,11 +1213,6 @@
"taken": "Pris",
"skipped": "Sauté",
"missed": "Manqué",
"complianceTrend": "Compliance Trend",
"generalStatusTitle": "General Health Status",
"generalStatusLoading": "Generating general status...",
"generalStatusNoKey": "The general status cannot be generated because no OpenAI key is configured.",
"generalStatusUnavailable": "The general status is currently unavailable.",
"generalStatusBadge": {
"good": "Bien",
"watch": "Watch",
@@ -1285,70 +1220,14 @@
},
"assessmentTitle": "Assessment",
"bloodPressureSectionTitle": "Tension artérielle",
"bloodPressureMedicationListTitle": "Blood Pressure Medication & Compliance",
"bloodPressureMedicationListEmpty": "No active blood pressure medication configured.",
"bloodPressureStatusLoading": "Generating blood pressure summary...",
"bloodPressureStatusNoKey": "The blood pressure summary cannot be generated because no OpenAI key is configured.",
"bloodPressureStatusUnavailable": "The blood pressure summary is currently unavailable.",
"weightSectionTitle": "Poids",
"weightStatusLoading": "Generating weight summary...",
"weightStatusNoKey": "The weight summary cannot be generated because no OpenAI key is configured.",
"weightStatusUnavailable": "The weight summary is currently unavailable.",
"pulseSectionTitle": "Pouls",
"pulseStatusLoading": "Generating pulse summary...",
"pulseStatusNoKey": "The pulse summary cannot be generated because no OpenAI key is configured.",
"pulseStatusUnavailable": "The pulse summary is currently unavailable.",
"bmiSectionTitle": "IMC",
"bmiStatusLoading": "Generating BMI summary...",
"bmiStatusNoKey": "The BMI summary cannot be generated because no OpenAI key is configured.",
"bmiStatusUnavailable": "The BMI summary is currently unavailable.",
"medicationComplianceStatusLoading": "Generating medication compliance text...",
"medicationComplianceStatusNoKey": "The medication compliance text cannot be generated because no OpenAI key is configured.",
"medicationComplianceStatusUnavailable": "The medication compliance text is currently unavailable.",
"complianceNoData": "No compliance data available.",
"aiInsights": "AI Insights",
"configureApiKey": "Configure an OpenAI API key in Settings to get AI-powered insights.",
"alertsTitle": "Notes & Recommendations",
"showLess": "Show less",
"showMore": "+{count} more",
"generate": "Generate new analysis",
"generating": "Generating analysis...",
"lastGenerated": "Last analysis",
"noInsights": "No analysis available yet.",
"rateLimit": "Please wait before generating a new analysis.",
"noApiKey": "Please add an OpenAI API key in Settings first.",
"sendRawData": "Send raw data",
"minMoodCorrelationData": "At least 5 temporally matched mood and measurement data points required.",
"moodBpModerate": "There is a moderate correlation between mood and blood pressure.",
"moodBpNone": "No detectable correlation between mood and blood pressure.",
"moodBpStrong": "There is a strong correlation between mood and blood pressure.",
"moodBpWeak": "There is a weak correlation between mood and blood pressure.",
"moodScoreLabel": "Mood (avg)",
"moodSectionTitle": "Humeur",
"moodStatusLoading": "Generating mood analysis...",
"moodStatusNoKey": "Mood summary cannot be generated because no OpenAI API key is configured.",
"moodStatusUnavailable": "Mood analysis unavailable",
"moodVsBp": "Mood vs. Blood Pressure (Systolic)",
"moodVsPulse": "Mood vs. Pulse",
"moodVsWeight": "Mood vs. Weight",
"moodWeightModerate": "There is a moderate correlation between mood and weight.",
"moodWeightNone": "No detectable correlation between mood and weight.",
"moodWeightStrong": "There is a strong correlation between mood and weight.",
"moodWeightWeak": "There is a weak correlation between mood and weight.",
"notEnoughMoodCorrelationData": "Not enough mood data for correlation analysis.",
"refreshButton": "Refresh",
"generateButton": "Generate",
"analyzing": "Analyzing health data...",
"confidence": "Confidence",
"confidence_niedrig": "low",
"confidence_mittel": "medium",
"confidence_hoch": "high",
"cached": "Cached",
"sectionChanged": "What has changed",
"sectionStable": "What is stable",
"sectionDrivers": "Possible correlations",
"sectionNextSteps": "Next steps",
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
"cached": "Cached"
},
"thresholds": {
"defaultLabel": "Default",
@@ -1382,45 +1261,7 @@
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"errorProfile": "Could not save your profile. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
"stepOf": "Step {current} de{total}",
"back": "Retour",
"continue": "Continuer",
"finish": "Finish setup",
"skipStep": "Skip this step — you can finish setup later from Settings.",
"step1": {
"title": "About you",
"description": "Used for blood-pressure targets, BMI, and the right reminders.",
"displayNameLabel": "Display name",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
"languageLabel": "Langue",
"languageHint": "We'll use this for the app, PDFs, and notifications."
},
"step2": {
"title": "Log your first measurement",
"description": "Weight, blood pressure, or pulse — whatever you have right now. The dashboard comes alive with one entry.",
"added": "Got it — you can add more anytime from the dashboard.",
"skipHint": "No measurement at hand? Skip and log one when you're ready."
},
"step3": {
"title": "Pick one notification channel",
"description": "We'll only send what you ask for. You can add more channels or fine-tune events later.",
"channelTelegramTitle": "Telegram bot",
"channelTelegramHint": "Reminders with snooze buttons inside Telegram.",
"channelWebPushTitle": "Web Push",
"channelWebPushHint": "Native browser notifications on this device.",
"channelNtfyTitle": "ntfy.sh",
"channelNtfyHint": "Open-source push to phone or desktop, no account.",
"channelNoneTitle": "Skip for now",
"channelNoneHint": "I'll set up notifications later from Settings.",
"openSettings": "Continue in Settings"
},
"doneToast": "You're all set — welcome aboard."
},
"tour": {
"stepOf": "Step {current} de{total}",
"next": "Suivant",
@@ -1466,7 +1307,6 @@
"title": "Que souhaitez-vous suivre ?",
"body": "Sélectionnez les domaines qui comptent pour vous. Le tableau de bord et les rappels s'y adapteront.",
"helpHint": "Un à trois axes prioritaires fonctionnent généralement le mieux, mais vous pourrez en ajouter plus tard.",
"placeholder": "Sélection des objectifs à venir.",
"options": {
"weightManagement": "Gestion du poids",
"bpTracking": "Tension artérielle",
@@ -1479,7 +1319,6 @@
"source": {
"title": "Connecter une source",
"body": "Importez les mesures automatiquement ou conservez la saisie manuelle, c'est vous qui décidez.",
"placeholder": "Sélection de la source à venir.",
"recommended": "Recommandé",
"manual": {
"title": "Saisie manuelle",
@@ -1500,7 +1339,6 @@
"baseline": {
"title": "Quelques informations",
"body": "Quatre champs facultatifs affinent vos seuils cibles, l'IMC et les rappels. Tout reste modifiable plus tard dans les paramètres.",
"placeholder": "Saisie initiale à venir.",
"displayNameLabel": "Nom d'affichage",
"displayNamePlaceholder": "Comment HealthLog doit-il vous appeler ?",
"displayNameHint": "Apparaît dans le message d'accueil du tableau de bord et dans les rapports.",
@@ -2753,9 +2591,7 @@
"loadError": "Notification preferences could not be loaded.",
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Désactivé",
"eventPersonalRecord": "Record personnel",
"eventPersonalRecordDesc": "Notification lorsqu'un nouveau record est atteint pour une mesure ou un entraînement. Désactivé par défaut."
"channelDisabled": "Désactivé"
},
"i18n": {
"maintainershipBanner": {
+8 -172
View File
@@ -218,8 +218,6 @@
"streakLabel": "days in a row",
"weight": "Peso",
"bloodPressure": "Pressione arteriosa",
"bloodPressureSys": "Blood Pressure (Sys)",
"bloodPressureDia": "Blood Pressure (Dia)",
"pulse": "Polso",
"bodyFat": "Massa grassa",
"sleep": "Sonno",
@@ -238,7 +236,6 @@
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "PA-target",
"medications": "Farmaci",
"insightsPreview": "AI Insights preview",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"compliance7d": "Compliance (7 days)",
@@ -629,8 +626,7 @@
"missedLast30": "Mancate (30 g.)",
"unit": {
"days": "g.",
"doses": "dosi",
"percent": "%"
"doses": "dosi"
},
"chips": {
"adherenceTooltip": "Quota di dosi assunte negli ultimi 30 giorni (le dosi saltate sono escluse dal denominatore).",
@@ -651,7 +647,6 @@
"ceilingMessage": "Sei al gradino più alto della scala standard.",
"escalationDueHint": "Sei su questo gradino da {weeks} settimane; lo schema prevede un avanzamento tipico dopo ~{typical} settimane.",
"currentStepDwell": "Su questo gradino da {weeks} settimane",
"weeksUnit": "sett.",
"doseUnitMg": "mg",
"emptyState": "Nessuna cronologia delle dosi. Registra una dose per vedere la tua posizione sulla scala.",
"nonStandardDose": "La dose attuale è fuori dai gradini standard.",
@@ -704,7 +699,6 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Azioni",
"pageInfo": "Page {page} di{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
@@ -738,29 +732,20 @@
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tirzepatide",
"class": "Agonista duale GIP-GLP-1"
"name": "Tirzepatide"
},
"semaglutide": {
"name": "Semaglutide",
"class": "Agonista del recettore GLP-1"
"name": "Semaglutide"
},
"liraglutide": {
"name": "Liraglutide",
"class": "Agonista del recettore GLP-1"
"name": "Liraglutide"
},
"dulaglutide": {
"name": "Dulaglutide",
"class": "Agonista del recettore GLP-1"
"name": "Dulaglutide"
},
"exenatide": {
"name": "Exenatide",
"class": "Agonista del recettore GLP-1"
"name": "Exenatide"
}
},
"source": {
"ema": "Fonte EMA",
"psp4": "Farmacometria peer-reviewed"
}
},
"researchMode": {
@@ -830,10 +815,6 @@
"trend": "Tendenza",
"perWeek": "/week",
"totalDelta": "Totale",
"selectMedication": "Select medication",
"noComplianceData": "No compliance data available",
"history": "Cronologia",
"complianceDays90": "Compliance (90 days)",
"colorGreen": "Green:",
"colorOrange": "Orange:",
"colorRed": "Red:",
@@ -968,10 +949,6 @@
"confidenceMittel": "Medium",
"confidenceGering": "Low",
"loadError": "Failed to load insights",
"generationFailed": "The analysis couldn't be generated. Please try again.",
"title": "Analisi",
"subtitle": "AI-powered analysis of your health data",
"overviewSubtitle": "Trends, risks, progress at a glance",
"heroGenerated": "Generated {time}",
"heroPersonalBaseline": "Based on your last 90 days",
"heroRegenerate": "Regenerate",
@@ -985,7 +962,6 @@
"heroComingSoonTooltip": "Coming soon",
"heroActionWeeklyReport": "Generate weekly report",
"heroActionAskCoach": "Ask the coach",
"heroActionRerun": "Re-run analysis",
"heroBanner": {
"ready": "Your {week} report is ready",
"read": "Read",
@@ -1005,8 +981,6 @@
"componentMood": "Umore",
"componentCompliance": "Meds",
"disclaimer": "Indicative — not a clinical assessment.",
"askCoach": "Ask the Coach",
"coachPrompt": "Why is my health score {score} out of 100?",
"provenance": {
"toggle": "Composto da",
"weightLabel": "peso",
@@ -1179,13 +1153,10 @@
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min."
},
"viewAll": "View all",
"previewEmpty": "No recommendations yet.",
"relativeJustNow": "just now",
"relativeMinutesAgo": "{count} minutes ago",
"relativeHoursAgo": "{count} hours ago",
"relativeDaysAgo": "{count} days ago",
"navGeneral": "General",
"navOverview": "Panoramica",
"navBloodPressure": "Pressione arteriosa",
"navWeight": "Peso",
@@ -1234,38 +1205,7 @@
"action": "Manage devices"
}
},
"measurementsOverDays": "{count} measurements over {days} days",
"healthStatus": "Health Status",
"noWeightData": "No weight data or height not set.",
"notEnoughBpData": "Not enough blood pressure data.",
"bpTargetRange": "BP Target Range",
"inTargetRange": "in target range",
"bpTarget": "Target: {range}",
"noDobSet": "Date of birth not set.",
"avg30dEsc": "30d average · ESH 2023",
"whoClassification": "WHO Classification",
"correlations": "Correlations",
"weightVsBp": "Weight vs. Blood Pressure (Systolic)",
"strengthStrong": "Strong correlation",
"strengthModerate": "Moderate correlation",
"strengthWeak": "Weak correlation",
"strengthNone": "No correlation",
"weightBpStrong": "There is a strong correlation between weight and blood pressure.",
"weightBpModerate": "There is a moderate correlation between weight and blood pressure.",
"weightBpWeak": "There is a weak correlation between weight and blood pressure.",
"weightBpNone": "No discernible correlation between weight and blood pressure.",
"notEnoughCorrelationData": "Not enough data for correlation analysis.",
"minCorrelationData": "At least 5 time-matched weight and blood pressure measurements needed.",
"bpMedContinuity": "BP Medication Continuity vs. Blood Pressure (Systolic)",
"continuityLabel": "Continuity",
"continuityBpLabel": "BP Medication Continuity (%)",
"weightKgLabel": "Weight (kg)",
"bpMedNegative": "Negative correlation: higher continuity tends to be associated with lower systolic blood pressure.",
"bpMedPositive": "Positive correlation: higher continuity tends to be associated with higher systolic blood pressure in your data.",
"bpMedNone": "No discernible correlation in your data.",
"bpMedCount": "{count} BP medications",
"notEnoughMedData": "Not enough data for this analysis.",
"notEnoughMedDataHint": "Tag medications as blood pressure medications and record sufficient intakes + blood pressure measurements.",
"medicationCompliance": "Medication Compliance",
"dayStreak": "{count} day streak",
"compliance7d": "7-day compliance",
@@ -1273,11 +1213,6 @@
"taken": "Assunta",
"skipped": "Saltata",
"missed": "Persa",
"complianceTrend": "Compliance Trend",
"generalStatusTitle": "General Health Status",
"generalStatusLoading": "Generating general status...",
"generalStatusNoKey": "The general status cannot be generated because no OpenAI key is configured.",
"generalStatusUnavailable": "The general status is currently unavailable.",
"generalStatusBadge": {
"good": "Bene",
"watch": "Watch",
@@ -1285,70 +1220,14 @@
},
"assessmentTitle": "Assessment",
"bloodPressureSectionTitle": "Pressione arteriosa",
"bloodPressureMedicationListTitle": "Blood Pressure Medication & Compliance",
"bloodPressureMedicationListEmpty": "No active blood pressure medication configured.",
"bloodPressureStatusLoading": "Generating blood pressure summary...",
"bloodPressureStatusNoKey": "The blood pressure summary cannot be generated because no OpenAI key is configured.",
"bloodPressureStatusUnavailable": "The blood pressure summary is currently unavailable.",
"weightSectionTitle": "Peso",
"weightStatusLoading": "Generating weight summary...",
"weightStatusNoKey": "The weight summary cannot be generated because no OpenAI key is configured.",
"weightStatusUnavailable": "The weight summary is currently unavailable.",
"pulseSectionTitle": "Polso",
"pulseStatusLoading": "Generating pulse summary...",
"pulseStatusNoKey": "The pulse summary cannot be generated because no OpenAI key is configured.",
"pulseStatusUnavailable": "The pulse summary is currently unavailable.",
"bmiSectionTitle": "IMC",
"bmiStatusLoading": "Generating BMI summary...",
"bmiStatusNoKey": "The BMI summary cannot be generated because no OpenAI key is configured.",
"bmiStatusUnavailable": "The BMI summary is currently unavailable.",
"medicationComplianceStatusLoading": "Generating medication compliance text...",
"medicationComplianceStatusNoKey": "The medication compliance text cannot be generated because no OpenAI key is configured.",
"medicationComplianceStatusUnavailable": "The medication compliance text is currently unavailable.",
"complianceNoData": "No compliance data available.",
"aiInsights": "AI Insights",
"configureApiKey": "Configure an OpenAI API key in Settings to get AI-powered insights.",
"alertsTitle": "Notes & Recommendations",
"showLess": "Show less",
"showMore": "+{count} more",
"generate": "Generate new analysis",
"generating": "Generating analysis...",
"lastGenerated": "Last analysis",
"noInsights": "No analysis available yet.",
"rateLimit": "Please wait before generating a new analysis.",
"noApiKey": "Please add an OpenAI API key in Settings first.",
"sendRawData": "Send raw data",
"minMoodCorrelationData": "At least 5 temporally matched mood and measurement data points required.",
"moodBpModerate": "There is a moderate correlation between mood and blood pressure.",
"moodBpNone": "No detectable correlation between mood and blood pressure.",
"moodBpStrong": "There is a strong correlation between mood and blood pressure.",
"moodBpWeak": "There is a weak correlation between mood and blood pressure.",
"moodScoreLabel": "Mood (avg)",
"moodSectionTitle": "Umore",
"moodStatusLoading": "Generating mood analysis...",
"moodStatusNoKey": "Mood summary cannot be generated because no OpenAI API key is configured.",
"moodStatusUnavailable": "Mood analysis unavailable",
"moodVsBp": "Mood vs. Blood Pressure (Systolic)",
"moodVsPulse": "Mood vs. Pulse",
"moodVsWeight": "Mood vs. Weight",
"moodWeightModerate": "There is a moderate correlation between mood and weight.",
"moodWeightNone": "No detectable correlation between mood and weight.",
"moodWeightStrong": "There is a strong correlation between mood and weight.",
"moodWeightWeak": "There is a weak correlation between mood and weight.",
"notEnoughMoodCorrelationData": "Not enough mood data for correlation analysis.",
"refreshButton": "Refresh",
"generateButton": "Generate",
"analyzing": "Analyzing health data...",
"confidence": "Confidence",
"confidence_niedrig": "low",
"confidence_mittel": "medium",
"confidence_hoch": "high",
"cached": "Cached",
"sectionChanged": "What has changed",
"sectionStable": "What is stable",
"sectionDrivers": "Possible correlations",
"sectionNextSteps": "Next steps",
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
"cached": "Cached"
},
"thresholds": {
"defaultLabel": "Default",
@@ -1382,45 +1261,7 @@
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"errorProfile": "Could not save your profile. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
"stepOf": "Step {current} di{total}",
"back": "Indietro",
"continue": "Continua",
"finish": "Finish setup",
"skipStep": "Skip this step — you can finish setup later from Settings.",
"step1": {
"title": "About you",
"description": "Used for blood-pressure targets, BMI, and the right reminders.",
"displayNameLabel": "Display name",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
"languageLabel": "Lingua",
"languageHint": "We'll use this for the app, PDFs, and notifications."
},
"step2": {
"title": "Log your first measurement",
"description": "Weight, blood pressure, or pulse — whatever you have right now. The dashboard comes alive with one entry.",
"added": "Got it — you can add more anytime from the dashboard.",
"skipHint": "No measurement at hand? Skip and log one when you're ready."
},
"step3": {
"title": "Pick one notification channel",
"description": "We'll only send what you ask for. You can add more channels or fine-tune events later.",
"channelTelegramTitle": "Telegram bot",
"channelTelegramHint": "Reminders with snooze buttons inside Telegram.",
"channelWebPushTitle": "Web Push",
"channelWebPushHint": "Native browser notifications on this device.",
"channelNtfyTitle": "ntfy.sh",
"channelNtfyHint": "Open-source push to phone or desktop, no account.",
"channelNoneTitle": "Skip for now",
"channelNoneHint": "I'll set up notifications later from Settings.",
"openSettings": "Continue in Settings"
},
"doneToast": "You're all set — welcome aboard."
},
"tour": {
"stepOf": "Step {current} di{total}",
"next": "Avanti",
@@ -1466,7 +1307,6 @@
"title": "Cosa vuoi monitorare?",
"body": "Scegli gli ambiti che ti interessano. Dashboard e promemoria si adatteranno alle tue scelte.",
"helpHint": "Da una a tre priorità funzionano di solito meglio — potrai aggiungerne altre in qualsiasi momento.",
"placeholder": "Selezione degli obiettivi in arrivo.",
"options": {
"weightManagement": "Gestione del peso",
"bpTracking": "Pressione arteriosa",
@@ -1479,7 +1319,6 @@
"source": {
"title": "Connetti una sorgente",
"body": "Importa le misurazioni in automatico oppure resta sull'inserimento manuale, decidi tu.",
"placeholder": "Selettore di sorgente in arrivo.",
"recommended": "Consigliato",
"manual": {
"title": "Inserimento manuale",
@@ -1500,7 +1339,6 @@
"baseline": {
"title": "Qualcosa su di te",
"body": "Quattro campi facoltativi affinano gli intervalli, l'IMC e i promemoria. Puoi modificarli tutti in qualsiasi momento dalle impostazioni.",
"placeholder": "Inserimento iniziale in arrivo.",
"displayNameLabel": "Nome visualizzato",
"displayNamePlaceholder": "Come deve chiamarti HealthLog?",
"displayNameHint": "Compare nel saluto della dashboard e nei report.",
@@ -2753,9 +2591,7 @@
"loadError": "Notification preferences could not be loaded.",
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Disabilitato",
"eventPersonalRecord": "Record personale",
"eventPersonalRecordDesc": "Notifica quando viene raggiunto un nuovo record per una metrica o un allenamento. Disattivato per impostazione predefinita."
"channelDisabled": "Disabilitato"
},
"i18n": {
"maintainershipBanner": {
+8 -172
View File
@@ -218,8 +218,6 @@
"streakLabel": "days in a row",
"weight": "Waga",
"bloodPressure": "Ciśnienie krwi",
"bloodPressureSys": "Blood Pressure (Sys)",
"bloodPressureDia": "Blood Pressure (Dia)",
"pulse": "Tętno",
"bodyFat": "Tkanka tłuszczowa",
"sleep": "Sen",
@@ -238,7 +236,6 @@
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "RR-cel",
"medications": "Leki",
"insightsPreview": "AI Insights preview",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"compliance7d": "Compliance (7 days)",
@@ -629,8 +626,7 @@
"missedLast30": "Pominięte (30 d.)",
"unit": {
"days": "d.",
"doses": "dawek",
"percent": "%"
"doses": "dawek"
},
"chips": {
"adherenceTooltip": "Udział dawek przyjętych w ostatnich 30 dniach (pominięte dawki są wyłączone z mianownika).",
@@ -651,7 +647,6 @@
"ceilingMessage": "Jesteś na najwyższym stopniu schematu standardowego.",
"escalationDueHint": "Jesteś na tym stopniu od {weeks} tygodni; schemat zwykle przewiduje przejście wyżej po ~{typical} tygodniach.",
"currentStepDwell": "Na tym stopniu od {weeks} tygodni",
"weeksUnit": "tyg.",
"doseUnitMg": "mg",
"emptyState": "Brak historii dawek. Zarejestruj dawkę, aby zobaczyć swoją pozycję w schemacie.",
"nonStandardDose": "Aktualna dawka jest poza standardowymi stopniami schematu.",
@@ -704,7 +699,6 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Akcje",
"pageInfo": "Page {page} z{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
@@ -738,29 +732,20 @@
"glp1": {
"drug": {
"tirzepatide": {
"name": "Tyrzepatyd",
"class": "Podwójny agonista GIP-GLP-1"
"name": "Tyrzepatyd"
},
"semaglutide": {
"name": "Semaglutyd",
"class": "Agonista receptora GLP-1"
"name": "Semaglutyd"
},
"liraglutide": {
"name": "Liraglutyd",
"class": "Agonista receptora GLP-1"
"name": "Liraglutyd"
},
"dulaglutide": {
"name": "Dulaglutyd",
"class": "Agonista receptora GLP-1"
"name": "Dulaglutyd"
},
"exenatide": {
"name": "Eksenatyd",
"class": "Agonista receptora GLP-1"
"name": "Eksenatyd"
}
},
"source": {
"ema": "Źródło EMA",
"psp4": "Farmakometria recenzowana"
}
},
"researchMode": {
@@ -830,10 +815,6 @@
"trend": "Trend",
"perWeek": "/week",
"totalDelta": "Łącznie",
"selectMedication": "Select medication",
"noComplianceData": "No compliance data available",
"history": "Historia",
"complianceDays90": "Compliance (90 days)",
"colorGreen": "Green:",
"colorOrange": "Orange:",
"colorRed": "Red:",
@@ -968,10 +949,6 @@
"confidenceMittel": "Medium",
"confidenceGering": "Low",
"loadError": "Failed to load insights",
"generationFailed": "The analysis couldn't be generated. Please try again.",
"title": "Statystyki",
"subtitle": "AI-powered analysis of your health data",
"overviewSubtitle": "Trends, risks, progress at a glance",
"heroGenerated": "Generated {time}",
"heroPersonalBaseline": "Based on your last 90 days",
"heroRegenerate": "Regenerate",
@@ -985,7 +962,6 @@
"heroComingSoonTooltip": "Coming soon",
"heroActionWeeklyReport": "Generate weekly report",
"heroActionAskCoach": "Ask the coach",
"heroActionRerun": "Re-run analysis",
"heroBanner": {
"ready": "Your {week} report is ready",
"read": "Read",
@@ -1005,8 +981,6 @@
"componentMood": "Nastrój",
"componentCompliance": "Meds",
"disclaimer": "Indicative — not a clinical assessment.",
"askCoach": "Ask the Coach",
"coachPrompt": "Why is my health score {score} out of 100?",
"provenance": {
"toggle": "Składa się z",
"weightLabel": "udział",
@@ -1179,13 +1153,10 @@
"providerRateLimitTitle": "Provider rate-limited",
"providerRateLimitBody": "Provider temporarily rate-limited; retry in ~5 min."
},
"viewAll": "View all",
"previewEmpty": "No recommendations yet.",
"relativeJustNow": "just now",
"relativeMinutesAgo": "{count} minutes ago",
"relativeHoursAgo": "{count} hours ago",
"relativeDaysAgo": "{count} days ago",
"navGeneral": "General",
"navOverview": "Przegląd",
"navBloodPressure": "Ciśnienie krwi",
"navWeight": "Waga",
@@ -1234,38 +1205,7 @@
"action": "Manage devices"
}
},
"measurementsOverDays": "{count} measurements over {days} days",
"healthStatus": "Health Status",
"noWeightData": "No weight data or height not set.",
"notEnoughBpData": "Not enough blood pressure data.",
"bpTargetRange": "BP Target Range",
"inTargetRange": "in target range",
"bpTarget": "Target: {range}",
"noDobSet": "Date of birth not set.",
"avg30dEsc": "30d average · ESH 2023",
"whoClassification": "WHO Classification",
"correlations": "Correlations",
"weightVsBp": "Weight vs. Blood Pressure (Systolic)",
"strengthStrong": "Strong correlation",
"strengthModerate": "Moderate correlation",
"strengthWeak": "Weak correlation",
"strengthNone": "No correlation",
"weightBpStrong": "There is a strong correlation between weight and blood pressure.",
"weightBpModerate": "There is a moderate correlation between weight and blood pressure.",
"weightBpWeak": "There is a weak correlation between weight and blood pressure.",
"weightBpNone": "No discernible correlation between weight and blood pressure.",
"notEnoughCorrelationData": "Not enough data for correlation analysis.",
"minCorrelationData": "At least 5 time-matched weight and blood pressure measurements needed.",
"bpMedContinuity": "BP Medication Continuity vs. Blood Pressure (Systolic)",
"continuityLabel": "Continuity",
"continuityBpLabel": "BP Medication Continuity (%)",
"weightKgLabel": "Weight (kg)",
"bpMedNegative": "Negative correlation: higher continuity tends to be associated with lower systolic blood pressure.",
"bpMedPositive": "Positive correlation: higher continuity tends to be associated with higher systolic blood pressure in your data.",
"bpMedNone": "No discernible correlation in your data.",
"bpMedCount": "{count} BP medications",
"notEnoughMedData": "Not enough data for this analysis.",
"notEnoughMedDataHint": "Tag medications as blood pressure medications and record sufficient intakes + blood pressure measurements.",
"medicationCompliance": "Medication Compliance",
"dayStreak": "{count} day streak",
"compliance7d": "7-day compliance",
@@ -1273,11 +1213,6 @@
"taken": "Przyjęte",
"skipped": "Pominięte",
"missed": "Pominięte",
"complianceTrend": "Compliance Trend",
"generalStatusTitle": "General Health Status",
"generalStatusLoading": "Generating general status...",
"generalStatusNoKey": "The general status cannot be generated because no OpenAI key is configured.",
"generalStatusUnavailable": "The general status is currently unavailable.",
"generalStatusBadge": {
"good": "Dobrze",
"watch": "Watch",
@@ -1285,70 +1220,14 @@
},
"assessmentTitle": "Assessment",
"bloodPressureSectionTitle": "Ciśnienie krwi",
"bloodPressureMedicationListTitle": "Blood Pressure Medication & Compliance",
"bloodPressureMedicationListEmpty": "No active blood pressure medication configured.",
"bloodPressureStatusLoading": "Generating blood pressure summary...",
"bloodPressureStatusNoKey": "The blood pressure summary cannot be generated because no OpenAI key is configured.",
"bloodPressureStatusUnavailable": "The blood pressure summary is currently unavailable.",
"weightSectionTitle": "Waga",
"weightStatusLoading": "Generating weight summary...",
"weightStatusNoKey": "The weight summary cannot be generated because no OpenAI key is configured.",
"weightStatusUnavailable": "The weight summary is currently unavailable.",
"pulseSectionTitle": "Tętno",
"pulseStatusLoading": "Generating pulse summary...",
"pulseStatusNoKey": "The pulse summary cannot be generated because no OpenAI key is configured.",
"pulseStatusUnavailable": "The pulse summary is currently unavailable.",
"bmiSectionTitle": "BMI",
"bmiStatusLoading": "Generating BMI summary...",
"bmiStatusNoKey": "The BMI summary cannot be generated because no OpenAI key is configured.",
"bmiStatusUnavailable": "The BMI summary is currently unavailable.",
"medicationComplianceStatusLoading": "Generating medication compliance text...",
"medicationComplianceStatusNoKey": "The medication compliance text cannot be generated because no OpenAI key is configured.",
"medicationComplianceStatusUnavailable": "The medication compliance text is currently unavailable.",
"complianceNoData": "No compliance data available.",
"aiInsights": "AI Insights",
"configureApiKey": "Configure an OpenAI API key in Settings to get AI-powered insights.",
"alertsTitle": "Notes & Recommendations",
"showLess": "Show less",
"showMore": "+{count} more",
"generate": "Generate new analysis",
"generating": "Generating analysis...",
"lastGenerated": "Last analysis",
"noInsights": "No analysis available yet.",
"rateLimit": "Please wait before generating a new analysis.",
"noApiKey": "Please add an OpenAI API key in Settings first.",
"sendRawData": "Send raw data",
"minMoodCorrelationData": "At least 5 temporally matched mood and measurement data points required.",
"moodBpModerate": "There is a moderate correlation between mood and blood pressure.",
"moodBpNone": "No detectable correlation between mood and blood pressure.",
"moodBpStrong": "There is a strong correlation between mood and blood pressure.",
"moodBpWeak": "There is a weak correlation between mood and blood pressure.",
"moodScoreLabel": "Mood (avg)",
"moodSectionTitle": "Nastrój",
"moodStatusLoading": "Generating mood analysis...",
"moodStatusNoKey": "Mood summary cannot be generated because no OpenAI API key is configured.",
"moodStatusUnavailable": "Mood analysis unavailable",
"moodVsBp": "Mood vs. Blood Pressure (Systolic)",
"moodVsPulse": "Mood vs. Pulse",
"moodVsWeight": "Mood vs. Weight",
"moodWeightModerate": "There is a moderate correlation between mood and weight.",
"moodWeightNone": "No detectable correlation between mood and weight.",
"moodWeightStrong": "There is a strong correlation between mood and weight.",
"moodWeightWeak": "There is a weak correlation between mood and weight.",
"notEnoughMoodCorrelationData": "Not enough mood data for correlation analysis.",
"refreshButton": "Refresh",
"generateButton": "Generate",
"analyzing": "Analyzing health data...",
"confidence": "Confidence",
"confidence_niedrig": "low",
"confidence_mittel": "medium",
"confidence_hoch": "high",
"cached": "Cached",
"sectionChanged": "What has changed",
"sectionStable": "What is stable",
"sectionDrivers": "Possible correlations",
"sectionNextSteps": "Next steps",
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
"cached": "Cached"
},
"thresholds": {
"defaultLabel": "Default",
@@ -1382,45 +1261,7 @@
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"errorProfile": "Could not save your profile. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
"stepOf": "Step {current} z{total}",
"back": "Wstecz",
"continue": "Kontynuuj",
"finish": "Finish setup",
"skipStep": "Skip this step — you can finish setup later from Settings.",
"step1": {
"title": "About you",
"description": "Used for blood-pressure targets, BMI, and the right reminders.",
"displayNameLabel": "Display name",
"displayNameHint": "Shown on the dashboard greeting and in reports.",
"languageLabel": "Język",
"languageHint": "We'll use this for the app, PDFs, and notifications."
},
"step2": {
"title": "Log your first measurement",
"description": "Weight, blood pressure, or pulse — whatever you have right now. The dashboard comes alive with one entry.",
"added": "Got it — you can add more anytime from the dashboard.",
"skipHint": "No measurement at hand? Skip and log one when you're ready."
},
"step3": {
"title": "Pick one notification channel",
"description": "We'll only send what you ask for. You can add more channels or fine-tune events later.",
"channelTelegramTitle": "Telegram bot",
"channelTelegramHint": "Reminders with snooze buttons inside Telegram.",
"channelWebPushTitle": "Web Push",
"channelWebPushHint": "Native browser notifications on this device.",
"channelNtfyTitle": "ntfy.sh",
"channelNtfyHint": "Open-source push to phone or desktop, no account.",
"channelNoneTitle": "Skip for now",
"channelNoneHint": "I'll set up notifications later from Settings.",
"openSettings": "Continue in Settings"
},
"doneToast": "You're all set — welcome aboard."
},
"tour": {
"stepOf": "Step {current} z{total}",
"next": "Dalej",
@@ -1466,7 +1307,6 @@
"title": "Co chcesz śledzić?",
"body": "Wybierz obszary, które są dla Ciebie ważne. Pulpit i przypomnienia dostosują się do Twojego wyboru.",
"helpHint": "Od jednego do trzech priorytetów zwykle sprawdza się najlepiej — możesz dodać kolejne w dowolnej chwili.",
"placeholder": "Wybór celów wkrótce.",
"options": {
"weightManagement": "Kontrola wagi",
"bpTracking": "Ciśnienie",
@@ -1479,7 +1319,6 @@
"source": {
"title": "Połącz źródło",
"body": "Pobieraj pomiary automatycznie lub zostań przy wpisywaniu ręcznym — Twój wybór.",
"placeholder": "Wybór źródła wkrótce.",
"recommended": "Polecane",
"manual": {
"title": "Wpis ręczny",
@@ -1500,7 +1339,6 @@
"baseline": {
"title": "Kilka słów o Tobie",
"body": "Cztery opcjonalne pola doprecyzują wartości docelowe, BMI i przypomnienia. Wszystko możesz później zmienić w ustawieniach.",
"placeholder": "Wprowadzenie pierwszego wpisu wkrótce.",
"displayNameLabel": "Nazwa wyświetlana",
"displayNamePlaceholder": "Jak HealthLog ma się do Ciebie zwracać?",
"displayNameHint": "Pojawia się w powitaniu na pulpicie i w raportach.",
@@ -2753,9 +2591,7 @@
"loadError": "Notification preferences could not be loaded.",
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Wyłączone",
"eventPersonalRecord": "Rekord osobisty",
"eventPersonalRecordDesc": "Powiadomienie po osiągnięciu nowego rekordu w metryce lub treningu. Domyślnie wyłączone."
"channelDisabled": "Wyłączone"
},
"i18n": {
"maintainershipBanner": {
@@ -1,6 +1,6 @@
import { describe, it, expect, vi } from "vitest";
import { describe, it, expect } from "vitest";
import { renderToStaticMarkup } from "react-dom/server";
import { I18nProvider, useTranslations } from "@/lib/i18n/context";
import { I18nProvider } from "@/lib/i18n/context";
import {
HealthScoreCard,
type HealthScoreCardProps,
@@ -10,9 +10,10 @@ import {
* v1.4.20 phase B5 — Personal Health Score card.
*
* SSR markup pins the slot wrappers so future polish can't silently
* drop the score number, sub-bars or disclaimer. The interactive
* "Ask the Coach" button is exercised through Testing Library so the
* prefill argument forwarded to the parent handler stays stable.
* drop the score number, sub-bars or disclaimer. The inline
* Ask-the-Coach button retired in v1.4.27 B1 — the hero strip
* carries the CTA. The negative-assertion test below pins that
* decision so a future revival has to update the test in lock-step.
*/
const baseComponents: HealthScoreCardProps["components"] = {
@@ -205,32 +206,6 @@ describe("<HealthScoreCard>", () => {
expect(supplied).not.toContain('data-slot="health-score-card-ask-coach"');
});
it("captures the score-aware prefill argument when the button is invoked", () => {
// The handler closure receives `t("insights.healthScore.coachPrompt", { score })`
// which interpolates the current score. We assert the closure shape by
// probing the i18n provider directly rather than wiring a DOM testing
// library — the component's onClick lambda is one line and its
// contract is the prefill string format, not the click plumbing.
let captured: string | null = null;
const onAskCoach = vi.fn((prefill: string) => {
captured = prefill;
});
function Probe() {
const { t } = useTranslations();
// Reproduce the same call the button's onClick performs.
onAskCoach(t("insights.healthScore.coachPrompt", { score: 86 }));
return null;
}
renderToStaticMarkup(
<I18nProvider initialLocale="en">
<Probe />
</I18nProvider>,
);
expect(onAskCoach).toHaveBeenCalledTimes(1);
expect(captured).toBe("Why is my health score 86 out of 100?");
});
it("renders German strings", () => {
const html = ssr(