chore(i18n): drop 380 dead translation keys flagged in W10 runtime probe

W10's i18n-runtime-gaps probe inventoried 405 unreferenced catalog keys
across both locale files. A second-pass verification against the source
tree (literal `"key"` / `'key'` / backtick exact-match) confirmed 380 of
them as truly orphan and 25 as live references the static analyser had
missed — typically built through template literals or wrapped in
non-string contexts.

This commit removes the 380 verified-dead keys from all six locale
files (en/de/fr/es/it/pl) and prunes the now-empty
`classifications.{bp,pulse,bodyFat}.*` placeholder allow-list entries
in `i18n-locale-integrity.test.ts` so the parity test passes against
the smaller surface.

Top namespaces retired:
  settings.*            (114 keys) — old setup screens, audit-log
                                     leaf labels, ai providerChain
                                     scaffolding
  classifications.*     (69 keys)  — alerts.* group + legacy per-metric
                                     leaf labels; live classification
                                     surfaces use targets.* now
  admin.*               (38 keys)  — superseded by admin/[section] shell
  onboarding.*          (21 keys)  — v1.4.22 onboarding rewrite leftovers
  medications.*         (18 keys)  — v1.4.18 redesign orphans
  dashboard.*           (15 keys)  — v1.4.20 insights redesign leftovers
  bugreport.*           (12 keys)  — simplified bug-report screen
  common.*              (12 keys)  — generic strings no longer referenced
  charts.*              (15 keys)  — v1.4.20 chart-label slugs
  auth.*                (10 keys)  — auth UI now uses inline copy
  notifications.*       (10 keys)  — toast variants no longer fired
  targets.*             (9 keys)   — replaced by targets.{label,status}.*
  measurements.*        (7 keys)
  comparison.*          (6 keys)
  mood.*                (5 keys)
  thresholds.*          (4 keys)
  achievements.*        (4 keys)
  format.*              (3 keys)
  gettingStarted.*      (2 keys)
  nav.*                 (1 key)

Verification:
  pnpm typecheck                  → clean
  pnpm lint                       → clean
  pnpm vitest run                 → 3731 passed, 1 skipped
  i18n-locale-integrity           → 26 / 26 (locales still parity-clean)
This commit is contained in:
Marc-André Bombeck committed 2026-05-14 21:40:13 +02:00
1 parent f16d4b3f0e
commit fddb975432
7 files changed
+42 -2626

No files matched your search

+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Schließen",
"loading": "Laden...",
"error": "Fehler",
"success": "Erfolgreich",
"saved": "Gespeichert",
"confirm": "Bestätigen",
"back": "Zurück",
"next": "Weiter",
"yes": "Ja",
"no": "Nein",
"search": "Suchen",
"filter": "Filtern",
"noData": "Keine Daten vorhanden",
"optional": "Optional",
"required": "Erforderlich",
"all": "Alle",
"active": "Aktiv",
"inactive": "Inaktiv",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"networkError": "Netzwerkfehler",
"unknownError": "Unbekannter Fehler",
"notLoggedIn": "Nicht angemeldet",
"noAccess": "Kein Zugriff",
"copied": "Kopiert!",
"or": "oder",
"unknown": "Unbekannt",
"replace": "Ersetzen",
"add": "Hinzufügen",
"import": "Importieren",
"test": "Test",
@@ -169,7 +157,6 @@
"dashboard": "Dashboard",
"measurements": "Messungen",
"medications": "Medikamente",
"charts": "Verlauf",
"insights": "Insights",
"targets": "Zielwerte",
"achievements": "Erfolge",
@@ -198,8 +185,6 @@
"auth": {
"login": "Anmelden",
"register": "Registrieren",
"loginTitle": "Anmeldung",
"registerTitle": "Registrierung",
"username": "Benutzername",
"password": "Passwort",
"email": "E-Mail-Adresse",
@@ -210,26 +195,17 @@
"loginWithPassword": "Mit Passwort anmelden",
"noAccount": "Noch kein Konto?",
"hasAccount": "Bereits ein Konto?",
"registerDisabled": "Registrierung ist deaktiviert.",
"loginFailed": "Anmeldung fehlgeschlagen",
"passkeyFailed": "Passkey-Anmeldung abgebrochen oder fehlgeschlagen",
"registerFailed": "Registrierung fehlgeschlagen",
"createAccount": "Konto erstellen",
"newAccount": "Neues Konto erstellen",
"backToPasskey": "Zurück zu Passkey",
"passkeySetupLater": "Passkeys kannst du jederzeit in den Einstellungen einrichten.",
"passwordMinLength": "Min. 12 Zeichen",
"passwordTooShort": "Passwort muss mindestens {minLength} Zeichen lang sein.",
"passwordStrength": "Passwortstärke",
"strengthWeak": "Sehr schwach",
"strengthFair": "Schwach",
"strengthGood": "Mittel",
"strengthStrong": "Stark",
"strengthVeryStrong": "Sehr stark"
"passwordTooShort": "Passwort muss mindestens {minLength} Zeichen lang sein."
},
"dashboard": {
"title": "Dashboard",
"subtitle": "Dein Gesundheitsüberblick",
"greeting": {
"morning": "Guten Morgen",
"day": "Hallo",
@@ -260,25 +236,13 @@
"stepsShort": "Schritte",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BD-Ziel",
"days30Short": "30T",
"medications": "Medikamente",
"insightsPreview": "KI-Insights-Vorschau",
"lastMeasurement": "Letzter Messwert",
"noMeasurements": "Noch keine Messwerte",
"trend": "Trend",
"trendUp": "steigend",
"trendDown": "fallend",
"trendStable": "stabil",
"quickEntry": "Schnelleingabe",
"quickAddMeasurement": "Messung erfassen",
"quickAddMood": "Stimmung erfassen",
"addMeasurement": "Messwert hinzufügen",
"compliance7d": "Einnahmetreue (7 Tage)",
"complianceGood": "Gut",
"complianceLow": "Niedrig",
"mood": "Stimmung",
"customizeTitle": "Dashboard-Layout",
"customizeSubtitle": "Wähle, welche Karten auf dem Dashboard angezeigt werden und in welcher Reihenfolge. Defaults funktionieren sofort.",
"layoutReset": "Auf Defaults zurücksetzen",
"layoutSaveSuccess": "Dashboard-Layout gespeichert",
"layoutSaveError": "Layout konnte nicht gespeichert werden",
@@ -297,11 +261,7 @@
"lastInjection": "Letzte Injektion",
"nextInjection": "Nächste Injektion",
"weightDelta": "seit Beginn",
"inDays": "in {count} Tagen",
"empty": {
"title": "Kein aktives GLP-1-Medikament",
"description": "Lege einen GLP-1-Rezeptoragonisten an (Mounjaro, Ozempic, Wegovy, …), um Dosis, Zeitplan und Gewichtsverlauf hier zu sehen."
}
"inDays": "in {count} Tagen"
}
},
"measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Messwert bearbeiten",
"type": "Typ",
"value": "Wert",
"unit": "Einheit",
"date": "Datum",
"source": "Quelle",
"notes": "Notizen",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Postprandial (2 h nach dem Essen)",
"glucoseContextRandom": "Beliebig / ohne Kontext",
"glucoseContextBedtime": "Vor dem Schlafen",
"glucoseUnit": "Blutzucker-Einheit",
"glucoseUnitHint": "Gespeichert in mg/dL; Anzeige-Einheit ist deine Präferenz.",
"unitHours": "Stunden",
"unitSteps": "Schritte",
"sourceManual": "Manuell",
@@ -371,7 +328,6 @@
"loginRequired": "Bitte anmelden, um Messwerte zu sehen.",
"allTypes": "Alle Typen",
"measurementCount": "{count} Messwerte",
"noMeasurements": "Keine Messwerte vorhanden",
"emptyTitle": "Noch keine Messwerte",
"emptyDescription": "Erfasse Gewicht, Blutdruck, Puls oder andere Werte, um Trends zu erkennen.",
"emptyFilteredTitle": "Kein Messwert passt zum Filter",
@@ -382,10 +338,7 @@
"actions": "Aktionen",
"deleteConfirmTitle": "Messwert löschen?",
"deleteConfirmDescription": "Dieser Messwert wird unwiderruflich gelöscht.",
"pageInfo": "Seite {page} von {total}",
"showing": "Zeigt",
"of": "von",
"entries": "Einträgen"
"pageInfo": "Seite {page} von {total}"
},
"mood": {
"title": "Stimmung",
@@ -404,14 +357,9 @@
"levelOkay": "Okay",
"levelSchlecht": "Schlecht",
"levelLausig": "Lausig",
"sourceManual": "Manuell",
"sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "Alle Stimmungen",
"entryCount": "{count} Einträge",
"noEntries": "Keine Stimmungseinträge vorhanden",
"emptyTitle": "Noch keine Stimmungseinträge",
"emptyDescription": "Erfasse, wie du dich heute fühlst, um Muster über die Zeit zu erkennen.",
"emptyFilteredTitle": "Kein Eintrag passt zum Filter",
@@ -436,34 +384,21 @@
"editMedication": "Medikament bearbeiten",
"newMedication": "Neues Medikament",
"firstMedication": "Erstes Medikament anlegen",
"noMedicationsYet": "Noch keine Medikamente angelegt",
"emptyTitle": "Noch keine Medikamente",
"emptyDescription": "Lege Medikamente, Dosierungen und Einnahmefenster an, um Compliance zu erfassen.",
"loadFailed": "Medikamente konnten nicht geladen werden",
"retryLoad": "Erneut laden",
"name": "Name",
"dose": "Dosis",
"doseAmount": "Menge",
"doseUnit": "Einheit",
"category": "Kategorie",
"schedule": "Zeitfenster",
"scheduleFrom": "Von",
"scheduleTo": "Bis",
"scheduleLabel": "Bezeichnung",
"scheduleDays": "Tage",
"scheduleDaily": "Täglich",
"active": "Aktiv",
"inactive": "Pausiert",
"intakeHistory": "Einnahme-Verlauf",
"showIntakeHistory": "Einnahme-Verlauf anzeigen",
"hideIntakeHistory": "Einnahme-Verlauf ausblenden",
"markTaken": "Eingenommen",
"markSkipped": "Übersprungen",
"deleteConfirm": "Medikament löschen?",
"deleteDescription": "Das Medikament und alle Einnahmen werden unwiderruflich gelöscht.",
"noMedications": "Keine Medikamente vorhanden.",
"compliance": "Einnahmetreue",
"import": "Import",
"importIntakes": "Einnahmen importieren",
"importDescription": "JSON-Array mit Einnahme-Daten einfügen. Erwartetes Format:",
"importUploadFile": "JSON-Datei hochladen",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} ungültige Einträge übersprungen",
"importFailed": "Import fehlgeschlagen",
"importInvalidFormat": "Ungültiges JSON-Format",
"apiAccess": "API-Zugang",
"apiEndpointTitle": "API-Endpoint: {name}",
"apiEndpointDescription": "Nutze diesen Endpoint, um Einnahmen per API zu erfassen (z.B. via iPhone-Kurzbefehl oder cron-Job).",
"apiEndpointActive": "API-Endpoint aktiv",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Status konnte nicht geladen werden",
"changeFailed": "Ändern fehlgeschlagen",
"categoryBloodPressure": "Blutdrucksenker",
"categoryCholesterol": "Cholesterin",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamine",
"categoryThyroid": "Schilddrüse",
"categoryHormone": "Hormone",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Einnahme-Eintrag löschen?",
"intakeDeleteDescription": "Dieser Einnahme-Eintrag wird unwiderruflich gelöscht.",
"intakeCount": "{count} Einnahmen",
"viewHistory": "Verlauf",
"today": "Heute",
"yesterday": "Gestern",
"tomorrow": "Morgen",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Dosen pro Pen / Ampulle",
"glp1DosesPerUnitPlaceholder": "z. B. 4 für einen Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — setzt die Reichweite-Anzeige im Dashboard frei. Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy Einmal-Pen = 1. Leer lassen, um die Bestandsverfolgung auszuschalten.",
"glp1Headline": "{name} · {dose}",
"glp1LastInjection": "Letzter Termin: {label}",
"glp1LastInjectionWithSite": "Letzter Termin: {label} · {site}",
"glp1NextInjection": "Nächster Termin: {label}",
"glp1NextInjectionDays": "Nächster Termin: {label} (in {days} Tagen)",
"glp1NextInjectionToday": "Nächster Termin: heute",
"glp1NextInjectionTomorrow": "Nächster Termin: morgen",
@@ -738,7 +667,6 @@
"siteThighRight": "Rechter Oberschenkel",
"siteUpperArmLeft": "Linker Oberarm",
"siteUpperArmRight": "Rechter Oberarm",
"sideEffectTagsLabel": "Häufige GLP-1-Nebenwirkungen",
"sideEffectTagsHelp": "Tippe einen Chip, um ihn zu den Mood-Tags hinzuzufügen.",
"sideEffectTagNausea": "Übelkeit",
"sideEffectTagConstipation": "Verstopfung",
@@ -774,12 +702,10 @@
"purgeError": "Fehler beim Löschen der Aufzeichnungen",
"invalidTimestamp": "Bitte einen gültigen Zeitpunkt wählen.",
"noIntakesYet": "Noch keine Einnahmen vorhanden",
"noIntakesForMedication": "Noch keine Einnahmen für",
"deleteIntakeAriaLabel": "Einnahme löschen",
"actions": "Aktionen",
"pageInfo": "Seite {page} von {total}",
"loginRequiredIntakes": "Bitte anmelden, um Einnahmen zu sehen.",
"clear": "Löschen",
"phaseConfig": "Erinnerungsphasen",
"phaseConfigDescription": "Konfiguriere die Zeitpunkte für Erinnerungen.",
"phaseGreen": "Grün",
@@ -872,24 +798,13 @@
}
},
"charts": {
"title": "Verlauf",
"subtitle": "Visualisierung deiner Gesundheitsdaten",
"timeRange": "Zeitraum",
"days7": "7 Tage",
"days30": "30 Tage",
"days90": "90 Tage",
"days365": "1 Jahr",
"daysAll": "Alle",
"weight": "Gewicht",
"bloodPressure": "Blutdruck",
"pulse": "Puls",
"bodyFat": "Körperfett",
"sleep": "Schlaf",
"steps": "Schritte",
"compliance": "Einnahmetreue",
"noData": "Keine Daten im gewählten Zeitraum",
"movingAverage": "Gleitender Durchschnitt",
"target": "Zielbereich",
"bucketWeekly": "Wochendurchschnitt",
"bucketMonthly": "Monatsdurchschnitt",
"points7Label": "7 Pkt",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "Allzeit",
"trend7dShort": "7-Tage-Trend",
"trend": "Trend",
"targetRanges": "Zielbereiche",
"perWeek": "/Woche",
"totalDelta": "Gesamt",
"selectMedication": "Medikament wählen",
@@ -923,7 +837,6 @@
"colorRed": "Rot:",
"mood": "Stimmung",
"moodScore": "Stimmungswert",
"moodMA": "7-Tage-Trend",
"moodLabel1": "Lausig",
"moodLabel2": "Schlecht",
"moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Dein Mittel",
"deltaVsBaseline": "{delta} vs. dein Mittel",
"deltaUnchanged": "entspricht deinem Mittel",
"targetWeight": "Ziel",
"deltaVsTarget": "{delta} vs. Ziel"
},
"chart": {
@@ -989,25 +901,15 @@
},
"captionLastMonth": "vs. Vormonat",
"captionLastYear": "vs. Vorjahr",
"delta": {
"improved": "{delta} besser",
"worsened": "{delta} schlechter",
"stable": "unverändert"
},
"deltaVs": {
"lastMonth": "{delta} vs. Vormonat",
"lastYear": "{delta} vs. Vorjahr"
},
"tooltipPrior": "Vorperiode",
"tooltipDelta": "Δ {delta}",
"unavailable": {
"lastMonth": "Vergleich nicht verfügbar — noch keine Daten aus dem Vormonat",
"lastYear": "Vergleich nicht verfügbar — noch keine Daten aus dem Vorjahr"
},
"insightsCallout": {
"lastMonth": "Vergleich zum Vormonat aktiv",
"lastYear": "Vergleich zum Vorjahr aktiv"
},
"notAvailableForCompliance": "Vergleich für Compliance nicht verfügbar"
},
"insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Klicke auf \"Generieren\" für KI-basierte Insights deiner Gesundheitsdaten."
},
"thresholds": {
"title": "Persönliche Zielwerte",
"subtitle": "Überschreibe den berechneten Zielbereich für jede Metrik. Ohne Eintrag gilt der Default.",
"defaultLabel": "Default",
"overrideLabel": "Dein Wert",
"autoModeLabel": "Auto",
"overrideModeLabel": "Überschrieben",
"resetAction": "Auf Default zurücksetzen",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Körperwasser",
"metricBoneMass": "Knochenmasse",
"metricOxygenSaturation": "Sauerstoffsättigung (SpO₂)",
"unsetExplanation": "Kein eigener Wert — berechneter Default aktiv.",
"loadError": "Zielwerte konnten nicht geladen werden"
"unsetExplanation": "Kein eigener Wert — berechneter Default aktiv."
},
"onboarding": {
"setupDescription": "Richte dein Profil ein, um loszulegen. Du kannst das auch später in den Einstellungen ändern.",
"completeSetup": "Einrichtung abschließen",
"skip": "Überspringen",
"medicationsTitle": "Nimmst du Medikamente?",
"medicationsDescription": "Füge deine Medikamente hinzu, um Erinnerungen und Compliance-Tracking zu nutzen.",
"medNamePlaceholder": "Name",
"medDosePlaceholder": "Dosis",
"notificationsTitle": "Erinnerungen",
"notificationsDescription": "HealthLog kann dich an deine Medikamente erinnern. Konfiguriere dies später in den Einstellungen.",
"telegramHint": "Erinnerungen per Telegram-Bot mit Snooze-Buttons",
"webPushHint": "Browser-Benachrichtigungen direkt auf dein Gerät",
"notificationsLater": "Du kannst dies jederzeit in den Einstellungen einrichten.",
"targetsTitle": "Zielwerte",
"targetsDescription": "Setze optionale Zielwerte für Blutdruck und Gewicht.",
"targetSys": "Systolisch (mmHg)",
"targetDia": "Diastolisch (mmHg)",
"targetWeight": "Zielgewicht (kg)",
"errorProfile": "Dein Profil konnte nicht gespeichert werden. Bitte versuche es erneut.",
"errorMedication": "Das Medikament „{name}\" konnte nicht angelegt werden. Bitte versuche es erneut oder lege es später unter „Medikamente\" an.",
"errorTargets": "Deine Zielwerte konnten nicht gespeichert werden. Bitte versuche es erneut.",
"errorGeneric": "Beim Abschluss des Setups ist etwas schiefgelaufen. Bitte versuche es erneut.",
"medScheduleHint": "Wir legen ein Standard-Erinnerungsfenster an (08:00–09:00 täglich). Du kannst es jederzeit unter „Medikamente\" anpassen.",
"v2": {
"title": "Willkommen bei HealthLog",
"subtitle": "Drei schnelle Schritte. Alles weitere kannst du später in den Einstellungen erledigen.",
@@ -1582,27 +1460,6 @@
"step3of4": "Schritt 3 von 4",
"step4of4": "Schritt 4 von 4"
},
"welcome": {
"title": "Willkommen bei HealthLog",
"carouselLabel": "Willkommen – drei Folien",
"slideOf": "Folie {current} von {total}",
"gotoSlide": "Zu Folie {index} wechseln",
"prevSlide": "Vorherige Folie",
"nextSlide": "Nächste Folie",
"slide1": {
"title": "Deine Gesundheitsdaten gehören dir",
"body": "HealthLog speichert deine Messwerte auf deiner Infrastruktur. Keine Werbung, keine Drittnutzung, kein Account-Zwang."
},
"slide2": {
"title": "Eine Ansicht für jede Quelle",
"body": "Apple Health, Withings und manuelle Einträge laufen in einem konsistenten Verlauf zusammen – inklusive Quellenpriorität pro Metrik."
},
"slide3": {
"title": "Coach und Insights mit Substanz",
"body": "Die KI-Auswertung stützt sich ausschließlich auf deine Werte und nennt jede Aussage mit Beleg. Bring-your-own-Key, keine Trainingsdaten."
},
"cta": "Loslegen"
},
"goals": {
"title": "Was möchtest du erfassen?",
"body": "Wähle die Bereiche, die dir wichtig sind. Dashboard und Erinnerungen richten sich danach.",
@@ -1669,10 +1526,8 @@
"title": "Erste Schritte",
"subtitle": "Quick Wins, damit du das Beste aus HealthLog herausholst.",
"progress": "{done} von {total} erledigt",
"dismiss": "Ausblenden",
"dismissAll": "Checkliste ausblenden",
"dismissTooltip": "Diesen Punkt ausblenden",
"restoreHint": "Du kannst die Checkliste in den Einstellungen wiederherstellen.",
"items": {
"profileTitle": "Profil einrichten",
"profileDescription": "Größe, Geburtsdatum und Geschlecht schalten personalisierte Zielwerte frei.",
@@ -1697,8 +1552,6 @@
"remainingMany": "Noch {count} Messungen bis zum Trend."
},
"settings": {
"title": "Einstellungen",
"subtitle": "Profil, Sicherheit & Verbindungen",
"researchMode": {
"sectionTitle": "Forschungsmodus",
"subtitle": "Optionale Anzeige einer geschätzten GLP-1-Wirkstoffkurve auf Basis der von der EMA veröffentlichten Populations-Pharmakokinetik. Nur zur Anschauung — niemals eine Messung oder ein medizinischer Rat.",
@@ -1841,18 +1694,9 @@
"coming_soon": "Wird mit dem nächsten Release-Update hierher umziehen."
}
},
"sectionsTitle": "Settings",
"categoryGeneral": "Allgemein",
"categoryNotifications": "Benachrichtigungen",
"categoryAi": "KI",
"categoryPersonalization": "Personalisierung",
"categoryIntegration": "Integration",
"categoryApi": "API",
"profile": "Profil",
"security": "Sicherheit",
"language": "Sprache",
"languageDescription": "Wähle die Anzeigesprache der Anwendung.",
"languageSystem": "System (automatisch)",
"username": "Benutzername",
"height": "Körpergröße (cm)",
"dateOfBirth": "Geburtsdatum",
@@ -1930,16 +1774,6 @@
"webPushActive": "Aktiv",
"kiInsights": "KI-Insights (OpenAI)",
"kiInsightsDescription": "Optional: Hinterlege deinen OpenAI-Key für tägliche, automatische KI-Auswertungen in den Insights.",
"kiInsightsBenefitsTitle": "Vorteile mit OpenAI-Key",
"kiInsightsBenefit1": "Tägliche Zusammenfassungen für allgemeinen Zustand, Blutdruck, Gewicht, Puls, BMI und Medikamenten-Compliance.",
"kiInsightsBenefit2": "Bessere Einordnung von Trends und Korrelationen auf Basis deiner letzten 30 Tagesmesspunkte pro Bereich.",
"kiInsightsBenefit3": "Automatische Aktualisierung im Hintergrund, damit die Insights-Seite immer aktuelle Bewertungen zeigt.",
"createApiKeyHint": "API-Key erstellen unter:",
"createApiKeyLinkLabel": "platform.openai.com/api-keys",
"apiKey": "API-Key",
"apiKeyStored": "Key hinterlegt — neuen eingeben zum Ersetzen",
"apiKeySaved": "API-Key gespeichert",
"apiKeyRemoved": "API-Key entfernt",
"codexConnected": "ChatGPT erfolgreich verbunden! KI-Insights sind jetzt aktiv.",
"codexDisconnected": "ChatGPT-Verbindung getrennt.",
"codexConnectionFailed": "ChatGPT-Verbindung fehlgeschlagen. Bitte versuche es erneut.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Bitte warte — du hast das stündliche Limit für Analysen erreicht.",
"lastGeneratedAt": "Zuletzt generiert",
"ai": {
"title": "KI-Insights",
"description": "Anbieter, Modell, Key.",
"chatgptConnectedBadge": "ChatGPT verbunden",
"adminAiActiveBadge": "Admin-KI aktiv",
"connectionExpiredBadge": "Verbindung abgelaufen",
"chatgptConnectedHeading": "ChatGPT verbunden",
"chatgptConnectedBody": "Insights werden über dein ChatGPT-Abo generiert — keine zusätzlichen Kosten.",
"connectedSince": "Verbunden seit {when}.",
"disconnect": "Trennen",
"connectChatgptHeading": "Mit ChatGPT verbinden",
"connectChatgptBody": "Verbinde dein ChatGPT Pro/Max-Konto um KI-gestützte Gesundheitsanalysen basierend auf aktuellen medizinischen Leitlinien zu erhalten. Keine zusätzlichen API-Kosten.",
"connectChatgptCta": "Mit ChatGPT verbinden",
"deviceCodeHeading": "Verbindung auf chatgpt.com abschließen",
"deviceCodeStep1": "Öffne diesen Link auf einem beliebigen Gerät:",
"deviceCodeStep2": "Gib diesen Einmalcode ein:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Warte auf Bestätigung…",
"deviceCodeCancel": "Abbrechen",
"oauthNotConfigured": "ChatGPT-OAuth ist auf dieser Instanz nicht konfiguriert — nutze stattdessen einen eigenen API-Key unten.",
"adminFallback": "Alternativ nutzt HealthLog den vom Administrator konfigurierten KI-Anbieter.",
"personalProviderHeading": "KI-Provider (persönlich)",
"personalProviderBody": "Eigener KI-Anbieter überschreibt die Admin-Einstellung. Leer lassen für Standard. Für ChatGPT-Pro/Max-OAuth nutze den Verbinden-Button oben.",
"providerLabel": "Provider",
"providerOptionDefault": "— Standard (Admin/Codex) —",
"providerOptionOpenai": "OpenAI (API-Key)",
"providerOptionAnthropic": "Anthropic (Claude)",
"providerOptionLocal": "Lokal (OpenAI-kompatibel)",
"modelLabel": "Modell",
"modelOptionDefault": "— Standard —",
"modelOptionCustom": "Eigenes…",
"customModelLabel": "Eigener Modellname",
"openaiKeyLabel": "OpenAI API-Key",
"openaiKeyHelp": "Eigener Key — keine Verbindung zu deinem ChatGPT-Abo. Für das Abo nutze den Verbinden-Button oben.",
"anthropicKeyLabel": "Anthropic API-Key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API-Key (optional)",
"savedPreview": "(gespeichert {preview})",
"savedShort": "(gespeichert)",
"saveCta": "Speichern",
"testCta": "Verbindung testen",
"removeKeyCta": "Gespeicherten Key entfernen",
"keyRemoved": "Gespeicherter Key entfernt",
"removeKeyConfirmTitle": "Gespeicherten API-Key entfernen?",
"removeKeyConfirmBody": "Insights für diesen Provider fallen auf den Admin-/Codex-Provider zurück, bis du einen neuen Key speicherst.",
"saved": "Gespeichert",
"saveFailed": "Speichern fehlgeschlagen",
"testFailed": "Test fehlgeschlagen",
"errorGeneric": "Fehler",
"providerChain": {
"heading": "KI-Provider-Fallback-Kette",
"activeLine": "Aktiver Provider: {provider}",
"cachedSuffix": "(zwischengespeichert: {provider})",
"chainLine": "Konfigurierte Kette: {chain}",
"managementHint": "Reihenfolge und Ein/Aus-Schalter kommen mit dem nächsten Release.",
"none": "keiner konfiguriert",
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (eigener Key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Gespeichert — neue eingeben zum Ersetzen",
"withingsCredentialsSavedPlaceholderSecret": "Gespeichert — neues eingeben zum Ersetzen",
"withingsSaveCredentials": "Zugangsdaten speichern",
"withingsConnected": "Verbunden",
"configured": "Konfiguriert",
"withingsTokenExpired": "Token abgelaufen",
"withingsLastSync": "Letzte Sync",
"withingsSync": "Jetzt synchronisieren",
"withingsFullSync": "Alle Daten synchronisieren",
"withingsFullSyncTitle": "Vollsynchronisierung?",
@@ -2109,15 +1910,6 @@
}
}
},
"integrationStatus": {
"stateConnected": "Verbunden",
"stateError": "Fehler",
"stateReauthRequired": "Neu verbinden erforderlich",
"stateDisconnected": "Getrennt",
"consecutiveFailures": "{count}/{threshold} aufeinanderfolgende Fehler",
"lastSuccess": "Letzte erfolgreiche Synchronisierung",
"lastAttempt": "Letzter Versuch"
},
"integrationPill": {
"connected": "Verbunden",
"errorReconnect": "Fehler — neu verbinden",
@@ -2130,7 +1922,6 @@
},
"apiTokens": "API-Tokens",
"apiTokensDescription": "Erstelle API-Tokens für die externe Medikamenten-Einnahme (z.B. Shortcuts, Automationen).",
"tokenName": "Token-Name",
"tokenNamePlaceholder": "Token-Name (z.B. iPhone Shortcut)",
"tokenCreated": "Token erstellt — kopiere ihn jetzt! Er wird nicht erneut angezeigt.",
"tokenRevoke": "Token widerrufen?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Aktionen",
"noActiveTokens": "Keine aktiven Tokens vorhanden.",
"tokenNeverUsed": "Nie",
"tokenLastUsed": "Zuletzt:",
"tokenCreatedAt": "Erstellt:",
"apiEndpoint": "API-Endpoint für Medikamenten-Einnahme:",
"apiEndpointsTitle": "API-Endpoints",
"apiEndpointsDescription": "Übersicht der derzeit verfügbaren externen Endpoint(s) für Token-basierte Eingaben.",
"apiEndpointMethod": "Methode",
"apiEndpointPath": "Pfad",
"apiEndpointAuth": "Authentifizierung",
"apiEndpointExample": "Body-Beispiel",
"export": "Daten-Export",
"exportDescription": "Exportiere alle deine Gesundheitsdaten.",
"exportJson": "JSON-Export",
"exportCsv": "CSV-Export",
"doctorReport": "Arztreport (PDF)",
"auditLog": "Aktivitätsprotokoll",
"auditLogHidden": "Protokoll ausgeblendet.",
"auditLogShowing": "Zeigt die letzten {count} von {total} Einträgen",
"auditNoActivities": "Keine Aktivitäten vorhanden.",
"auditAction": "Aktion",
"auditCategory": "Kategorie",
"auditIp": "IP",
"auditLocation": "Standort",
"auditTimestamp": "Zeitpunkt",
"auditOther": "Sonstig",
"auditCategoryAuth": "Auth",
"auditCategoryData": "Daten",
"auditCategoryIntegration": "Integration",
"auditCategoryAI": "KI",
"auditCategoryAdmin": "Admin",
"auditActionAuthRegister": "Registrierung",
"auditActionAuthLogin": "Anmeldung",
"auditActionAuthLoginPasskey": "Passkey-Anmeldung",
"auditActionAuthLoginPassword": "Passwort-Anmeldung",
"auditActionAuthLoginFailed": "Fehlgeschlagene Anmeldung",
"auditActionAuthLogout": "Abmeldung",
"auditActionAuthPasskeyRegister": "Passkey hinzugefügt",
"auditActionAuthPasskeyDelete": "Passkey gelöscht",
"auditActionAuthPasswordChange": "Passwort geändert",
"auditActionMeasurementCreate": "Messwert erstellt",
"auditActionMeasurementUpdate": "Messwert aktualisiert",
"auditActionMeasurementDelete": "Messwert gelöscht",
"auditActionMedicationCreate": "Medikament erstellt",
"auditActionMedicationUpdate": "Medikament aktualisiert",
"auditActionMedicationDelete": "Medikament gelöscht",
"auditActionMedicationIntake": "Einnahme erfasst",
"auditActionMedicationIngestExternal": "Externe Einnahme",
"auditActionWithingsConnect": "Withings verbunden",
"auditActionWithingsDisconnect": "Withings getrennt",
"auditActionExportDownload": "Export heruntergeladen",
"auditActionInsightsGenerate": "KI-Insight generiert",
"auditActionAdminUserUpdate": "Admin: Benutzer aktualisiert",
"auditActionAdminUserResetPassword": "Admin: Passwort zurückgesetzt",
"auditActionAdminSettingsUpdate": "Admin: Einstellungen geändert",
"collapse": "Einklappen",
"expand": "Ausklappen",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Alle Daten löschen",
"dangerZoneDescription": "Löscht alle deine Gesundheitsdaten und Integrationen. Dein Benutzerkonto bleibt erhalten.",
"dangerZoneConfirm": "Alle Daten löschen?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Endgültig löschen",
"saved": "Gespeichert",
"savingError": "Fehler beim Speichern",
"adminAreaTitle": "Admin-Bereich",
"adminAreaDescription": "Systemweite Einstellungen und Benutzerverwaltung findest du in der Admin-Konsole.",
"openAdminConsole": "Admin-Konsole öffnen",
"moodLogTitle": "moodLog",
"moodLogDescription": "Stimmungsdaten aus moodLog importieren",
"moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Trennen",
"moodLogDisconnectTitle": "moodLog trennen?",
"moodLogDisconnectDescription": "Die Verbindung wird getrennt und alle importierten Stimmungsdaten werden gelöscht.",
"moodLogLastSync": "Letzter Sync",
"moodLogEntries": "Einträge",
"moodLogSyncResult": "{count} Einträge synchronisiert",
"moodLogSyncFailed": "Sync fehlgeschlagen",
@@ -2298,14 +2037,10 @@
"title": "Administration",
"subtitle": "Systemstatus, Benutzer und Einstellungen",
"settingsSaveError": "Einstellungen konnten nicht gespeichert werden",
"settingsSaveValidationError": "Bitte markierte Felder prüfen",
"sectionsTitle": "Admin",
"systemStatus": "Systemstatus",
"version": "Version",
"database": "Datenbank",
"databaseConnected": "Verbunden",
"databaseError": "Fehler",
"gitCommit": "Git Commit",
"startedAt": "Gestartet",
"users": "Benutzer",
"measurementsCount": "Messwerte",
@@ -2320,8 +2055,6 @@
"load1": "Last (1m)",
"memUsedPercent": "Speicher",
"diskBusyPercent": "Disk-I/O",
"diskReadBps": "Disk lesen",
"diskWriteBps": "Disk schreiben",
"last2hours": "Letzte 2 Stunden",
"empty": "Erfassung läuft — Daten erscheinen in 1–2 Minuten.",
"loadError": "Host-Metriken konnten nicht geladen werden. Bitte die Seite neu laden."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug-Reports",
"apiGlobal": "API-Endpunkte und API-Tokens erlauben.",
"moodLogGlobal": "moodLog-Integration erlauben.",
"sectionGeneral": "Allgemein",
"sectionIntegrations": "Integrationen",
"sectionMedication": "Medikamente",
"sectionManagement": "Verwaltung",
"umamiTitle": "Umami",
"umamiDescription": "Web-Analyse mit Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Fehler-Tracking mit GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Konfiguration für Website-Analytics und Fehler-Tracking.",
"umamiEnabled": "Umami-Tracking aktivieren.",
"umamiScriptUrl": "Umami Script-URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip Environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Konfiguriere VAPID-Schlüssel und Subject direkt hier, damit Browser-Push ohne ENV-Variablen funktioniert.",
"webPushVapidPublicKey": "VAPID Public Key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID Subject",
"webPushVapidSubjectPlaceholder": "mailto:deine-adresse@example.com",
"configured": "Konfiguriert",
"notConfigured": "Nicht konfiguriert",
"monitoringTestUmami": "Umami-Test senden",
"monitoringTestGlitchTip": "GlitchTip-Test senden",
"monitoringTestSuccess": "Testevent wurde gesendet",
"monitoringTestFailed": "Monitoring-Test fehlgeschlagen",
"monitoringSave": "Monitoring speichern",
"bugReportGithub": "Bugreport (GitHub Issues)",
"bugReportGithubDescription": "Hinterlege GitHub-Issue-Token und Repository für eingehende Bugreports.",
"bugReportEnabledLabel": "Bug-Reports aktiviert",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue-Token",
"bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bugreport ist konfiguriert.",
"bugReportNotConfigured": "Bugreport ist noch nicht vollständig konfiguriert.",
"bugReportSave": "Bugreport speichern",
"userManagement": "Benutzerverwaltung",
"userName": "Name",
"userEmail": "E-Mail",
@@ -2438,7 +2156,6 @@
"toUser": "Zum Benutzer",
"toAdmin": "Zum Admin",
"ownRoleUnchangeable": "Eigene Rolle nicht änderbar",
"lastAdminError": "Der letzte Admin kann nicht degradiert werden",
"resetPassword": "Passwort zurücksetzen",
"resetPasswordTitle": "Passwort zurücksetzen: {name}",
"newPassword": "Neues Passwort",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Zuletzt benutzt",
"tokenCreated": "Erstellt",
"tokenNeverUsed": "Nie",
"noTokens": "Keine API-Tokens vorhanden.",
"tokensEmptyTitle": "Noch keine API-Tokens",
"tokensEmptyDescription": "Tokens werden bei der Anmeldung nativer Clients oder über Einstellungen → Account ausgestellt.",
"loginOverview": "Anmeldeübersicht",
"allAuthEvents": "Alle Auth-Ereignisse",
"failedOnly": "Nur fehlgeschlagene",
"noEntries": "Keine Einträge vorhanden.",
"loginEmptyTitle": "Noch keine Auth-Ereignisse",
"loginEmptyDescription": "Anmeldungen, Abmeldungen und Passkey-Änderungen erscheinen hier.",
"loginEmptyFailedTitle": "Keine fehlgeschlagenen Anmeldungen",
"loginEmptyFailedDescription": "Das ist der sichere Zustand. Wechsle zu „Alle Auth-Ereignisse“, um erfolgreiche Anmeldungen zu sehen.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Erfolgreich",
"outcomeFailed": "Fehlgeschlagen",
"auditDetails": "Details",
"dangerZone": "Gefahrenzone",
"deleteAllData": "Alle Daten global löschen",
"deleteAllDescription": "Löscht alle Mess-, Medikamenten-, Integrations- und Protokoll-Daten aller Benutzer. Benutzerkonten bleiben bestehen.",
"deleteAllConfirm": "Alle Daten wirklich löschen?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minuten nach Fenster-Ende bis der Badge von Gelb auf Orange wechselt.",
"reminderMissedMinutes": "Verpasst-Schwellenwert (Minuten)",
"reminderMissedMinutesDescription": "Minuten nach Fenster-Ende bis die Einnahme als verpasst gilt.",
"reminderThresholdsSave": "Schwellenwerte speichern",
"notificationTest": "Benachrichtigungen testen",
"notificationTestSend": "Test senden",
"notificationTestSuccess": "Test-Notification wurde gesendet",
"notificationTestFailed": "Test-Notification konnte nicht gesendet werden",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Heutige Events",
"reminderCheckNotifSent": "Gesendet",
"feedback": {
"title": "Feedback-Postfach",
"description": "Eingegangene Rückmeldungen, Fehlerberichte und Feature-Wünsche.",
"tabOpen": "Offen",
"tabAcknowledged": "Bestätigt",
"tabResolved": "Erledigt",
@@ -2535,7 +2244,6 @@
"createdAt": "Eingegangen",
"actions": "Aktionen",
"details": "Details",
"noEntries": "Keine Feedback-Einträge in dieser Kategorie.",
"emptyTitle": "Alles erledigt",
"emptyDescription": "Kein Nutzer-Feedback in diesem Status. Bug-Reports, Fragen und Feature-Wünsche erscheinen hier.",
"loading": "Lade Feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature",
"categoryQuestion": "Frage",
"categoryOther": "Sonstiges",
"statusOpen": "Offen",
"statusAcknowledged": "Bestätigt",
"statusResolved": "Erledigt",
"statusArchived": "Archiviert",
"dialogTitle": "Feedback-Details",
"metadataHeading": "Metadaten",
"metaUrl": "URL",
"metaLocale": "Sprache",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub-Veröffentlichung fehlgeschlagen",
"updateFailed": "Aktualisierung fehlgeschlagen",
"archiveConfirm": "Diesen Feedback-Eintrag archivieren?",
"submittedBy": "Eingereicht von",
"sectionTitle": "Feedback"
"submittedBy": "Eingereicht von"
},
"shell": {
"overview": "Übersicht",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit-Spur für Authentifizierungs- und Admin-Ereignisse."
},
"auditLog": {
"title": "Audit-Log",
"filterActor": "Akteur (Benutzer-ID oder -Name)",
"filterAction": "Aktion",
"filterActionAll": "Alle Aktionen",
"filterTarget": "Ziel (ID oder Pfad)",
"filterSeverity": "Schweregrad",
"filterDate": "Zeitraum",
"range24h": "Letzte 24 Stunden",
"range7d": "Letzte 7 Tage",
@@ -2706,7 +2406,6 @@
"runFailed": "Backup konnte nicht eingeplant werden",
"loading": "Backups werden geladen...",
"loadError": "Backups konnten nicht geladen werden.",
"empty": "Noch keine Backups vorhanden.",
"emptyTitle": "Noch keine Backups",
"emptyDescription": "Backups laufen automatisch jeden Sonntag um 03:00 Uhr — oder erstelle jetzt einen ersten Snapshot.",
"colUser": "Nutzer",
@@ -2753,10 +2452,7 @@
"nextGoal": "Nächstes Ziel",
"allCompleted": "Alle Erfolge freigeschaltet!",
"completed": "Abgeschlossen",
"inProgress": "In Arbeit",
"progress": "Fortschritt",
"goalReached": "Ziel erreicht",
"remaining": "Noch {count} bis zum Ziel",
"remainingUnlocks": "Noch {count} freischaltbar",
"noneUnlockedYet": "Noch keine Erfolge freigeschaltet.",
"pointsValue": "{points} Punkte",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Versteckter, gesperrter Erfolg"
},
"hiddenUnlockToast": {
"title": "Du hast einen versteckten Erfolg freigeschaltet!",
"description": "Tippe, um die Überraschung zu sehen."
"title": "Du hast einen versteckten Erfolg freigeschaltet!"
},
"dashboardCard": {
"title": "Zuletzt freigeschaltet",
@@ -3035,20 +2730,9 @@
"loginRequired": "Bitte anmelden, um einen Bug zu melden.",
"bugTitle": "Titel",
"description": "Beschreibung",
"descriptionPlaceholder": "Beschreibe den Fehler möglichst genau. Was hast du getan? Was ist passiert? Was hättest du erwartet?",
"screenshot": "Screenshot (optional)",
"screenshotPreview": "Screenshot-Vorschau",
"attachScreenshot": "Screenshot anhängen",
"imageOnly": "Nur Bilddateien erlaubt",
"tooLarge": "Screenshot ist zu groß (max. 5 MB)",
"submit": "Senden",
"success": "Vielen Dank! Dein Bug Report wurde erfolgreich übermittelt.",
"viewOnGithub": "Auf GitHub ansehen",
"errorCreating": "Fehler beim Erstellen",
"notConfiguredTitle": "Bug-Reports noch nicht aktiviert",
"notConfiguredUser": "Bug-Reports sind auf diesem Server nicht aktiv. Bitte wende dich an den Administrator.",
"notConfiguredAdmin": "Für Bug-Reports wird eine GitHub-Integration benötigt (Issue-Token + Repository). Im Admin-Panel unter Einstellungen → Bug-Reports einrichten.",
"openAdminSettings": "Admin-Einstellungen öffnen",
"category": "Art",
"categoryBug": "Fehlermeldung",
"categoryFeature": "Feature-Wunsch",
@@ -3058,8 +2742,7 @@
"githubEscalationNote": "Dein Feedback wird lokal gespeichert. Wenn der Administrator die GitHub-Integration aktiviert, kann es auf Wunsch als öffentliches Issue veröffentlicht werden.",
"internalOnlyNote": "Dein Feedback wird lokal gespeichert und ist nur für den Administrator dieses Servers sichtbar.",
"disabledTitle": "Bug-Reports sind deaktiviert",
"disabledBody": "Der Administrator hat Bug-Reports auf diesem Server deaktiviert.",
"disabledError": "Bug-Reports sind vom Administrator deaktiviert."
"disabledBody": "Der Administrator hat Bug-Reports auf diesem Server deaktiviert."
},
"notifications": {
"title": "Benachrichtigungen",
@@ -3069,24 +2752,9 @@
"noChannels": "Konfiguriere zuerst einen Benachrichtigungskanal in den Einstellungen.",
"goToSettings": "Zu den Einstellungen",
"channelDisabled": "Deaktiviert",
"eventMedicationReminder": "Medikamenten-Erinnerung",
"eventMedicationReminderDesc": "Erinnerung, wenn eine Einnahme aussteht.",
"eventMeasurementAnomaly": "Anomale Messwerte",
"eventMeasurementAnomalyDesc": "Warnung bei ungewöhnlichen Messungen (z.B. hoher Blutdruck).",
"eventComplianceLow": "Niedrige Einnahmetreue",
"eventComplianceLowDesc": "Benachrichtigung, wenn die Einnahmetreue unter einen Schwellwert fällt.",
"eventWithingsSyncFailed": "Withings-Sync-Fehler",
"eventWithingsSyncFailedDesc": "Meldung bei Fehlern beim automatischen Withings-Datenabgleich.",
"eventSystemAlert": "System-Hinweise",
"eventSystemAlertDesc": "Wichtige Systemnachrichten und administrative Hinweise.",
"eventPersonalRecord": "Persönlicher Rekord",
"eventPersonalRecordDesc": "Push bei einem neuen Bestwert für eine erfasste Kennzahl oder ein Training. Standardmäßig aus."
},
"format": {
"dateShort": "{day}.{month}.{year}",
"timeShort": "{hours}:{minutes}",
"dateTime": "{day}.{month}.{year}, {hours}:{minutes}"
},
"i18n": {
"maintainershipBanner": {
"notice": "Diese Sprachversion ist KI-entworfen, inklusive der sicherheitskritischen Coach-Anweisungen. Automatisierte Validierung läuft in CI; KI-Coach-Regressionen bitte auf GitHub melden.",
@@ -3094,108 +2762,10 @@
"dismiss": "Schließen"
}
},
"classifications": {
"bmi": {
"Underweight": "Untergewicht",
"Normal": "Normalgewicht",
"Overweight": "Übergewicht",
"ObesityGradeI": "Adipositas Grad I",
"ObesityGradeII": "Adipositas Grad II",
"ObesityGradeIII": "Adipositas Grad III"
},
"bp": {
"Optimal": "Optimal",
"Normal": "Normal",
"HighNormal": "Hoch-normal",
"HypertensionGrade1": "Hypertonie Grad 1",
"HypertensionGrade2": "Hypertonie Grad 2",
"HypertensionGrade3": "Hypertonie Grad 3"
},
"pulse": {
"Bradycardia": "Bradykardie",
"Normal": "Normal",
"Elevated": "Erhöht",
"Tachycardia": "Tachykardie"
},
"pulseTarget": {
"SignificantlyLow": "Deutlich niedrig",
"SlightlyLow": "Leicht niedrig",
"OnTarget": "Zielbereich",
"SlightlyElevated": "Leicht erhöht",
"SignificantlyElevated": "Deutlich erhöht"
},
"sleep": {
"FarTooShort": "Deutlich zu kurz",
"TooShort": "Zu kurz",
"OnTarget": "Zielbereich",
"SlightlyLong": "Etwas lang",
"FarTooLong": "Deutlich zu lang"
},
"bodyFat": {
"Essential": "Essenziell",
"Athletic": "Athletisch",
"Fitness": "Fitness",
"Average": "Durchschnitt",
"Obese": "Adipös"
},
"steps": {
"VeryLow": "Sehr wenig",
"LowActive": "Wenig aktiv",
"ModeratelyActive": "Moderat aktiv",
"Active": "Aktiv",
"VeryActive": "Sehr aktiv"
},
"general": {
"Good": "Gut",
"Moderate": "Moderat",
"Low": "Niedrig",
"VeryGood": "Sehr gut",
"VeryStable": "Sehr stabil",
"Stable": "Stabil",
"Fluctuating": "Schwankend"
},
"alerts": {
"bmiBelowNormalTitle": "BMI unter Normalbereich",
"bmiBelowNormalMessage": "Ihr BMI von {bmi} liegt unter dem Normalbereich (18,5–24,9).",
"bmiOverweightTitle": "BMI im Bereich Übergewicht",
"bmiOverweightMessage": "Ihr BMI von {bmi} liegt im Bereich Übergewicht. Regelmäßige Bewegung und ausgewogene Ernährung können helfen.",
"bmiObesityTitle": "BMI im Bereich Adipositas",
"bmiObesityMessage": "Ihr BMI von {bmi} liegt im Bereich Adipositas.",
"bmiNormalTitle": "BMI im Normalbereich",
"bmiNormalMessage": "Ihr BMI von {bmi} liegt im gesunden Bereich.",
"bpDangerTitle": "Blutdruck deutlich erhöht",
"bpDangerMessage": "Ihr durchschnittlicher Blutdruck ({sys}/{dia}) wird als \"{category}\" eingestuft.",
"bpWarningTitle": "Blutdruck leicht erhöht",
"bpWarningMessage": "Ihr durchschnittlicher Blutdruck ({sys}/{dia}) liegt im Bereich \"{category}\".",
"bpTargetGoodTitle": "Gute Blutdruck-Zielbereichstreue",
"bpTargetGoodMessage": "{pct}% Ihrer Messungen liegen im Zielbereich.",
"bpTargetBadTitle": "Blutdruck oft außerhalb des Zielbereichs",
"bpTargetBadMessage": "Nur {pct}% Ihrer Messungen liegen im Zielbereich.",
"weightIncreasingTitle": "Gewicht steigend",
"weightIncreasingMessage": "Ihr Gewicht steigt um ca. {change} kg pro Woche in den letzten 30 Tagen.",
"weightDecreasingTitle": "Gewicht fallend",
"weightDecreasingMessage": "Ihr Gewicht sinkt um ca. {change} kg pro Woche in den letzten 30 Tagen.",
"pulseOutliersTitle": "Puls-Ausreißer erkannt",
"pulseOutliersMessage": "{count} ungewöhnliche Pulsmessungen in den letzten 30 Tagen.",
"complianceLowTitle": "Niedrige Einnahmetreue: {name}",
"complianceLowMessage": "Ihre 7-Tage-Compliance für {name} liegt bei nur {pct}%. Regelmäßige Einnahme ist wichtig.",
"complianceGoodTitle": "Sehr gute Einnahmetreue: {name}",
"complianceGoodMessage": "{pct}% Compliance in den letzten 7 Tagen. Weiter so!"
}
},
"targets": {
"title": "Zielwerte",
"introText": "Deine aktuellen Werte im Vergleich zu empfohlenen Zielbereichen. Quellen der Leitlinien sind auf jeder Karte verlinkt.",
"weight": "Gewicht",
"bloodPressure": "Blutdruck",
"bloodPressureOnTarget": "Blutdruck im Zielbereich",
"restingPulse": "Ruhepuls",
"sleepDuration": "Schlafdauer",
"bmi": "BMI",
"bodyFat": "Körperfett",
"stepsPerDay": "Schritte/Tag",
"medicationCompliance": "Einnahmetreue",
"steps": "Schritte",
"average30d": "30-Tage-Schnitt:",
"consistency": {
"ariaLabel": "Letzte 7 Tage, im-Zielbereich-Status pro Tag",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Close",
"loading": "Loading...",
"error": "Error",
"success": "Success",
"saved": "Saved",
"confirm": "Confirm",
"back": "Back",
"next": "Next",
"yes": "Yes",
"no": "No",
"search": "Search",
"filter": "Filter",
"noData": "No data available",
"optional": "Optional",
"required": "Required",
"all": "All",
"active": "Active",
"inactive": "Inactive",
"enabled": "Enabled",
"disabled": "Disabled",
"networkError": "Network error",
"unknownError": "Unknown error",
"notLoggedIn": "Not logged in",
"noAccess": "Access denied",
"copied": "Copied!",
"or": "or",
"unknown": "Unknown",
"replace": "Replace",
"add": "Add",
"import": "Import",
"test": "Test",
@@ -169,7 +157,6 @@
"dashboard": "Dashboard",
"measurements": "Measurements",
"medications": "Medications",
"charts": "History",
"insights": "Insights",
"targets": "Targets",
"achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": {
"login": "Sign in",
"register": "Sign up",
"loginTitle": "Sign In",
"registerTitle": "Sign Up",
"username": "Username",
"password": "Password",
"email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed",
"createAccount": "Create account",
"newAccount": "Create new account",
"backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.",
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
"passwordTooShort": "Password must be at least {minLength} characters long."
},
"dashboard": {
"title": "Dashboard",
"subtitle": "Your health overview",
"greeting": {
"morning": "Good morning",
"day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Steps",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BP in Target",
"days30Short": "30d",
"medications": "Medications",
"insightsPreview": "AI Insights preview",
"lastMeasurement": "Last measurement",
"noMeasurements": "No measurements yet",
"trend": "Trend",
"trendUp": "rising",
"trendDown": "falling",
"trendStable": "stable",
"quickEntry": "Quick entry",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)",
"complianceGood": "Good",
"complianceLow": "Low",
"mood": "Mood",
"customizeTitle": "Dashboard layout",
"customizeSubtitle": "Choose which cards appear on your dashboard and in what order. Defaults work out of the box.",
"layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection",
"nextInjection": "Next injection",
"weightDelta": "since start",
"inDays": "in {count} days",
"empty": {
"title": "No active GLP-1 medication",
"description": "Add a GLP-1 receptor agonist (Mounjaro, Ozempic, Wegovy, …) to surface dose, schedule, and weight response here."
}
"inDays": "in {count} days"
}
},
"measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement",
"type": "Type",
"value": "Value",
"unit": "Unit",
"date": "Date",
"source": "Source",
"notes": "Notes",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours",
"unitSteps": "steps",
"sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.",
"allTypes": "All types",
"measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Actions",
"deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} of {total}",
"showing": "Showing",
"of": "of",
"entries": "entries"
"pageInfo": "Page {page} of {total}"
},
"mood": {
"title": "Mood",
@@ -404,14 +357,9 @@
"levelOkay": "Okay",
"levelSchlecht": "Bad",
"levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods",
"entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication",
"newMedication": "New medication",
"firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications",
"retryLoad": "Retry",
"name": "Name",
"dose": "Dose",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "From",
"scheduleTo": "To",
"scheduleLabel": "Label",
"scheduleDays": "Days",
"scheduleDaily": "Daily",
"active": "Active",
"inactive": "Paused",
"intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Taken",
"markSkipped": "Skipped",
"deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Compliance",
"import": "Import",
"importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status",
"changeFailed": "Change failed",
"categoryBloodPressure": "Blood Pressure",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid",
"categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes",
"viewHistory": "History",
"today": "Today",
"yesterday": "Yesterday",
"tomorrow": "Tomorrow",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — set to enable the low-stock dashboard caption. Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank to disable inventory tracking.",
"glp1Headline": "{name} · {dose}",
"glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Next: {label}",
"glp1NextInjectionDays": "Next: {label} (in {days} days)",
"glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Actions",
"pageInfo": "Page {page} of {total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green",
@@ -872,24 +798,13 @@
}
},
"charts": {
"title": "History",
"subtitle": "Visualization of your health data",
"timeRange": "Time range",
"days7": "7 days",
"days30": "30 days",
"days90": "90 days",
"days365": "1 year",
"daysAll": "All",
"weight": "Weight",
"bloodPressure": "Blood Pressure",
"pulse": "Pulse",
"bodyFat": "Body Fat",
"sleep": "Sleep",
"steps": "Steps",
"compliance": "Compliance",
"noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg",
"points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend",
"trend": "Trend",
"targetRanges": "Target ranges",
"perWeek": "/week",
"totalDelta": "Total",
"selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:",
"mood": "Mood",
"moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Awful",
"moodLabel2": "Bad",
"moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target"
},
"chart": {
@@ -989,25 +901,15 @@
},
"captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": {
"lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year"
},
"tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year yet"
},
"insightsCallout": {
"lastMonth": "Tracking against last month",
"lastYear": "Tracking against last year"
},
"notAvailableForCompliance": "Comparison N/A for compliance"
},
"insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
},
"thresholds": {
"title": "Personal thresholds",
"subtitle": "Override the computed target range for any metric. Defaults stay in effect until you set a value here.",
"defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto",
"overrideModeLabel": "Override",
"resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water",
"metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.",
"loadError": "Could not load thresholds"
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"setupDescription": "Set up your profile to get started. You can change this later in Settings.",
"completeSetup": "Complete setup",
"skip": "Skip",
"medicationsTitle": "Do you take medications?",
"medicationsDescription": "Add your medications to enable reminders and compliance tracking.",
"medNamePlaceholder": "Name",
"medDosePlaceholder": "Dose",
"notificationsTitle": "Reminders",
"notificationsDescription": "HealthLog can remind you about your medications. Configure this later in Settings.",
"telegramHint": "Reminders via Telegram bot with snooze buttons",
"webPushHint": "Browser notifications directly to your device",
"notificationsLater": "You can set this up anytime in Settings.",
"targetsTitle": "Target Values",
"targetsDescription": "Set optional target values for blood pressure and weight.",
"targetSys": "Systolic (mmHg)",
"targetDia": "Diastolic (mmHg)",
"targetWeight": "Target weight (kg)",
"errorProfile": "Could not save your profile. Please try again.",
"errorMedication": "Could not add the medication \"{name}\". Please try again or add it later in Medications.",
"errorTargets": "Could not save your target values. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"medScheduleHint": "We'll add a default reminder window (08:00–09:00 daily). You can adjust it anytime in Medications.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Step 3 of 4",
"step4of4": "Step 4 of 4"
},
"welcome": {
"title": "Welcome to HealthLog",
"carouselLabel": "Welcome — three slides",
"slideOf": "Slide {current} of {total}",
"gotoSlide": "Go to slide {index}",
"prevSlide": "Previous slide",
"nextSlide": "Next slide",
"slide1": {
"title": "Your health data, owned by you",
"body": "HealthLog stores every reading on your own infrastructure. No ads, no third-party sharing, no account lock-in."
},
"slide2": {
"title": "One view across every source",
"body": "Apple Health, Withings and manual entries merge into a single consistent history — with per-metric source priority you control."
},
"slide3": {
"title": "Coach and Insights with substance",
"body": "Evidence-grounded analysis built strictly from your numbers, every claim citable. Bring-your-own-key, no training on your data."
},
"cta": "Get started"
},
"goals": {
"title": "What would you like to track?",
"body": "Pick the areas you care about. Your dashboard and the default reminders follow your choice.",
@@ -1669,10 +1526,8 @@
"title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} of {total} done",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": {
"profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go."
},
"settings": {
"title": "Settings",
"subtitle": "Profile, Security & Connections",
"researchMode": {
"sectionTitle": "Research Mode",
"subtitle": "Opt-in display of an estimated GLP-1 drug-level curve, derived from EMA-published population pharmacokinetics. Reading-only — never a measurement or medical advice.",
@@ -1841,18 +1694,9 @@
"coming_soon": "Moving here with the next release update."
}
},
"sectionsTitle": "Settings",
"categoryGeneral": "General",
"categoryNotifications": "Notifications",
"categoryAi": "AI",
"categoryPersonalization": "Personalization",
"categoryIntegration": "Integration",
"categoryApi": "API",
"profile": "Profile",
"security": "Security",
"language": "Language",
"languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Username",
"height": "Height (cm)",
"dateOfBirth": "Date of birth",
@@ -1930,16 +1774,6 @@
"webPushActive": "Active",
"kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.",
"kiInsightsBenefitsTitle": "Benefits with OpenAI key",
"kiInsightsBenefit1": "Daily summaries for general status, blood pressure, weight, pulse, BMI, and medication compliance.",
"kiInsightsBenefit2": "Better trend and correlation interpretation based on your latest 30 daily measurement points per area.",
"kiInsightsBenefit3": "Automatic background refresh so the Insights page always shows up-to-date assessments.",
"createApiKeyHint": "Create your API key at:",
"createApiKeyLinkLabel": "platform.openai.com/api-keys",
"apiKey": "API Key",
"apiKeyStored": "Key stored — enter new one to replace",
"apiKeySaved": "API key saved",
"apiKeyRemoved": "API key removed",
"codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated",
"ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.",
"disconnect": "Disconnect",
"connectChatgptHeading": "Connect with ChatGPT",
"connectChatgptBody": "Link your ChatGPT Pro/Max account to get AI-powered health analyses based on current medical guidelines. No additional API costs.",
"connectChatgptCta": "Connect with ChatGPT",
"deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Cancel",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
"adminFallback": "Alternatively, HealthLog will use the AI provider configured by the administrator.",
"personalProviderHeading": "AI provider (personal)",
"personalProviderBody": "Your own AI provider overrides the admin setting. Leave blank for the default. For ChatGPT Pro/Max OAuth use the connect button above.",
"providerLabel": "Provider",
"providerOptionDefault": "— Default (Admin/Codex) —",
"providerOptionOpenai": "OpenAI (API key)",
"providerOptionAnthropic": "Anthropic (Claude)",
"providerOptionLocal": "Local (OpenAI-compatible)",
"modelLabel": "Model",
"modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name",
"openaiKeyLabel": "OpenAI API key",
"openaiKeyHelp": "Your own key — not connected to your ChatGPT subscription. For the subscription use the connect button above.",
"anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})",
"savedShort": "(saved)",
"saveCta": "Save",
"testCta": "Test connection",
"removeKeyCta": "Remove saved key",
"keyRemoved": "Saved key removed",
"removeKeyConfirmTitle": "Remove saved API key?",
"removeKeyConfirmBody": "Insights for this provider will fall back to the admin/Codex provider until you save a new key.",
"saved": "Saved",
"saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Error",
"providerChain": {
"heading": "AI provider fallback chain",
"activeLine": "Active provider: {provider}",
"cachedSuffix": "(cached: {provider})",
"chainLine": "Configured chain: {chain}",
"managementHint": "Reordering and on/off toggles arrive in the next release.",
"none": "none configured",
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now",
"withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?",
@@ -2109,15 +1910,6 @@
}
}
},
"integrationStatus": {
"stateConnected": "Connected",
"stateError": "Error",
"stateReauthRequired": "Reconnect required",
"stateDisconnected": "Disconnected",
"consecutiveFailures": "{count}/{threshold} consecutive failures",
"lastSuccess": "Last successful sync",
"lastAttempt": "Last attempt"
},
"integrationPill": {
"connected": "Connected",
"errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
},
"apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Actions",
"noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method",
"apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example",
"export": "Data Export",
"exportDescription": "Export all your health data.",
"exportJson": "JSON Export",
"exportCsv": "CSV Export",
"doctorReport": "Doctor Report (PDF)",
"auditLog": "Activity Log",
"auditLogHidden": "Log hidden.",
"auditLogShowing": "Showing last {count} of {total} entries",
"auditNoActivities": "No activities found.",
"auditAction": "Action",
"auditCategory": "Category",
"auditIp": "IP",
"auditLocation": "Location",
"auditTimestamp": "Time",
"auditOther": "Other",
"auditCategoryAuth": "Auth",
"auditCategoryData": "Data",
"auditCategoryIntegration": "Integration",
"auditCategoryAI": "AI",
"auditCategoryAdmin": "Admin",
"auditActionAuthRegister": "Registration",
"auditActionAuthLogin": "Login",
"auditActionAuthLoginPasskey": "Passkey login",
"auditActionAuthLoginPassword": "Password login",
"auditActionAuthLoginFailed": "Failed login",
"auditActionAuthLogout": "Logout",
"auditActionAuthPasskeyRegister": "Passkey added",
"auditActionAuthPasskeyDelete": "Passkey deleted",
"auditActionAuthPasswordChange": "Password changed",
"auditActionMeasurementCreate": "Measurement created",
"auditActionMeasurementUpdate": "Measurement updated",
"auditActionMeasurementDelete": "Measurement deleted",
"auditActionMedicationCreate": "Medication created",
"auditActionMedicationUpdate": "Medication updated",
"auditActionMedicationDelete": "Medication deleted",
"auditActionMedicationIntake": "Intake recorded",
"auditActionMedicationIngestExternal": "External intake",
"auditActionWithingsConnect": "Withings connected",
"auditActionWithingsDisconnect": "Withings disconnected",
"auditActionExportDownload": "Export downloaded",
"auditActionInsightsGenerate": "AI insight generated",
"auditActionAdminUserUpdate": "Admin: User updated",
"auditActionAdminUserResetPassword": "Admin: Password reset",
"auditActionAdminSettingsUpdate": "Admin: Settings changed",
"collapse": "Collapse",
"expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently",
"saved": "Saved",
"savingError": "Error saving",
"adminAreaTitle": "Admin area",
"adminAreaDescription": "System-wide settings and user management are available in the admin console.",
"openAdminConsole": "Open admin console",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration",
"subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status",
"version": "Version",
"database": "Database",
"databaseConnected": "Connected",
"databaseError": "Error",
"gitCommit": "Git Commit",
"startedAt": "Started",
"users": "Users",
"measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)",
"memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integrations",
"sectionMedication": "Medications",
"sectionManagement": "Management",
"umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management",
"userName": "Name",
"userEmail": "Email",
@@ -2438,7 +2156,6 @@
"toUser": "Make user",
"toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used",
"tokenCreated": "Created",
"tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview",
"allAuthEvents": "All auth events",
"failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"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.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Success",
"outcomeFailed": "Failed",
"auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"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.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent",
"feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open",
"tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted",
"actions": "Actions",
"details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature",
"categoryQuestion": "Question",
"categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata",
"metaUrl": "URL",
"metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed",
"updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by",
"sectionTitle": "Feedback"
"submittedBy": "Submitted by"
},
"shell": {
"overview": "Overview",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events."
},
"auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)",
"filterAction": "Action",
"filterActionAll": "All actions",
"filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range",
"range24h": "Last 24 hours",
"range7d": "Last 7 days",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup",
"loading": "Loading backups...",
"loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!",
"completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement"
},
"hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!",
"description": "Tap to see the surprise."
"title": "You unlocked a hidden achievement!"
},
"dashboardCard": {
"title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title",
"description": "Description",
"descriptionPlaceholder": "Describe the bug in detail. What did you do? What happened? What did you expect?",
"screenshot": "Screenshot (optional)",
"screenshotPreview": "Screenshot preview",
"attachScreenshot": "Attach screenshot",
"imageOnly": "Only image files allowed",
"tooLarge": "Screenshot is too large (max 5 MB)",
"submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report",
"notConfiguredTitle": "Bug reports not available yet",
"notConfiguredUser": "Bug reporting is disabled on this server. Please contact your administrator.",
"notConfiguredAdmin": "Bug reporting requires a GitHub integration (issue token + repository). Configure it in the admin panel under Settings → Bug reports.",
"openAdminSettings": "Open admin settings",
"category": "Type",
"categoryBug": "Bug report",
"categoryFeature": "Feature request",
@@ -3058,8 +2742,7 @@
"githubEscalationNote": "Your feedback is stored locally. If the admin enables GitHub integration, it can be promoted to a public issue on request.",
"internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.",
"disabledError": "Bug reports are disabled by the administrator."
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Notifications",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Disabled",
"eventMedicationReminder": "Medication Reminder",
"eventMedicationReminderDesc": "Reminder when an intake is due.",
"eventMeasurementAnomaly": "Anomalous Measurement",
"eventMeasurementAnomalyDesc": "Warning for unusual measurements (e.g., high blood pressure).",
"eventComplianceLow": "Low Compliance",
"eventComplianceLowDesc": "Notification when medication compliance drops below a threshold.",
"eventWithingsSyncFailed": "Withings Sync Failed",
"eventWithingsSyncFailedDesc": "Alert when the automatic Withings data sync fails.",
"eventSystemAlert": "System Alert",
"eventSystemAlertDesc": "Important system messages and administrative notices.",
"eventPersonalRecord": "Personal Record",
"eventPersonalRecordDesc": "Push when an all-time best is reached for a tracked metric or workout. Off by default."
},
"format": {
"dateShort": "{month}/{day}/{year}",
"timeShort": "{hours}:{minutes}",
"dateTime": "{month}/{day}/{year}, {hours}:{minutes}"
},
"i18n": {
"maintainershipBanner": {
"notice": "This locale is AI-drafted including the Coach's safety-critical instructions. Automated validation runs in CI; please report any AI Coach regressions on GitHub.",
@@ -3094,108 +2762,10 @@
"dismiss": "Dismiss"
}
},
"classifications": {
"bmi": {
"Underweight": "Underweight",
"Normal": "Normal",
"Overweight": "Overweight",
"ObesityGradeI": "Obesity Grade I",
"ObesityGradeII": "Obesity Grade II",
"ObesityGradeIII": "Obesity Grade III"
},
"bp": {
"Optimal": "Optimal",
"Normal": "Normal",
"HighNormal": "High-normal",
"HypertensionGrade1": "Hypertension Grade 1",
"HypertensionGrade2": "Hypertension Grade 2",
"HypertensionGrade3": "Hypertension Grade 3"
},
"pulse": {
"Bradycardia": "Bradycardia",
"Normal": "Normal",
"Elevated": "Elevated",
"Tachycardia": "Tachycardia"
},
"pulseTarget": {
"SignificantlyLow": "Significantly low",
"SlightlyLow": "Slightly low",
"OnTarget": "On target",
"SlightlyElevated": "Slightly elevated",
"SignificantlyElevated": "Significantly elevated"
},
"sleep": {
"FarTooShort": "Far too short",
"TooShort": "Too short",
"OnTarget": "On target",
"SlightlyLong": "Slightly long",
"FarTooLong": "Far too long"
},
"bodyFat": {
"Essential": "Essential",
"Athletic": "Athletic",
"Fitness": "Fitness",
"Average": "Average",
"Obese": "Obese"
},
"steps": {
"VeryLow": "Very low",
"LowActive": "Low active",
"ModeratelyActive": "Moderately active",
"Active": "Active",
"VeryActive": "Very active"
},
"general": {
"Good": "Good",
"Moderate": "Moderate",
"Low": "Low",
"VeryGood": "Very good",
"VeryStable": "Very stable",
"Stable": "Stable",
"Fluctuating": "Fluctuating"
},
"alerts": {
"bmiBelowNormalTitle": "BMI below normal range",
"bmiBelowNormalMessage": "Your BMI of {bmi} is below the normal range (18.5–24.9).",
"bmiOverweightTitle": "BMI in overweight range",
"bmiOverweightMessage": "Your BMI of {bmi} is in the overweight range. Regular exercise and a balanced diet can help.",
"bmiObesityTitle": "BMI in obesity range",
"bmiObesityMessage": "Your BMI of {bmi} is in the obesity range.",
"bmiNormalTitle": "BMI in normal range",
"bmiNormalMessage": "Your BMI of {bmi} is in the healthy range.",
"bpDangerTitle": "Blood pressure significantly elevated",
"bpDangerMessage": "Your average blood pressure ({sys}/{dia}) is classified as \"{category}\".",
"bpWarningTitle": "Blood pressure slightly elevated",
"bpWarningMessage": "Your average blood pressure ({sys}/{dia}) is in the \"{category}\" range.",
"bpTargetGoodTitle": "Good blood pressure target adherence",
"bpTargetGoodMessage": "{pct}% of your readings are within the target range.",
"bpTargetBadTitle": "Blood pressure often outside target range",
"bpTargetBadMessage": "Only {pct}% of your readings are within the target range.",
"weightIncreasingTitle": "Weight increasing",
"weightIncreasingMessage": "Your weight is increasing by approx. {change} kg per week over the last 30 days.",
"weightDecreasingTitle": "Weight decreasing",
"weightDecreasingMessage": "Your weight is decreasing by approx. {change} kg per week over the last 30 days.",
"pulseOutliersTitle": "Pulse outliers detected",
"pulseOutliersMessage": "{count} unusual pulse readings in the last 30 days.",
"complianceLowTitle": "Low compliance: {name}",
"complianceLowMessage": "Your 7-day compliance for {name} is only {pct}%. Regular intake is important.",
"complianceGoodTitle": "Excellent compliance: {name}",
"complianceGoodMessage": "{pct}% compliance over the last 7 days. Keep it up!"
}
},
"targets": {
"title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.",
"weight": "Weight",
"bloodPressure": "Blood pressure",
"bloodPressureOnTarget": "Blood pressure on target",
"restingPulse": "Resting pulse",
"sleepDuration": "Sleep duration",
"bmi": "BMI",
"bodyFat": "Body fat",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "steps",
"average30d": "30-day average:",
"consistency": {
"ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Cerrar",
"loading": "Cargando…...",
"error": "Error",
"success": "Éxito",
"saved": "Guardado",
"confirm": "Confirmar",
"back": "Atrás",
"next": "Siguiente",
"yes": "Sí",
"no": "No",
"search": "Buscar",
"filter": "Filtrar",
"noData": "Sin datos disponibles",
"optional": "Opcional",
"required": "Obligatorio",
"all": "Todo",
"active": "Activo",
"inactive": "Inactivo",
"enabled": "Activado",
"disabled": "Desactivado",
"networkError": "Error de red",
"unknownError": "Error desconocido",
"notLoggedIn": "No conectado",
"noAccess": "Acceso denegado",
"copied": "Copied!",
"or": "o",
"unknown": "Desconocido",
"replace": "Reemplazar",
"add": "Añadir",
"import": "Importar",
"test": "Probar",
@@ -169,7 +157,6 @@
"dashboard": "Panel",
"measurements": "Measurements",
"medications": "Medicamentos",
"charts": "Historial",
"insights": "Análisis",
"targets": "Targets",
"achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": {
"login": "Iniciar sesión",
"register": "Registrarse",
"loginTitle": "Iniciar sesión",
"registerTitle": "Registrarse",
"username": "Nombre de usuario",
"password": "Contraseña",
"email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed",
"createAccount": "Create account",
"newAccount": "Create new account",
"backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.",
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
"passwordTooShort": "Password must be at least {minLength} characters long."
},
"dashboard": {
"title": "Panel",
"subtitle": "Your health overview",
"greeting": {
"morning": "Good morning",
"day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Pasos",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "PA-objetivo",
"days30Short": "30d",
"medications": "Medicamentos",
"insightsPreview": "AI Insights preview",
"lastMeasurement": "Last measurement",
"noMeasurements": "No measurements yet",
"trend": "Tendencia",
"trendUp": "rising",
"trendDown": "falling",
"trendStable": "stable",
"quickEntry": "Quick entry",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)",
"complianceGood": "Bien",
"complianceLow": "Low",
"mood": "Estado de ánimo",
"customizeTitle": "Dashboard layout",
"customizeSubtitle": "Choose which cards appear on your dashboard and in what order. Defaults work out of the box.",
"layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection",
"nextInjection": "Next injection",
"weightDelta": "since start",
"inDays": "in {count} days",
"empty": {
"title": "No active GLP-1 medication",
"description": "Add a GLP-1 receptor agonist (Mounjaro, Ozempic, Wegovy, …) to surface dose, schedule, and weight response here."
}
"inDays": "in {count} days"
}
},
"measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement",
"type": "Tipo",
"value": "Valor",
"unit": "Unit",
"date": "Fecha",
"source": "Source",
"notes": "Notas",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours",
"unitSteps": "Pasos",
"sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.",
"allTypes": "All types",
"measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Acciones",
"deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} de{total}",
"showing": "Showing",
"of": "de",
"entries": "entries"
"pageInfo": "Page {page} de{total}"
},
"mood": {
"title": "Estado de ánimo",
@@ -404,14 +357,9 @@
"levelOkay": "Okay",
"levelSchlecht": "Mal",
"levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods",
"entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication",
"newMedication": "New medication",
"firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications",
"retryLoad": "Reintentar",
"name": "Nombre",
"dose": "Dosis",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "Desde",
"scheduleTo": "Hasta",
"scheduleLabel": "Label",
"scheduleDays": "Days",
"scheduleDaily": "Daily",
"active": "Activo",
"inactive": "Paused",
"intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Tomada",
"markSkipped": "Omitida",
"deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Cumplimiento",
"import": "Importar",
"importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status",
"changeFailed": "Change failed",
"categoryBloodPressure": "Presión arterial",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid",
"categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes",
"viewHistory": "Historial",
"today": "Hoy",
"yesterday": "Ayer",
"tomorrow": "Mañana",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — set to enable the low-stock dashboard caption. Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank to disable inventory tracking.",
"glp1Headline": "{name} · {dose}",
"glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Siguiente:{label}",
"glp1NextInjectionDays": "Siguiente:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Acciones",
"pageInfo": "Page {page} de{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green",
@@ -872,24 +798,13 @@
}
},
"charts": {
"title": "Historial",
"subtitle": "Visualization of your health data",
"timeRange": "Time range",
"days7": "7 days",
"days30": "30 days",
"days90": "90 days",
"days365": "1 year",
"daysAll": "Todo",
"weight": "Peso",
"bloodPressure": "Presión arterial",
"pulse": "Pulso",
"bodyFat": "Grasa corporal",
"sleep": "Sueño",
"steps": "Pasos",
"compliance": "Cumplimiento",
"noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg",
"points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend",
"trend": "Tendencia",
"targetRanges": "Target ranges",
"perWeek": "/week",
"totalDelta": "Total",
"selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:",
"mood": "Estado de ánimo",
"moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Terrible",
"moodLabel2": "Mal",
"moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target"
},
"chart": {
@@ -989,25 +901,15 @@
},
"captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": {
"lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year"
},
"tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year yet"
},
"insightsCallout": {
"lastMonth": "Tracking against last month",
"lastYear": "Tracking against last year"
},
"notAvailableForCompliance": "Comparison N/A for compliance"
},
"insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
},
"thresholds": {
"title": "Personal thresholds",
"subtitle": "Override the computed target range for any metric. Defaults stay in effect until you set a value here.",
"defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto",
"overrideModeLabel": "Override",
"resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water",
"metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.",
"loadError": "Could not load thresholds"
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"setupDescription": "Set up your profile to get started. You can change this later in Settings.",
"completeSetup": "Complete setup",
"skip": "Omitir",
"medicationsTitle": "Do you take medications?",
"medicationsDescription": "Add your medications to enable reminders and compliance tracking.",
"medNamePlaceholder": "Nombre",
"medDosePlaceholder": "Dosis",
"notificationsTitle": "Reminders",
"notificationsDescription": "HealthLog can remind you about your medications. Configure this later in Settings.",
"telegramHint": "Reminders via Telegram bot with snooze buttons",
"webPushHint": "Browser notifications directly to your device",
"notificationsLater": "You can set this up anytime in Settings.",
"targetsTitle": "Target Values",
"targetsDescription": "Set optional target values for blood pressure and weight.",
"targetSys": "Systolic (mmHg)",
"targetDia": "Diastolic (mmHg)",
"targetWeight": "Target weight (kg)",
"errorProfile": "Could not save your profile. Please try again.",
"errorMedication": "Could not add the medication \"{name}\". Please try again or add it later in Medications.",
"errorTargets": "Could not save your target values. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"medScheduleHint": "We'll add a default reminder window (08:00–09:00 daily). You can adjust it anytime in Medications.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Paso 3 de 4",
"step4of4": "Paso 4 de 4"
},
"welcome": {
"title": "Te damos la bienvenida a HealthLog",
"carouselLabel": "Bienvenida — tres diapositivas",
"slideOf": "Diapositiva {current} de {total}",
"gotoSlide": "Ir a la diapositiva {index}",
"prevSlide": "Diapositiva anterior",
"nextSlide": "Diapositiva siguiente",
"slide1": {
"title": "Tus datos de salud, en tus manos",
"body": "HealthLog guarda cada medición en tu propia infraestructura. Sin publicidad, sin compartir con terceros, sin depender de una cuenta."
},
"slide2": {
"title": "Una sola vista para cada fuente",
"body": "Apple Health, Withings y la entrada manual se unen en un historial consistente, con prioridad de fuente por métrica que controlas tú."
},
"slide3": {
"title": "Coach e Insights con sustancia",
"body": "Un análisis basado solo en tus cifras, con cada afirmación verificable. Trae tu propia clave; tus datos no se usan para entrenar."
},
"cta": "Empezar"
},
"goals": {
"title": "¿Qué te gustaría registrar?",
"body": "Elige las áreas que te interesan. El panel y los recordatorios se ajustarán a tu elección.",
@@ -1669,10 +1526,8 @@
"title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} de{total} Hecho",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": {
"profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go."
},
"settings": {
"title": "Ajustes",
"subtitle": "Profile, Security & Connections",
"researchMode": {
"sectionTitle": "Modo Investigación",
"subtitle": "Visualización opcional de una curva estimada del nivel de fármaco GLP-1, derivada de la farmacocinética poblacional publicada por la EMA. Solo lectura: nunca una medición ni un consejo médico.",
@@ -1841,18 +1694,9 @@
"coming_soon": "Moving here with the next release update."
}
},
"sectionsTitle": "Ajustes",
"categoryGeneral": "General",
"categoryNotifications": "Notificaciones",
"categoryAi": "AI",
"categoryPersonalization": "Personalization",
"categoryIntegration": "Integration",
"categoryApi": "API",
"profile": "Perfil",
"security": "Seguridad",
"language": "Idioma",
"languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nombre de usuario",
"height": "Height (cm)",
"dateOfBirth": "Fecha de nacimiento",
@@ -1930,16 +1774,6 @@
"webPushActive": "Activo",
"kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.",
"kiInsightsBenefitsTitle": "Benefits with OpenAI key",
"kiInsightsBenefit1": "Daily summaries for general status, blood pressure, weight, pulse, BMI, and medication compliance.",
"kiInsightsBenefit2": "Better trend and correlation interpretation based on your latest 30 daily measurement points per area.",
"kiInsightsBenefit3": "Automatic background refresh so the Insights page always shows up-to-date assessments.",
"createApiKeyHint": "Create your API key at:",
"createApiKeyLinkLabel": "platform.openai.com/api-keys",
"apiKey": "API Key",
"apiKeyStored": "Key stored — enter new one to replace",
"apiKeySaved": "API key saved",
"apiKeyRemoved": "API key removed",
"codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated",
"ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.",
"disconnect": "Disconnect",
"connectChatgptHeading": "Connect with ChatGPT",
"connectChatgptBody": "Link your ChatGPT Pro/Max account to get AI-powered health analyses based on current medical guidelines. No additional API costs.",
"connectChatgptCta": "Connect with ChatGPT",
"deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Cancelar",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
"adminFallback": "Alternatively, HealthLog will use the AI provider configured by the administrator.",
"personalProviderHeading": "AI provider (personal)",
"personalProviderBody": "Your own AI provider overrides the admin setting. Leave blank for the default. For ChatGPT Pro/Max OAuth use the connect button above.",
"providerLabel": "Provider",
"providerOptionDefault": "— Default (Admin/Codex) —",
"providerOptionOpenai": "OpenAI (API key)",
"providerOptionAnthropic": "Anthropic (Claude)",
"providerOptionLocal": "Local (OpenAI-compatible)",
"modelLabel": "Model",
"modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name",
"openaiKeyLabel": "OpenAI API key",
"openaiKeyHelp": "Your own key — not connected to your ChatGPT subscription. For the subscription use the connect button above.",
"anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})",
"savedShort": "(saved)",
"saveCta": "Guardar",
"testCta": "Test connection",
"removeKeyCta": "Remove saved key",
"keyRemoved": "Saved key removed",
"removeKeyConfirmTitle": "Remove saved API key?",
"removeKeyConfirmBody": "Insights for this provider will fall back to the admin/Codex provider until you save a new key.",
"saved": "Guardado",
"saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Error",
"providerChain": {
"heading": "AI provider fallback chain",
"activeLine": "Active provider: {provider}",
"cachedSuffix": "(cached: {provider})",
"chainLine": "Configured chain: {chain}",
"managementHint": "Reordering and on/off toggles arrive in the next release.",
"none": "none configured",
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now",
"withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?",
@@ -2109,15 +1910,6 @@
}
}
},
"integrationStatus": {
"stateConnected": "Connected",
"stateError": "Error",
"stateReauthRequired": "Reconnect required",
"stateDisconnected": "Disconnected",
"consecutiveFailures": "{count}/{threshold} consecutive failures",
"lastSuccess": "Last successful sync",
"lastAttempt": "Last attempt"
},
"integrationPill": {
"connected": "Connected",
"errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
},
"apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Acciones",
"noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method",
"apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example",
"export": "Data Export",
"exportDescription": "Export all your health data.",
"exportJson": "JSON Export",
"exportCsv": "CSV Export",
"doctorReport": "Doctor Report (PDF)",
"auditLog": "Activity Log",
"auditLogHidden": "Log hidden.",
"auditLogShowing": "Showing last {count} de{total} entries",
"auditNoActivities": "No activities found.",
"auditAction": "Action",
"auditCategory": "Category",
"auditIp": "IP",
"auditLocation": "Location",
"auditTimestamp": "Hora",
"auditOther": "Other",
"auditCategoryAuth": "Auth",
"auditCategoryData": "Datos",
"auditCategoryIntegration": "Integration",
"auditCategoryAI": "AI",
"auditCategoryAdmin": "Admin",
"auditActionAuthRegister": "Registration",
"auditActionAuthLogin": "Iniciar sesión",
"auditActionAuthLoginPasskey": "Passkey login",
"auditActionAuthLoginPassword": "Password login",
"auditActionAuthLoginFailed": "Failed login",
"auditActionAuthLogout": "Cerrar sesión",
"auditActionAuthPasskeyRegister": "Passkey added",
"auditActionAuthPasskeyDelete": "Passkey deleted",
"auditActionAuthPasswordChange": "Password changed",
"auditActionMeasurementCreate": "Measurement created",
"auditActionMeasurementUpdate": "Measurement updated",
"auditActionMeasurementDelete": "Measurement deleted",
"auditActionMedicationCreate": "Medication created",
"auditActionMedicationUpdate": "Medication updated",
"auditActionMedicationDelete": "Medication deleted",
"auditActionMedicationIntake": "Intake recorded",
"auditActionMedicationIngestExternal": "External intake",
"auditActionWithingsConnect": "Withings connected",
"auditActionWithingsDisconnect": "Withings disconnected",
"auditActionExportDownload": "Export downloaded",
"auditActionInsightsGenerate": "AI insight generated",
"auditActionAdminUserUpdate": "Admin: User updated",
"auditActionAdminUserResetPassword": "Admin: Password reset",
"auditActionAdminSettingsUpdate": "Admin: Settings changed",
"collapse": "Collapse",
"expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently",
"saved": "Guardado",
"savingError": "Error saving",
"adminAreaTitle": "Admin area",
"adminAreaDescription": "System-wide settings and user management are available in the admin console.",
"openAdminConsole": "Open admin console",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration",
"subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status",
"version": "Version",
"database": "Database",
"databaseConnected": "Connected",
"databaseError": "Error",
"gitCommit": "Git Commit",
"startedAt": "Started",
"users": "Users",
"measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)",
"memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integraciones",
"sectionMedication": "Medicamentos",
"sectionManagement": "Management",
"umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management",
"userName": "Nombre",
"userEmail": "Correo electrónico",
@@ -2438,7 +2156,6 @@
"toUser": "Make user",
"toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used",
"tokenCreated": "Created",
"tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview",
"allAuthEvents": "All auth events",
"failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"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.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Éxito",
"outcomeFailed": "Failed",
"auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"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.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent",
"feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open",
"tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted",
"actions": "Acciones",
"details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature",
"categoryQuestion": "Question",
"categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata",
"metaUrl": "URL",
"metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed",
"updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by",
"sectionTitle": "Feedback"
"submittedBy": "Submitted by"
},
"shell": {
"overview": "Resumen",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events."
},
"auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)",
"filterAction": "Action",
"filterActionAll": "All actions",
"filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range",
"range24h": "Last 24 hours",
"range7d": "Últimos 7 días",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup",
"loading": "Loading backups...",
"loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!",
"completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement"
},
"hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!",
"description": "Tap to see the surprise."
"title": "You unlocked a hidden achievement!"
},
"dashboardCard": {
"title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title",
"description": "Descripción",
"descriptionPlaceholder": "Describe the bug in detail. What did you do? What happened? What did you expect?",
"screenshot": "Screenshot (optional)",
"screenshotPreview": "Screenshot preview",
"attachScreenshot": "Attach screenshot",
"imageOnly": "Only image files allowed",
"tooLarge": "Screenshot is too large (max 5 MB)",
"submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report",
"notConfiguredTitle": "Bug reports not available yet",
"notConfiguredUser": "Bug reporting is disabled on this server. Please contact your administrator.",
"notConfiguredAdmin": "Bug reporting requires a GitHub integration (issue token + repository). Configure it in the admin panel under Settings → Bug reports.",
"openAdminSettings": "Open admin settings",
"category": "Tipo",
"categoryBug": "Bug report",
"categoryFeature": "Feature request",
@@ -3058,8 +2742,7 @@
"githubEscalationNote": "Your feedback is stored locally. If the admin enables GitHub integration, it can be promoted to a public issue on request.",
"internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.",
"disabledError": "Bug reports are disabled by the administrator."
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Notificaciones",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Desactivado",
"eventMedicationReminder": "Medication Reminder",
"eventMedicationReminderDesc": "Reminder when an intake is due.",
"eventMeasurementAnomaly": "Anomalous Measurement",
"eventMeasurementAnomalyDesc": "Warning for unusual measurements (e.g., high blood pressure).",
"eventComplianceLow": "Low Compliance",
"eventComplianceLowDesc": "Notification when medication compliance drops below a threshold.",
"eventWithingsSyncFailed": "Withings Sync Failed",
"eventWithingsSyncFailedDesc": "Alert when the automatic Withings data sync fails.",
"eventSystemAlert": "Alerta del sistema",
"eventSystemAlertDesc": "Mensajes importantes del sistema y avisos administrativos.",
"eventPersonalRecord": "Récord personal",
"eventPersonalRecordDesc": "Notificación cuando se alcanza un nuevo récord en una métrica o entrenamiento. Desactivado por defecto."
},
"format": {
"dateShort": "{month}/{day}/{year}",
"timeShort": "{hours}:{minutes}",
"dateTime": "{month}/{day}/{year}, {hours}:{minutes}"
},
"i18n": {
"maintainershipBanner": {
"notice": "Este idioma está redactado por IA, incluidas las instrucciones críticas para la seguridad del Coach. La validación automática se ejecuta en CI; informe de cualquier regresión del Coach IA en GitHub.",
@@ -3094,108 +2762,10 @@
"dismiss": "Cerrar"
}
},
"classifications": {
"bmi": {
"Underweight": "Underweight",
"Normal": "Normal",
"Overweight": "Overweight",
"ObesityGradeI": "Obesity Grade I",
"ObesityGradeII": "Obesity Grade II",
"ObesityGradeIII": "Obesity Grade III"
},
"bp": {
"Optimal": "Optimal",
"Normal": "Normal",
"HighNormal": "High-normal",
"HypertensionGrade1": "Hypertension Grade 1",
"HypertensionGrade2": "Hypertension Grade 2",
"HypertensionGrade3": "Hypertension Grade 3"
},
"pulse": {
"Bradycardia": "Bradycardia",
"Normal": "Normal",
"Elevated": "Elevated",
"Tachycardia": "Tachycardia"
},
"pulseTarget": {
"SignificantlyLow": "Significantly low",
"SlightlyLow": "Slightly low",
"OnTarget": "On target",
"SlightlyElevated": "Slightly elevated",
"SignificantlyElevated": "Significantly elevated"
},
"sleep": {
"FarTooShort": "Far too short",
"TooShort": "Too short",
"OnTarget": "On target",
"SlightlyLong": "Slightly long",
"FarTooLong": "Far too long"
},
"bodyFat": {
"Essential": "Essential",
"Athletic": "Athletic",
"Fitness": "Fitness",
"Average": "Promedio",
"Obese": "Obese"
},
"steps": {
"VeryLow": "Very low",
"LowActive": "Low active",
"ModeratelyActive": "Moderately active",
"Active": "Activo",
"VeryActive": "Very active"
},
"general": {
"Good": "Bien",
"Moderate": "Moderate",
"Low": "Low",
"VeryGood": "Very good",
"VeryStable": "Very stable",
"Stable": "Stable",
"Fluctuating": "Fluctuating"
},
"alerts": {
"bmiBelowNormalTitle": "BMI below normal range",
"bmiBelowNormalMessage": "Your BMI of {bmi} is below the normal range (18.5–24.9).",
"bmiOverweightTitle": "BMI in overweight range",
"bmiOverweightMessage": "Your BMI of {bmi} is in the overweight range. Regular exercise and a balanced diet can help.",
"bmiObesityTitle": "BMI in obesity range",
"bmiObesityMessage": "Your BMI of {bmi} is in the obesity range.",
"bmiNormalTitle": "BMI in normal range",
"bmiNormalMessage": "Your BMI of {bmi} is in the healthy range.",
"bpDangerTitle": "Blood pressure significantly elevated",
"bpDangerMessage": "Your average blood pressure ({sys}/{dia}) is classified as \"{category}\".",
"bpWarningTitle": "Blood pressure slightly elevated",
"bpWarningMessage": "Your average blood pressure ({sys}/{dia}) is in the \"{category}\" range.",
"bpTargetGoodTitle": "Good blood pressure target adherence",
"bpTargetGoodMessage": "{pct}% of your readings are within the target range.",
"bpTargetBadTitle": "Blood pressure often outside target range",
"bpTargetBadMessage": "Only {pct}% of your readings are within the target range.",
"weightIncreasingTitle": "Weight increasing",
"weightIncreasingMessage": "Your weight is increasing by approx. {change} kg per week over the last 30 days.",
"weightDecreasingTitle": "Weight decreasing",
"weightDecreasingMessage": "Your weight is decreasing by approx. {change} kg per week over the last 30 days.",
"pulseOutliersTitle": "Pulse outliers detected",
"pulseOutliersMessage": "{count} unusual pulse readings in the last 30 days.",
"complianceLowTitle": "Low compliance: {name}",
"complianceLowMessage": "Your 7-day compliance for {name} is only {pct}%. Regular intake is important.",
"complianceGoodTitle": "Excellent compliance: {name}",
"complianceGoodMessage": "{pct}% compliance over the last 7 days. Keep it up!"
}
},
"targets": {
"title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.",
"weight": "Peso",
"bloodPressure": "Presión arterial",
"bloodPressureOnTarget": "Blood pressure on target",
"restingPulse": "Resting pulse",
"sleepDuration": "Sleep duration",
"bmi": "IMC",
"bodyFat": "Grasa corporal",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Pasos",
"average30d": "30-day average:",
"consistency": {
"ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Fermer",
"loading": "Chargement…...",
"error": "Erreur",
"success": "Succès",
"saved": "Enregistré",
"confirm": "Confirmer",
"back": "Retour",
"next": "Suivant",
"yes": "Oui",
"no": "Non",
"search": "Rechercher",
"filter": "Filtrer",
"noData": "Aucune donnée disponible",
"optional": "Facultatif",
"required": "Requis",
"all": "Tout",
"active": "Actif",
"inactive": "Inactif",
"enabled": "Activé",
"disabled": "Désactivé",
"networkError": "Erreur réseau",
"unknownError": "Erreur inconnue",
"notLoggedIn": "Non connecté",
"noAccess": "Accès refusé",
"copied": "Copied!",
"or": "ou",
"unknown": "Inconnu",
"replace": "Remplacer",
"add": "Ajouter",
"import": "Importer",
"test": "Tester",
@@ -169,7 +157,6 @@
"dashboard": "Tableau de bord",
"measurements": "Measurements",
"medications": "Médicaments",
"charts": "Historique",
"insights": "Analyses",
"targets": "Targets",
"achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": {
"login": "Se connecter",
"register": "S'inscrire",
"loginTitle": "Se connecter",
"registerTitle": "S'inscrire",
"username": "Nom d'utilisateur",
"password": "Mot de passe",
"email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed",
"createAccount": "Create account",
"newAccount": "Create new account",
"backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.",
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
"passwordTooShort": "Password must be at least {minLength} characters long."
},
"dashboard": {
"title": "Tableau de bord",
"subtitle": "Your health overview",
"greeting": {
"morning": "Good morning",
"day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Pas",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "TA-cible",
"days30Short": "30d",
"medications": "Médicaments",
"insightsPreview": "AI Insights preview",
"lastMeasurement": "Last measurement",
"noMeasurements": "No measurements yet",
"trend": "Tendance",
"trendUp": "rising",
"trendDown": "falling",
"trendStable": "stable",
"quickEntry": "Quick entry",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)",
"complianceGood": "Bien",
"complianceLow": "Low",
"mood": "Humeur",
"customizeTitle": "Dashboard layout",
"customizeSubtitle": "Choose which cards appear on your dashboard and in what order. Defaults work out of the box.",
"layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection",
"nextInjection": "Next injection",
"weightDelta": "since start",
"inDays": "in {count} days",
"empty": {
"title": "No active GLP-1 medication",
"description": "Add a GLP-1 receptor agonist (Mounjaro, Ozempic, Wegovy, …) to surface dose, schedule, and weight response here."
}
"inDays": "in {count} days"
}
},
"measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement",
"type": "Type",
"value": "Valeur",
"unit": "Unit",
"date": "Date",
"source": "Source",
"notes": "Notes",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours",
"unitSteps": "Pas",
"sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.",
"allTypes": "All types",
"measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Actions",
"deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} de{total}",
"showing": "Showing",
"of": "de",
"entries": "entries"
"pageInfo": "Page {page} de{total}"
},
"mood": {
"title": "Humeur",
@@ -404,14 +357,9 @@
"levelOkay": "Okay",
"levelSchlecht": "Mauvais",
"levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods",
"entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication",
"newMedication": "New medication",
"firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications",
"retryLoad": "Réessayer",
"name": "Nom",
"dose": "Dose",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "De",
"scheduleTo": "À",
"scheduleLabel": "Label",
"scheduleDays": "Days",
"scheduleDaily": "Daily",
"active": "Actif",
"inactive": "Paused",
"intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Pris",
"markSkipped": "Sauté",
"deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Observance",
"import": "Importer",
"importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status",
"changeFailed": "Change failed",
"categoryBloodPressure": "Tension artérielle",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid",
"categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes",
"viewHistory": "Historique",
"today": "Aujourd'hui",
"yesterday": "Hier",
"tomorrow": "Demain",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — set to enable the low-stock dashboard caption. Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank to disable inventory tracking.",
"glp1Headline": "{name} · {dose}",
"glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Suivant:{label}",
"glp1NextInjectionDays": "Suivant:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Actions",
"pageInfo": "Page {page} de{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green",
@@ -872,24 +798,13 @@
}
},
"charts": {
"title": "Historique",
"subtitle": "Visualization of your health data",
"timeRange": "Time range",
"days7": "7 days",
"days30": "30 days",
"days90": "90 days",
"days365": "1 year",
"daysAll": "Tout",
"weight": "Poids",
"bloodPressure": "Tension artérielle",
"pulse": "Pouls",
"bodyFat": "Masse grasse",
"sleep": "Sommeil",
"steps": "Pas",
"compliance": "Observance",
"noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg",
"points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend",
"trend": "Tendance",
"targetRanges": "Target ranges",
"perWeek": "/week",
"totalDelta": "Total",
"selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:",
"mood": "Humeur",
"moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Terrible",
"moodLabel2": "Mauvais",
"moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target"
},
"chart": {
@@ -989,25 +901,15 @@
},
"captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": {
"lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year"
},
"tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year yet"
},
"insightsCallout": {
"lastMonth": "Tracking against last month",
"lastYear": "Tracking against last year"
},
"notAvailableForCompliance": "Comparison N/A for compliance"
},
"insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
},
"thresholds": {
"title": "Personal thresholds",
"subtitle": "Override the computed target range for any metric. Defaults stay in effect until you set a value here.",
"defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto",
"overrideModeLabel": "Override",
"resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water",
"metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.",
"loadError": "Could not load thresholds"
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"setupDescription": "Set up your profile to get started. You can change this later in Settings.",
"completeSetup": "Complete setup",
"skip": "Ignorer",
"medicationsTitle": "Do you take medications?",
"medicationsDescription": "Add your medications to enable reminders and compliance tracking.",
"medNamePlaceholder": "Nom",
"medDosePlaceholder": "Dose",
"notificationsTitle": "Reminders",
"notificationsDescription": "HealthLog can remind you about your medications. Configure this later in Settings.",
"telegramHint": "Reminders via Telegram bot with snooze buttons",
"webPushHint": "Browser notifications directly to your device",
"notificationsLater": "You can set this up anytime in Settings.",
"targetsTitle": "Target Values",
"targetsDescription": "Set optional target values for blood pressure and weight.",
"targetSys": "Systolic (mmHg)",
"targetDia": "Diastolic (mmHg)",
"targetWeight": "Target weight (kg)",
"errorProfile": "Could not save your profile. Please try again.",
"errorMedication": "Could not add the medication \"{name}\". Please try again or add it later in Medications.",
"errorTargets": "Could not save your target values. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"medScheduleHint": "We'll add a default reminder window (08:00–09:00 daily). You can adjust it anytime in Medications.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Étape 3 sur 4",
"step4of4": "Étape 4 sur 4"
},
"welcome": {
"title": "Bienvenue sur HealthLog",
"carouselLabel": "Bienvenue — trois diapositives",
"slideOf": "Diapositive {current} sur {total}",
"gotoSlide": "Aller à la diapositive {index}",
"prevSlide": "Diapositive précédente",
"nextSlide": "Diapositive suivante",
"slide1": {
"title": "Vos données de santé vous appartiennent",
"body": "HealthLog conserve chaque mesure sur votre propre infrastructure. Sans publicité, sans partage à des tiers, sans dépendance à un compte."
},
"slide2": {
"title": "Une seule vue pour toutes vos sources",
"body": "Apple Health, Withings et la saisie manuelle se rejoignent dans un historique cohérent, avec une priorité de source par métrique que vous contrôlez."
},
"slide3": {
"title": "Un coach et des insights pertinents",
"body": "Une analyse fondée sur vos chiffres, chaque conclusion étant traçable. Apportez votre propre clé, aucun entraînement sur vos données."
},
"cta": "Commencer"
},
"goals": {
"title": "Que souhaitez-vous suivre ?",
"body": "Sélectionnez les domaines qui comptent pour vous. Le tableau de bord et les rappels s'y adapteront.",
@@ -1669,10 +1526,8 @@
"title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} de{total} Terminé",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": {
"profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go."
},
"settings": {
"title": "Paramètres",
"subtitle": "Profile, Security & Connections",
"researchMode": {
"sectionTitle": "Mode Recherche",
"subtitle": "Affichage optionnel d'une courbe de niveau estimé de médicament GLP-1, dérivée de la pharmacocinétique de population publiée par l'EMA. Lecture seule — jamais une mesure ni un conseil médical.",
@@ -1841,18 +1694,9 @@
"coming_soon": "Moving here with the next release update."
}
},
"sectionsTitle": "Paramètres",
"categoryGeneral": "General",
"categoryNotifications": "Notifications",
"categoryAi": "AI",
"categoryPersonalization": "Personalization",
"categoryIntegration": "Integration",
"categoryApi": "API",
"profile": "Profil",
"security": "Sécurité",
"language": "Langue",
"languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nom d'utilisateur",
"height": "Height (cm)",
"dateOfBirth": "Date de naissance",
@@ -1930,16 +1774,6 @@
"webPushActive": "Actif",
"kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.",
"kiInsightsBenefitsTitle": "Benefits with OpenAI key",
"kiInsightsBenefit1": "Daily summaries for general status, blood pressure, weight, pulse, BMI, and medication compliance.",
"kiInsightsBenefit2": "Better trend and correlation interpretation based on your latest 30 daily measurement points per area.",
"kiInsightsBenefit3": "Automatic background refresh so the Insights page always shows up-to-date assessments.",
"createApiKeyHint": "Create your API key at:",
"createApiKeyLinkLabel": "platform.openai.com/api-keys",
"apiKey": "API Key",
"apiKeyStored": "Key stored — enter new one to replace",
"apiKeySaved": "API key saved",
"apiKeyRemoved": "API key removed",
"codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated",
"ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.",
"disconnect": "Disconnect",
"connectChatgptHeading": "Connect with ChatGPT",
"connectChatgptBody": "Link your ChatGPT Pro/Max account to get AI-powered health analyses based on current medical guidelines. No additional API costs.",
"connectChatgptCta": "Connect with ChatGPT",
"deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Annuler",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
"adminFallback": "Alternatively, HealthLog will use the AI provider configured by the administrator.",
"personalProviderHeading": "AI provider (personal)",
"personalProviderBody": "Your own AI provider overrides the admin setting. Leave blank for the default. For ChatGPT Pro/Max OAuth use the connect button above.",
"providerLabel": "Provider",
"providerOptionDefault": "— Default (Admin/Codex) —",
"providerOptionOpenai": "OpenAI (API key)",
"providerOptionAnthropic": "Anthropic (Claude)",
"providerOptionLocal": "Local (OpenAI-compatible)",
"modelLabel": "Model",
"modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name",
"openaiKeyLabel": "OpenAI API key",
"openaiKeyHelp": "Your own key — not connected to your ChatGPT subscription. For the subscription use the connect button above.",
"anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})",
"savedShort": "(saved)",
"saveCta": "Enregistrer",
"testCta": "Test connection",
"removeKeyCta": "Remove saved key",
"keyRemoved": "Saved key removed",
"removeKeyConfirmTitle": "Remove saved API key?",
"removeKeyConfirmBody": "Insights for this provider will fall back to the admin/Codex provider until you save a new key.",
"saved": "Enregistré",
"saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Erreur",
"providerChain": {
"heading": "AI provider fallback chain",
"activeLine": "Active provider: {provider}",
"cachedSuffix": "(cached: {provider})",
"chainLine": "Configured chain: {chain}",
"managementHint": "Reordering and on/off toggles arrive in the next release.",
"none": "none configured",
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now",
"withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?",
@@ -2109,15 +1910,6 @@
}
}
},
"integrationStatus": {
"stateConnected": "Connected",
"stateError": "Erreur",
"stateReauthRequired": "Reconnect required",
"stateDisconnected": "Disconnected",
"consecutiveFailures": "{count}/{threshold} consecutive failures",
"lastSuccess": "Last successful sync",
"lastAttempt": "Last attempt"
},
"integrationPill": {
"connected": "Connected",
"errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
},
"apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Actions",
"noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method",
"apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example",
"export": "Data Export",
"exportDescription": "Export all your health data.",
"exportJson": "JSON Export",
"exportCsv": "CSV Export",
"doctorReport": "Doctor Report (PDF)",
"auditLog": "Activity Log",
"auditLogHidden": "Log hidden.",
"auditLogShowing": "Showing last {count} de{total} entries",
"auditNoActivities": "No activities found.",
"auditAction": "Action",
"auditCategory": "Category",
"auditIp": "IP",
"auditLocation": "Location",
"auditTimestamp": "Heure",
"auditOther": "Other",
"auditCategoryAuth": "Auth",
"auditCategoryData": "Données",
"auditCategoryIntegration": "Integration",
"auditCategoryAI": "AI",
"auditCategoryAdmin": "Admin",
"auditActionAuthRegister": "Registration",
"auditActionAuthLogin": "Connexion",
"auditActionAuthLoginPasskey": "Passkey login",
"auditActionAuthLoginPassword": "Password login",
"auditActionAuthLoginFailed": "Failed login",
"auditActionAuthLogout": "Déconnexion",
"auditActionAuthPasskeyRegister": "Passkey added",
"auditActionAuthPasskeyDelete": "Passkey deleted",
"auditActionAuthPasswordChange": "Password changed",
"auditActionMeasurementCreate": "Measurement created",
"auditActionMeasurementUpdate": "Measurement updated",
"auditActionMeasurementDelete": "Measurement deleted",
"auditActionMedicationCreate": "Medication created",
"auditActionMedicationUpdate": "Medication updated",
"auditActionMedicationDelete": "Medication deleted",
"auditActionMedicationIntake": "Intake recorded",
"auditActionMedicationIngestExternal": "External intake",
"auditActionWithingsConnect": "Withings connected",
"auditActionWithingsDisconnect": "Withings disconnected",
"auditActionExportDownload": "Export downloaded",
"auditActionInsightsGenerate": "AI insight generated",
"auditActionAdminUserUpdate": "Admin: User updated",
"auditActionAdminUserResetPassword": "Admin: Password reset",
"auditActionAdminSettingsUpdate": "Admin: Settings changed",
"collapse": "Collapse",
"expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently",
"saved": "Enregistré",
"savingError": "Error saving",
"adminAreaTitle": "Admin area",
"adminAreaDescription": "System-wide settings and user management are available in the admin console.",
"openAdminConsole": "Open admin console",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration",
"subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status",
"version": "Version",
"database": "Database",
"databaseConnected": "Connected",
"databaseError": "Erreur",
"gitCommit": "Git Commit",
"startedAt": "Started",
"users": "Users",
"measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)",
"memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Intégrations",
"sectionMedication": "Médicaments",
"sectionManagement": "Management",
"umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management",
"userName": "Nom",
"userEmail": "E-mail",
@@ -2438,7 +2156,6 @@
"toUser": "Make user",
"toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used",
"tokenCreated": "Created",
"tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview",
"allAuthEvents": "All auth events",
"failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"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.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Succès",
"outcomeFailed": "Failed",
"auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"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.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent",
"feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open",
"tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted",
"actions": "Actions",
"details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature",
"categoryQuestion": "Question",
"categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata",
"metaUrl": "URL",
"metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed",
"updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by",
"sectionTitle": "Feedback"
"submittedBy": "Submitted by"
},
"shell": {
"overview": "Vue d'ensemble",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events."
},
"auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)",
"filterAction": "Action",
"filterActionAll": "All actions",
"filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range",
"range24h": "Last 24 hours",
"range7d": "7 derniers jours",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup",
"loading": "Loading backups...",
"loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!",
"completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement"
},
"hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!",
"description": "Tap to see the surprise."
"title": "You unlocked a hidden achievement!"
},
"dashboardCard": {
"title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title",
"description": "Description",
"descriptionPlaceholder": "Describe the bug in detail. What did you do? What happened? What did you expect?",
"screenshot": "Screenshot (optional)",
"screenshotPreview": "Screenshot preview",
"attachScreenshot": "Attach screenshot",
"imageOnly": "Only image files allowed",
"tooLarge": "Screenshot is too large (max 5 MB)",
"submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report",
"notConfiguredTitle": "Bug reports not available yet",
"notConfiguredUser": "Bug reporting is disabled on this server. Please contact your administrator.",
"notConfiguredAdmin": "Bug reporting requires a GitHub integration (issue token + repository). Configure it in the admin panel under Settings → Bug reports.",
"openAdminSettings": "Open admin settings",
"category": "Type",
"categoryBug": "Bug report",
"categoryFeature": "Feature request",
@@ -3058,8 +2742,7 @@
"githubEscalationNote": "Your feedback is stored locally. If the admin enables GitHub integration, it can be promoted to a public issue on request.",
"internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.",
"disabledError": "Bug reports are disabled by the administrator."
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Notifications",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Désactivé",
"eventMedicationReminder": "Medication Reminder",
"eventMedicationReminderDesc": "Reminder when an intake is due.",
"eventMeasurementAnomaly": "Anomalous Measurement",
"eventMeasurementAnomalyDesc": "Warning for unusual measurements (e.g., high blood pressure).",
"eventComplianceLow": "Low Compliance",
"eventComplianceLowDesc": "Notification when medication compliance drops below a threshold.",
"eventWithingsSyncFailed": "Withings Sync Failed",
"eventWithingsSyncFailedDesc": "Alert when the automatic Withings data sync fails.",
"eventSystemAlert": "Alerte système",
"eventSystemAlertDesc": "Messages système importants et avis administratifs.",
"eventPersonalRecord": "Record personnel",
"eventPersonalRecordDesc": "Notification lorsqu'un nouveau record est atteint pour une mesure ou un entraînement. Désactivé par défaut."
},
"format": {
"dateShort": "{month}/{day}/{year}",
"timeShort": "{hours}:{minutes}",
"dateTime": "{month}/{day}/{year}, {hours}:{minutes}"
},
"i18n": {
"maintainershipBanner": {
"notice": "Cette langue est rédigée par IA, y compris les instructions critiques pour la sécurité du Coach. Une validation automatique tourne en CI ; signalez toute régression du Coach IA sur GitHub.",
@@ -3094,108 +2762,10 @@
"dismiss": "Ignorer"
}
},
"classifications": {
"bmi": {
"Underweight": "Underweight",
"Normal": "Normal",
"Overweight": "Overweight",
"ObesityGradeI": "Obesity Grade I",
"ObesityGradeII": "Obesity Grade II",
"ObesityGradeIII": "Obesity Grade III"
},
"bp": {
"Optimal": "Optimal",
"Normal": "Normal",
"HighNormal": "High-normal",
"HypertensionGrade1": "Hypertension Grade 1",
"HypertensionGrade2": "Hypertension Grade 2",
"HypertensionGrade3": "Hypertension Grade 3"
},
"pulse": {
"Bradycardia": "Bradycardia",
"Normal": "Normal",
"Elevated": "Elevated",
"Tachycardia": "Tachycardia"
},
"pulseTarget": {
"SignificantlyLow": "Significantly low",
"SlightlyLow": "Slightly low",
"OnTarget": "On target",
"SlightlyElevated": "Slightly elevated",
"SignificantlyElevated": "Significantly elevated"
},
"sleep": {
"FarTooShort": "Far too short",
"TooShort": "Too short",
"OnTarget": "On target",
"SlightlyLong": "Slightly long",
"FarTooLong": "Far too long"
},
"bodyFat": {
"Essential": "Essential",
"Athletic": "Athletic",
"Fitness": "Fitness",
"Average": "Moyenne",
"Obese": "Obese"
},
"steps": {
"VeryLow": "Very low",
"LowActive": "Low active",
"ModeratelyActive": "Moderately active",
"Active": "Actif",
"VeryActive": "Very active"
},
"general": {
"Good": "Bien",
"Moderate": "Moderate",
"Low": "Low",
"VeryGood": "Very good",
"VeryStable": "Very stable",
"Stable": "Stable",
"Fluctuating": "Fluctuating"
},
"alerts": {
"bmiBelowNormalTitle": "BMI below normal range",
"bmiBelowNormalMessage": "Your BMI of {bmi} is below the normal range (18.5–24.9).",
"bmiOverweightTitle": "BMI in overweight range",
"bmiOverweightMessage": "Your BMI of {bmi} is in the overweight range. Regular exercise and a balanced diet can help.",
"bmiObesityTitle": "BMI in obesity range",
"bmiObesityMessage": "Your BMI of {bmi} is in the obesity range.",
"bmiNormalTitle": "BMI in normal range",
"bmiNormalMessage": "Your BMI of {bmi} is in the healthy range.",
"bpDangerTitle": "Blood pressure significantly elevated",
"bpDangerMessage": "Your average blood pressure ({sys}/{dia}) is classified as \"{category}\".",
"bpWarningTitle": "Blood pressure slightly elevated",
"bpWarningMessage": "Your average blood pressure ({sys}/{dia}) is in the \"{category}\" range.",
"bpTargetGoodTitle": "Good blood pressure target adherence",
"bpTargetGoodMessage": "{pct}% of your readings are within the target range.",
"bpTargetBadTitle": "Blood pressure often outside target range",
"bpTargetBadMessage": "Only {pct}% of your readings are within the target range.",
"weightIncreasingTitle": "Weight increasing",
"weightIncreasingMessage": "Your weight is increasing by approx. {change} kg per week over the last 30 days.",
"weightDecreasingTitle": "Weight decreasing",
"weightDecreasingMessage": "Your weight is decreasing by approx. {change} kg per week over the last 30 days.",
"pulseOutliersTitle": "Pulse outliers detected",
"pulseOutliersMessage": "{count} unusual pulse readings in the last 30 days.",
"complianceLowTitle": "Low compliance: {name}",
"complianceLowMessage": "Your 7-day compliance for {name} is only {pct}%. Regular intake is important.",
"complianceGoodTitle": "Excellent compliance: {name}",
"complianceGoodMessage": "{pct}% compliance over the last 7 days. Keep it up!"
}
},
"targets": {
"title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.",
"weight": "Poids",
"bloodPressure": "Tension artérielle",
"bloodPressureOnTarget": "Blood pressure on target",
"restingPulse": "Resting pulse",
"sleepDuration": "Sleep duration",
"bmi": "IMC",
"bodyFat": "Masse grasse",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Pas",
"average30d": "30-day average:",
"consistency": {
"ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Chiudi",
"loading": "Caricamento…...",
"error": "Errore",
"success": "Successo",
"saved": "Salvato",
"confirm": "Conferma",
"back": "Indietro",
"next": "Avanti",
"yes": "Sì",
"no": "No",
"search": "Cerca",
"filter": "Filtra",
"noData": "Nessun dato disponibile",
"optional": "Opzionale",
"required": "Obbligatorio",
"all": "Tutto",
"active": "Attivo",
"inactive": "Inattivo",
"enabled": "Abilitato",
"disabled": "Disabilitato",
"networkError": "Errore di rete",
"unknownError": "Errore sconosciuto",
"notLoggedIn": "Non connesso",
"noAccess": "Accesso negato",
"copied": "Copied!",
"or": "o",
"unknown": "Sconosciuto",
"replace": "Sostituisci",
"add": "Aggiungi",
"import": "Importa",
"test": "Verifica",
@@ -169,7 +157,6 @@
"dashboard": "Cruscotto",
"measurements": "Measurements",
"medications": "Farmaci",
"charts": "Cronologia",
"insights": "Analisi",
"targets": "Targets",
"achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": {
"login": "Accedi",
"register": "Registrati",
"loginTitle": "Accedi",
"registerTitle": "Registrati",
"username": "Nome utente",
"password": "Password",
"email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed",
"createAccount": "Create account",
"newAccount": "Create new account",
"backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.",
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
"passwordTooShort": "Password must be at least {minLength} characters long."
},
"dashboard": {
"title": "Cruscotto",
"subtitle": "Your health overview",
"greeting": {
"morning": "Good morning",
"day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Passi",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "PA-target",
"days30Short": "30d",
"medications": "Farmaci",
"insightsPreview": "AI Insights preview",
"lastMeasurement": "Last measurement",
"noMeasurements": "No measurements yet",
"trend": "Tendenza",
"trendUp": "rising",
"trendDown": "falling",
"trendStable": "stable",
"quickEntry": "Quick entry",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)",
"complianceGood": "Bene",
"complianceLow": "Low",
"mood": "Umore",
"customizeTitle": "Dashboard layout",
"customizeSubtitle": "Choose which cards appear on your dashboard and in what order. Defaults work out of the box.",
"layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection",
"nextInjection": "Next injection",
"weightDelta": "since start",
"inDays": "in {count} days",
"empty": {
"title": "No active GLP-1 medication",
"description": "Add a GLP-1 receptor agonist (Mounjaro, Ozempic, Wegovy, …) to surface dose, schedule, and weight response here."
}
"inDays": "in {count} days"
}
},
"measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement",
"type": "Tipo",
"value": "Valore",
"unit": "Unit",
"date": "Data",
"source": "Source",
"notes": "Note",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours",
"unitSteps": "Passi",
"sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.",
"allTypes": "All types",
"measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Azioni",
"deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} di{total}",
"showing": "Showing",
"of": "di",
"entries": "entries"
"pageInfo": "Page {page} di{total}"
},
"mood": {
"title": "Umore",
@@ -404,14 +357,9 @@
"levelOkay": "Okay",
"levelSchlecht": "Male",
"levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods",
"entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication",
"newMedication": "New medication",
"firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications",
"retryLoad": "Riprova",
"name": "Nome",
"dose": "Dose",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "Da",
"scheduleTo": "A",
"scheduleLabel": "Label",
"scheduleDays": "Days",
"scheduleDaily": "Daily",
"active": "Attivo",
"inactive": "Paused",
"intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Assunta",
"markSkipped": "Saltata",
"deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Aderenza",
"import": "Importa",
"importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status",
"changeFailed": "Change failed",
"categoryBloodPressure": "Pressione arteriosa",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid",
"categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes",
"viewHistory": "Cronologia",
"today": "Oggi",
"yesterday": "Ieri",
"tomorrow": "Domani",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — set to enable the low-stock dashboard caption. Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank to disable inventory tracking.",
"glp1Headline": "{name} · {dose}",
"glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Avanti:{label}",
"glp1NextInjectionDays": "Avanti:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Azioni",
"pageInfo": "Page {page} di{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green",
@@ -872,24 +798,13 @@
}
},
"charts": {
"title": "Cronologia",
"subtitle": "Visualization of your health data",
"timeRange": "Time range",
"days7": "7 days",
"days30": "30 days",
"days90": "90 days",
"days365": "1 year",
"daysAll": "Tutto",
"weight": "Peso",
"bloodPressure": "Pressione arteriosa",
"pulse": "Polso",
"bodyFat": "Massa grassa",
"sleep": "Sonno",
"steps": "Passi",
"compliance": "Aderenza",
"noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg",
"points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend",
"trend": "Tendenza",
"targetRanges": "Target ranges",
"perWeek": "/week",
"totalDelta": "Totale",
"selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:",
"mood": "Umore",
"moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Pessimo",
"moodLabel2": "Male",
"moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target"
},
"chart": {
@@ -989,25 +901,15 @@
},
"captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": {
"lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year"
},
"tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year yet"
},
"insightsCallout": {
"lastMonth": "Tracking against last month",
"lastYear": "Tracking against last year"
},
"notAvailableForCompliance": "Comparison N/A for compliance"
},
"insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
},
"thresholds": {
"title": "Personal thresholds",
"subtitle": "Override the computed target range for any metric. Defaults stay in effect until you set a value here.",
"defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto",
"overrideModeLabel": "Override",
"resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water",
"metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.",
"loadError": "Could not load thresholds"
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"setupDescription": "Set up your profile to get started. You can change this later in Settings.",
"completeSetup": "Complete setup",
"skip": "Salta",
"medicationsTitle": "Do you take medications?",
"medicationsDescription": "Add your medications to enable reminders and compliance tracking.",
"medNamePlaceholder": "Nome",
"medDosePlaceholder": "Dose",
"notificationsTitle": "Reminders",
"notificationsDescription": "HealthLog can remind you about your medications. Configure this later in Settings.",
"telegramHint": "Reminders via Telegram bot with snooze buttons",
"webPushHint": "Browser notifications directly to your device",
"notificationsLater": "You can set this up anytime in Settings.",
"targetsTitle": "Target Values",
"targetsDescription": "Set optional target values for blood pressure and weight.",
"targetSys": "Systolic (mmHg)",
"targetDia": "Diastolic (mmHg)",
"targetWeight": "Target weight (kg)",
"errorProfile": "Could not save your profile. Please try again.",
"errorMedication": "Could not add the medication \"{name}\". Please try again or add it later in Medications.",
"errorTargets": "Could not save your target values. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"medScheduleHint": "We'll add a default reminder window (08:00–09:00 daily). You can adjust it anytime in Medications.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Passo 3 di 4",
"step4of4": "Passo 4 di 4"
},
"welcome": {
"title": "Benvenuto su HealthLog",
"carouselLabel": "Benvenuto — tre slide",
"slideOf": "Slide {current} di {total}",
"gotoSlide": "Vai alla slide {index}",
"prevSlide": "Slide precedente",
"nextSlide": "Slide successiva",
"slide1": {
"title": "I tuoi dati di salute, di tua proprietà",
"body": "HealthLog conserva ogni misurazione sulla tua infrastruttura. Niente pubblicità, nessuna condivisione con terzi, nessun vincolo di account."
},
"slide2": {
"title": "Un'unica vista per ogni sorgente",
"body": "Apple Health, Withings e gli inserimenti manuali confluiscono in una cronologia coerente, con priorità di sorgente per metrica decisa da te."
},
"slide3": {
"title": "Coach e Insights con sostanza",
"body": "Un'analisi basata solo sui tuoi dati, con ogni affermazione tracciabile. Bring-your-own-key: nessun addestramento sui tuoi dati."
},
"cta": "Iniziamo"
},
"goals": {
"title": "Cosa vuoi monitorare?",
"body": "Scegli gli ambiti che ti interessano. Dashboard e promemoria si adatteranno alle tue scelte.",
@@ -1669,10 +1526,8 @@
"title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} di{total} Fatto",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": {
"profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go."
},
"settings": {
"title": "Impostazioni",
"subtitle": "Profile, Security & Connections",
"researchMode": {
"sectionTitle": "Modalità Ricerca",
"subtitle": "Visualizzazione opzionale di una curva stimata del livello del farmaco GLP-1, derivata dalla farmacocinetica di popolazione pubblicata dall'EMA. Solo lettura: mai una misurazione né un consiglio medico.",
@@ -1841,18 +1694,9 @@
"coming_soon": "Moving here with the next release update."
}
},
"sectionsTitle": "Impostazioni",
"categoryGeneral": "General",
"categoryNotifications": "Notifiche",
"categoryAi": "AI",
"categoryPersonalization": "Personalization",
"categoryIntegration": "Integration",
"categoryApi": "API",
"profile": "Profilo",
"security": "Sicurezza",
"language": "Lingua",
"languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nome utente",
"height": "Height (cm)",
"dateOfBirth": "Data di nascita",
@@ -1930,16 +1774,6 @@
"webPushActive": "Attivo",
"kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.",
"kiInsightsBenefitsTitle": "Benefits with OpenAI key",
"kiInsightsBenefit1": "Daily summaries for general status, blood pressure, weight, pulse, BMI, and medication compliance.",
"kiInsightsBenefit2": "Better trend and correlation interpretation based on your latest 30 daily measurement points per area.",
"kiInsightsBenefit3": "Automatic background refresh so the Insights page always shows up-to-date assessments.",
"createApiKeyHint": "Create your API key at:",
"createApiKeyLinkLabel": "platform.openai.com/api-keys",
"apiKey": "API Key",
"apiKeyStored": "Key stored — enter new one to replace",
"apiKeySaved": "API key saved",
"apiKeyRemoved": "API key removed",
"codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated",
"ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.",
"disconnect": "Disconnect",
"connectChatgptHeading": "Connect with ChatGPT",
"connectChatgptBody": "Link your ChatGPT Pro/Max account to get AI-powered health analyses based on current medical guidelines. No additional API costs.",
"connectChatgptCta": "Connect with ChatGPT",
"deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Annulla",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
"adminFallback": "Alternatively, HealthLog will use the AI provider configured by the administrator.",
"personalProviderHeading": "AI provider (personal)",
"personalProviderBody": "Your own AI provider overrides the admin setting. Leave blank for the default. For ChatGPT Pro/Max OAuth use the connect button above.",
"providerLabel": "Provider",
"providerOptionDefault": "— Default (Admin/Codex) —",
"providerOptionOpenai": "OpenAI (API key)",
"providerOptionAnthropic": "Anthropic (Claude)",
"providerOptionLocal": "Local (OpenAI-compatible)",
"modelLabel": "Model",
"modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name",
"openaiKeyLabel": "OpenAI API key",
"openaiKeyHelp": "Your own key — not connected to your ChatGPT subscription. For the subscription use the connect button above.",
"anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})",
"savedShort": "(saved)",
"saveCta": "Salva",
"testCta": "Test connection",
"removeKeyCta": "Remove saved key",
"keyRemoved": "Saved key removed",
"removeKeyConfirmTitle": "Remove saved API key?",
"removeKeyConfirmBody": "Insights for this provider will fall back to the admin/Codex provider until you save a new key.",
"saved": "Salvato",
"saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Errore",
"providerChain": {
"heading": "AI provider fallback chain",
"activeLine": "Active provider: {provider}",
"cachedSuffix": "(cached: {provider})",
"chainLine": "Configured chain: {chain}",
"managementHint": "Reordering and on/off toggles arrive in the next release.",
"none": "none configured",
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now",
"withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?",
@@ -2109,15 +1910,6 @@
}
}
},
"integrationStatus": {
"stateConnected": "Connected",
"stateError": "Errore",
"stateReauthRequired": "Reconnect required",
"stateDisconnected": "Disconnected",
"consecutiveFailures": "{count}/{threshold} consecutive failures",
"lastSuccess": "Last successful sync",
"lastAttempt": "Last attempt"
},
"integrationPill": {
"connected": "Connected",
"errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
},
"apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Azioni",
"noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method",
"apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example",
"export": "Data Export",
"exportDescription": "Export all your health data.",
"exportJson": "JSON Export",
"exportCsv": "CSV Export",
"doctorReport": "Doctor Report (PDF)",
"auditLog": "Activity Log",
"auditLogHidden": "Log hidden.",
"auditLogShowing": "Showing last {count} di{total} entries",
"auditNoActivities": "No activities found.",
"auditAction": "Action",
"auditCategory": "Category",
"auditIp": "IP",
"auditLocation": "Location",
"auditTimestamp": "Ora",
"auditOther": "Other",
"auditCategoryAuth": "Auth",
"auditCategoryData": "Dati",
"auditCategoryIntegration": "Integration",
"auditCategoryAI": "AI",
"auditCategoryAdmin": "Admin",
"auditActionAuthRegister": "Registration",
"auditActionAuthLogin": "Accedi",
"auditActionAuthLoginPasskey": "Passkey login",
"auditActionAuthLoginPassword": "Password login",
"auditActionAuthLoginFailed": "Failed login",
"auditActionAuthLogout": "Disconnetti",
"auditActionAuthPasskeyRegister": "Passkey added",
"auditActionAuthPasskeyDelete": "Passkey deleted",
"auditActionAuthPasswordChange": "Password changed",
"auditActionMeasurementCreate": "Measurement created",
"auditActionMeasurementUpdate": "Measurement updated",
"auditActionMeasurementDelete": "Measurement deleted",
"auditActionMedicationCreate": "Medication created",
"auditActionMedicationUpdate": "Medication updated",
"auditActionMedicationDelete": "Medication deleted",
"auditActionMedicationIntake": "Intake recorded",
"auditActionMedicationIngestExternal": "External intake",
"auditActionWithingsConnect": "Withings connected",
"auditActionWithingsDisconnect": "Withings disconnected",
"auditActionExportDownload": "Export downloaded",
"auditActionInsightsGenerate": "AI insight generated",
"auditActionAdminUserUpdate": "Admin: User updated",
"auditActionAdminUserResetPassword": "Admin: Password reset",
"auditActionAdminSettingsUpdate": "Admin: Settings changed",
"collapse": "Collapse",
"expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently",
"saved": "Salvato",
"savingError": "Error saving",
"adminAreaTitle": "Admin area",
"adminAreaDescription": "System-wide settings and user management are available in the admin console.",
"openAdminConsole": "Open admin console",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration",
"subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status",
"version": "Version",
"database": "Database",
"databaseConnected": "Connected",
"databaseError": "Errore",
"gitCommit": "Git Commit",
"startedAt": "Started",
"users": "Users",
"measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)",
"memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integrazioni",
"sectionMedication": "Farmaci",
"sectionManagement": "Management",
"umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management",
"userName": "Nome",
"userEmail": "E-mail",
@@ -2438,7 +2156,6 @@
"toUser": "Make user",
"toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used",
"tokenCreated": "Created",
"tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview",
"allAuthEvents": "All auth events",
"failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"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.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Successo",
"outcomeFailed": "Failed",
"auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"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.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent",
"feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open",
"tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted",
"actions": "Azioni",
"details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature",
"categoryQuestion": "Question",
"categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata",
"metaUrl": "URL",
"metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed",
"updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by",
"sectionTitle": "Feedback"
"submittedBy": "Submitted by"
},
"shell": {
"overview": "Panoramica",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events."
},
"auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)",
"filterAction": "Action",
"filterActionAll": "All actions",
"filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range",
"range24h": "Last 24 hours",
"range7d": "Ultimi 7 giorni",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup",
"loading": "Loading backups...",
"loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!",
"completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement"
},
"hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!",
"description": "Tap to see the surprise."
"title": "You unlocked a hidden achievement!"
},
"dashboardCard": {
"title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title",
"description": "Descrizione",
"descriptionPlaceholder": "Describe the bug in detail. What did you do? What happened? What did you expect?",
"screenshot": "Screenshot (optional)",
"screenshotPreview": "Screenshot preview",
"attachScreenshot": "Attach screenshot",
"imageOnly": "Only image files allowed",
"tooLarge": "Screenshot is too large (max 5 MB)",
"submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report",
"notConfiguredTitle": "Bug reports not available yet",
"notConfiguredUser": "Bug reporting is disabled on this server. Please contact your administrator.",
"notConfiguredAdmin": "Bug reporting requires a GitHub integration (issue token + repository). Configure it in the admin panel under Settings → Bug reports.",
"openAdminSettings": "Open admin settings",
"category": "Tipo",
"categoryBug": "Bug report",
"categoryFeature": "Feature request",
@@ -3058,8 +2742,7 @@
"githubEscalationNote": "Your feedback is stored locally. If the admin enables GitHub integration, it can be promoted to a public issue on request.",
"internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.",
"disabledError": "Bug reports are disabled by the administrator."
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Notifiche",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Disabilitato",
"eventMedicationReminder": "Medication Reminder",
"eventMedicationReminderDesc": "Reminder when an intake is due.",
"eventMeasurementAnomaly": "Anomalous Measurement",
"eventMeasurementAnomalyDesc": "Warning for unusual measurements (e.g., high blood pressure).",
"eventComplianceLow": "Low Compliance",
"eventComplianceLowDesc": "Notification when medication compliance drops below a threshold.",
"eventWithingsSyncFailed": "Withings Sync Failed",
"eventWithingsSyncFailedDesc": "Alert when the automatic Withings data sync fails.",
"eventSystemAlert": "Avviso di sistema",
"eventSystemAlertDesc": "Messaggi di sistema importanti e avvisi amministrativi.",
"eventPersonalRecord": "Record personale",
"eventPersonalRecordDesc": "Notifica quando viene raggiunto un nuovo record per una metrica o un allenamento. Disattivato per impostazione predefinita."
},
"format": {
"dateShort": "{month}/{day}/{year}",
"timeShort": "{hours}:{minutes}",
"dateTime": "{month}/{day}/{year}, {hours}:{minutes}"
},
"i18n": {
"maintainershipBanner": {
"notice": "Questa lingua è redatta tramite IA, incluse le istruzioni critiche per la sicurezza del Coach. La validazione automatica gira in CI; segnali qualsiasi regressione del Coach IA su GitHub.",
@@ -3094,108 +2762,10 @@
"dismiss": "Chiudi"
}
},
"classifications": {
"bmi": {
"Underweight": "Underweight",
"Normal": "Normal",
"Overweight": "Overweight",
"ObesityGradeI": "Obesity Grade I",
"ObesityGradeII": "Obesity Grade II",
"ObesityGradeIII": "Obesity Grade III"
},
"bp": {
"Optimal": "Optimal",
"Normal": "Normal",
"HighNormal": "High-normal",
"HypertensionGrade1": "Hypertension Grade 1",
"HypertensionGrade2": "Hypertension Grade 2",
"HypertensionGrade3": "Hypertension Grade 3"
},
"pulse": {
"Bradycardia": "Bradycardia",
"Normal": "Normal",
"Elevated": "Elevated",
"Tachycardia": "Tachycardia"
},
"pulseTarget": {
"SignificantlyLow": "Significantly low",
"SlightlyLow": "Slightly low",
"OnTarget": "On target",
"SlightlyElevated": "Slightly elevated",
"SignificantlyElevated": "Significantly elevated"
},
"sleep": {
"FarTooShort": "Far too short",
"TooShort": "Too short",
"OnTarget": "On target",
"SlightlyLong": "Slightly long",
"FarTooLong": "Far too long"
},
"bodyFat": {
"Essential": "Essential",
"Athletic": "Athletic",
"Fitness": "Fitness",
"Average": "Media",
"Obese": "Obese"
},
"steps": {
"VeryLow": "Very low",
"LowActive": "Low active",
"ModeratelyActive": "Moderately active",
"Active": "Attivo",
"VeryActive": "Very active"
},
"general": {
"Good": "Bene",
"Moderate": "Moderate",
"Low": "Low",
"VeryGood": "Very good",
"VeryStable": "Very stable",
"Stable": "Stable",
"Fluctuating": "Fluctuating"
},
"alerts": {
"bmiBelowNormalTitle": "BMI below normal range",
"bmiBelowNormalMessage": "Your BMI of {bmi} is below the normal range (18.5–24.9).",
"bmiOverweightTitle": "BMI in overweight range",
"bmiOverweightMessage": "Your BMI of {bmi} is in the overweight range. Regular exercise and a balanced diet can help.",
"bmiObesityTitle": "BMI in obesity range",
"bmiObesityMessage": "Your BMI of {bmi} is in the obesity range.",
"bmiNormalTitle": "BMI in normal range",
"bmiNormalMessage": "Your BMI of {bmi} is in the healthy range.",
"bpDangerTitle": "Blood pressure significantly elevated",
"bpDangerMessage": "Your average blood pressure ({sys}/{dia}) is classified as \"{category}\".",
"bpWarningTitle": "Blood pressure slightly elevated",
"bpWarningMessage": "Your average blood pressure ({sys}/{dia}) is in the \"{category}\" range.",
"bpTargetGoodTitle": "Good blood pressure target adherence",
"bpTargetGoodMessage": "{pct}% of your readings are within the target range.",
"bpTargetBadTitle": "Blood pressure often outside target range",
"bpTargetBadMessage": "Only {pct}% of your readings are within the target range.",
"weightIncreasingTitle": "Weight increasing",
"weightIncreasingMessage": "Your weight is increasing by approx. {change} kg per week over the last 30 days.",
"weightDecreasingTitle": "Weight decreasing",
"weightDecreasingMessage": "Your weight is decreasing by approx. {change} kg per week over the last 30 days.",
"pulseOutliersTitle": "Pulse outliers detected",
"pulseOutliersMessage": "{count} unusual pulse readings in the last 30 days.",
"complianceLowTitle": "Low compliance: {name}",
"complianceLowMessage": "Your 7-day compliance for {name} is only {pct}%. Regular intake is important.",
"complianceGoodTitle": "Excellent compliance: {name}",
"complianceGoodMessage": "{pct}% compliance over the last 7 days. Keep it up!"
}
},
"targets": {
"title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.",
"weight": "Peso",
"bloodPressure": "Pressione arteriosa",
"bloodPressureOnTarget": "Blood pressure on target",
"restingPulse": "Resting pulse",
"sleepDuration": "Sleep duration",
"bmi": "IMC",
"bodyFat": "Massa grassa",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Passi",
"average30d": "30-day average:",
"consistency": {
"ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Zamknij",
"loading": "Ładowanie…...",
"error": "Błąd",
"success": "Sukces",
"saved": "Zapisano",
"confirm": "Potwierdź",
"back": "Wstecz",
"next": "Dalej",
"yes": "Tak",
"no": "Nie",
"search": "Szukaj",
"filter": "Filtruj",
"noData": "Brak danych",
"optional": "Opcjonalne",
"required": "Wymagane",
"all": "Wszystko",
"active": "Aktywne",
"inactive": "Nieaktywne",
"enabled": "Włączone",
"disabled": "Wyłączone",
"networkError": "Błąd sieci",
"unknownError": "Nieznany błąd",
"notLoggedIn": "Niezalogowany",
"noAccess": "Brak dostępu",
"copied": "Copied!",
"or": "lub",
"unknown": "Nieznane",
"replace": "Zastąp",
"add": "Dodaj",
"import": "Importuj",
"test": "Testuj",
@@ -169,7 +157,6 @@
"dashboard": "Pulpit",
"measurements": "Measurements",
"medications": "Leki",
"charts": "Historia",
"insights": "Statystyki",
"targets": "Targets",
"achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": {
"login": "Zaloguj się",
"register": "Zarejestruj się",
"loginTitle": "Zaloguj się",
"registerTitle": "Zarejestruj się",
"username": "Nazwa użytkownika",
"password": "Hasło",
"email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed",
"createAccount": "Create account",
"newAccount": "Create new account",
"backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.",
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
"passwordTooShort": "Password must be at least {minLength} characters long."
},
"dashboard": {
"title": "Pulpit",
"subtitle": "Your health overview",
"greeting": {
"morning": "Good morning",
"day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Kroki",
"vo2MaxShort": "VO₂ max",
"bpInTargetShort": "RR-cel",
"days30Short": "30d",
"medications": "Leki",
"insightsPreview": "AI Insights preview",
"lastMeasurement": "Last measurement",
"noMeasurements": "No measurements yet",
"trend": "Trend",
"trendUp": "rising",
"trendDown": "falling",
"trendStable": "stable",
"quickEntry": "Quick entry",
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)",
"complianceGood": "Dobrze",
"complianceLow": "Low",
"mood": "Nastrój",
"customizeTitle": "Dashboard layout",
"customizeSubtitle": "Choose which cards appear on your dashboard and in what order. Defaults work out of the box.",
"layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection",
"nextInjection": "Next injection",
"weightDelta": "since start",
"inDays": "in {count} days",
"empty": {
"title": "No active GLP-1 medication",
"description": "Add a GLP-1 receptor agonist (Mounjaro, Ozempic, Wegovy, …) to surface dose, schedule, and weight response here."
}
"inDays": "in {count} days"
}
},
"measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement",
"type": "Typ",
"value": "Wartość",
"unit": "Unit",
"date": "Data",
"source": "Source",
"notes": "Notatki",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours",
"unitSteps": "Kroki",
"sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.",
"allTypes": "All types",
"measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Akcje",
"deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} z{total}",
"showing": "Showing",
"of": "z",
"entries": "entries"
"pageInfo": "Page {page} z{total}"
},
"mood": {
"title": "Nastrój",
@@ -404,14 +357,9 @@
"levelOkay": "Okay",
"levelSchlecht": "Źle",
"levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods",
"entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication",
"newMedication": "New medication",
"firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications",
"retryLoad": "Spróbuj ponownie",
"name": "Nazwa",
"dose": "Dawka",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "Od",
"scheduleTo": "Do",
"scheduleLabel": "Label",
"scheduleDays": "Days",
"scheduleDaily": "Daily",
"active": "Aktywne",
"inactive": "Paused",
"intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Przyjęte",
"markSkipped": "Pominięte",
"deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Przestrzeganie zaleceń",
"import": "Importuj",
"importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status",
"changeFailed": "Change failed",
"categoryBloodPressure": "Ciśnienie krwi",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid",
"categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes",
"viewHistory": "Historia",
"today": "Dzisiaj",
"yesterday": "Wczoraj",
"tomorrow": "Jutro",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen",
"glp1DosesPerUnitHelp": "Optional — set to enable the low-stock dashboard caption. Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank to disable inventory tracking.",
"glp1Headline": "{name} · {dose}",
"glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Dalej:{label}",
"glp1NextInjectionDays": "Dalej:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake",
"actions": "Akcje",
"pageInfo": "Page {page} z{total}",
"loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green",
@@ -872,24 +798,13 @@
}
},
"charts": {
"title": "Historia",
"subtitle": "Visualization of your health data",
"timeRange": "Time range",
"days7": "7 days",
"days30": "30 days",
"days90": "90 days",
"days365": "1 year",
"daysAll": "Wszystko",
"weight": "Waga",
"bloodPressure": "Ciśnienie krwi",
"pulse": "Tętno",
"bodyFat": "Tkanka tłuszczowa",
"sleep": "Sen",
"steps": "Kroki",
"compliance": "Przestrzeganie zaleceń",
"noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg",
"points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend",
"trend": "Trend",
"targetRanges": "Target ranges",
"perWeek": "/week",
"totalDelta": "Łącznie",
"selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:",
"mood": "Nastrój",
"moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Okropnie",
"moodLabel2": "Źle",
"moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target"
},
"chart": {
@@ -989,25 +901,15 @@
},
"captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": {
"lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year"
},
"tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year yet"
},
"insightsCallout": {
"lastMonth": "Tracking against last month",
"lastYear": "Tracking against last year"
},
"notAvailableForCompliance": "Comparison N/A for compliance"
},
"insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
},
"thresholds": {
"title": "Personal thresholds",
"subtitle": "Override the computed target range for any metric. Defaults stay in effect until you set a value here.",
"defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto",
"overrideModeLabel": "Override",
"resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water",
"metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.",
"loadError": "Could not load thresholds"
"unsetExplanation": "No override — using computed default."
},
"onboarding": {
"setupDescription": "Set up your profile to get started. You can change this later in Settings.",
"completeSetup": "Complete setup",
"skip": "Pomiń",
"medicationsTitle": "Do you take medications?",
"medicationsDescription": "Add your medications to enable reminders and compliance tracking.",
"medNamePlaceholder": "Nazwa",
"medDosePlaceholder": "Dawka",
"notificationsTitle": "Reminders",
"notificationsDescription": "HealthLog can remind you about your medications. Configure this later in Settings.",
"telegramHint": "Reminders via Telegram bot with snooze buttons",
"webPushHint": "Browser notifications directly to your device",
"notificationsLater": "You can set this up anytime in Settings.",
"targetsTitle": "Target Values",
"targetsDescription": "Set optional target values for blood pressure and weight.",
"targetSys": "Systolic (mmHg)",
"targetDia": "Diastolic (mmHg)",
"targetWeight": "Target weight (kg)",
"errorProfile": "Could not save your profile. Please try again.",
"errorMedication": "Could not add the medication \"{name}\". Please try again or add it later in Medications.",
"errorTargets": "Could not save your target values. Please try again.",
"errorGeneric": "Something went wrong while finishing setup. Please try again.",
"medScheduleHint": "We'll add a default reminder window (08:00–09:00 daily). You can adjust it anytime in Medications.",
"v2": {
"title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Krok 3 z 4",
"step4of4": "Krok 4 z 4"
},
"welcome": {
"title": "Witaj w HealthLog",
"carouselLabel": "Powitanie — trzy slajdy",
"slideOf": "Slajd {current} z {total}",
"gotoSlide": "Przejdź do slajdu {index}",
"prevSlide": "Poprzedni slajd",
"nextSlide": "Następny slajd",
"slide1": {
"title": "Twoje dane zdrowotne należą do Ciebie",
"body": "HealthLog przechowuje każdy pomiar na Twojej infrastrukturze. Bez reklam, bez udostępniania osobom trzecim, bez przywiązywania do konta."
},
"slide2": {
"title": "Jeden widok dla wszystkich źródeł",
"body": "Apple Health, Withings i wpisy ręczne łączą się w spójną historię — z priorytetem źródła dla każdej metryki, który ustalasz sam."
},
"slide3": {
"title": "Coach i Insights z treścią",
"body": "Analiza oparta wyłącznie na Twoich liczbach, każde stwierdzenie jest weryfikowalne. Bring-your-own-key: Twoje dane nie służą do trenowania."
},
"cta": "Zaczynamy"
},
"goals": {
"title": "Co chcesz śledzić?",
"body": "Wybierz obszary, które są dla Ciebie ważne. Pulpit i przypomnienia dostosują się do Twojego wyboru.",
@@ -1669,10 +1526,8 @@
"title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} z{total} Gotowe",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": {
"profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go."
},
"settings": {
"title": "Ustawienia",
"subtitle": "Profile, Security & Connections",
"researchMode": {
"sectionTitle": "Tryb Badawczy",
"subtitle": "Opcjonalne wyświetlanie szacowanej krzywej poziomu leku GLP-1, wyprowadzonej z farmakokinetyki populacyjnej opublikowanej przez EMA. Tylko do odczytu — nigdy pomiar ani porada medyczna.",
@@ -1841,18 +1694,9 @@
"coming_soon": "Moving here with the next release update."
}
},
"sectionsTitle": "Ustawienia",
"categoryGeneral": "General",
"categoryNotifications": "Powiadomienia",
"categoryAi": "AI",
"categoryPersonalization": "Personalization",
"categoryIntegration": "Integration",
"categoryApi": "API",
"profile": "Profil",
"security": "Bezpieczeństwo",
"language": "Język",
"languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nazwa użytkownika",
"height": "Height (cm)",
"dateOfBirth": "Data urodzenia",
@@ -1930,16 +1774,6 @@
"webPushActive": "Aktywne",
"kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.",
"kiInsightsBenefitsTitle": "Benefits with OpenAI key",
"kiInsightsBenefit1": "Daily summaries for general status, blood pressure, weight, pulse, BMI, and medication compliance.",
"kiInsightsBenefit2": "Better trend and correlation interpretation based on your latest 30 daily measurement points per area.",
"kiInsightsBenefit3": "Automatic background refresh so the Insights page always shows up-to-date assessments.",
"createApiKeyHint": "Create your API key at:",
"createApiKeyLinkLabel": "platform.openai.com/api-keys",
"apiKey": "API Key",
"apiKeyStored": "Key stored — enter new one to replace",
"apiKeySaved": "API key saved",
"apiKeyRemoved": "API key removed",
"codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated",
"ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.",
"disconnect": "Disconnect",
"connectChatgptHeading": "Connect with ChatGPT",
"connectChatgptBody": "Link your ChatGPT Pro/Max account to get AI-powered health analyses based on current medical guidelines. No additional API costs.",
"connectChatgptCta": "Connect with ChatGPT",
"deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Anuluj",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
"adminFallback": "Alternatively, HealthLog will use the AI provider configured by the administrator.",
"personalProviderHeading": "AI provider (personal)",
"personalProviderBody": "Your own AI provider overrides the admin setting. Leave blank for the default. For ChatGPT Pro/Max OAuth use the connect button above.",
"providerLabel": "Provider",
"providerOptionDefault": "— Default (Admin/Codex) —",
"providerOptionOpenai": "OpenAI (API key)",
"providerOptionAnthropic": "Anthropic (Claude)",
"providerOptionLocal": "Local (OpenAI-compatible)",
"modelLabel": "Model",
"modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name",
"openaiKeyLabel": "OpenAI API key",
"openaiKeyHelp": "Your own key — not connected to your ChatGPT subscription. For the subscription use the connect button above.",
"anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})",
"savedShort": "(saved)",
"saveCta": "Zapisz",
"testCta": "Test connection",
"removeKeyCta": "Remove saved key",
"keyRemoved": "Saved key removed",
"removeKeyConfirmTitle": "Remove saved API key?",
"removeKeyConfirmBody": "Insights for this provider will fall back to the admin/Codex provider until you save a new key.",
"saved": "Zapisano",
"saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Błąd",
"providerChain": {
"heading": "AI provider fallback chain",
"activeLine": "Active provider: {provider}",
"cachedSuffix": "(cached: {provider})",
"chainLine": "Configured chain: {chain}",
"managementHint": "Reordering and on/off toggles arrive in the next release.",
"none": "none configured",
"types": {
"codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now",
"withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?",
@@ -2109,15 +1910,6 @@
}
}
},
"integrationStatus": {
"stateConnected": "Connected",
"stateError": "Błąd",
"stateReauthRequired": "Reconnect required",
"stateDisconnected": "Disconnected",
"consecutiveFailures": "{count}/{threshold} consecutive failures",
"lastSuccess": "Last successful sync",
"lastAttempt": "Last attempt"
},
"integrationPill": {
"connected": "Connected",
"errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
},
"apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Akcje",
"noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method",
"apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example",
"export": "Data Export",
"exportDescription": "Export all your health data.",
"exportJson": "JSON Export",
"exportCsv": "CSV Export",
"doctorReport": "Doctor Report (PDF)",
"auditLog": "Activity Log",
"auditLogHidden": "Log hidden.",
"auditLogShowing": "Showing last {count} z{total} entries",
"auditNoActivities": "No activities found.",
"auditAction": "Action",
"auditCategory": "Category",
"auditIp": "IP",
"auditLocation": "Location",
"auditTimestamp": "Czas",
"auditOther": "Other",
"auditCategoryAuth": "Auth",
"auditCategoryData": "Dane",
"auditCategoryIntegration": "Integration",
"auditCategoryAI": "AI",
"auditCategoryAdmin": "Admin",
"auditActionAuthRegister": "Registration",
"auditActionAuthLogin": "Zaloguj",
"auditActionAuthLoginPasskey": "Passkey login",
"auditActionAuthLoginPassword": "Password login",
"auditActionAuthLoginFailed": "Failed login",
"auditActionAuthLogout": "Wyloguj",
"auditActionAuthPasskeyRegister": "Passkey added",
"auditActionAuthPasskeyDelete": "Passkey deleted",
"auditActionAuthPasswordChange": "Password changed",
"auditActionMeasurementCreate": "Measurement created",
"auditActionMeasurementUpdate": "Measurement updated",
"auditActionMeasurementDelete": "Measurement deleted",
"auditActionMedicationCreate": "Medication created",
"auditActionMedicationUpdate": "Medication updated",
"auditActionMedicationDelete": "Medication deleted",
"auditActionMedicationIntake": "Intake recorded",
"auditActionMedicationIngestExternal": "External intake",
"auditActionWithingsConnect": "Withings connected",
"auditActionWithingsDisconnect": "Withings disconnected",
"auditActionExportDownload": "Export downloaded",
"auditActionInsightsGenerate": "AI insight generated",
"auditActionAdminUserUpdate": "Admin: User updated",
"auditActionAdminUserResetPassword": "Admin: Password reset",
"auditActionAdminSettingsUpdate": "Admin: Settings changed",
"collapse": "Collapse",
"expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently",
"saved": "Zapisano",
"savingError": "Error saving",
"adminAreaTitle": "Admin area",
"adminAreaDescription": "System-wide settings and user management are available in the admin console.",
"openAdminConsole": "Open admin console",
"moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration",
"subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status",
"version": "Version",
"database": "Database",
"databaseConnected": "Connected",
"databaseError": "Błąd",
"gitCommit": "Git Commit",
"startedAt": "Started",
"users": "Users",
"measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)",
"memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integracje",
"sectionMedication": "Leki",
"sectionManagement": "Management",
"umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management",
"userName": "Nazwa",
"userEmail": "E-mail",
@@ -2438,7 +2156,6 @@
"toUser": "Make user",
"toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used",
"tokenCreated": "Created",
"tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview",
"allAuthEvents": "All auth events",
"failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"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.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Sukces",
"outcomeFailed": "Failed",
"auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"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.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent",
"feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open",
"tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted",
"actions": "Akcje",
"details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature",
"categoryQuestion": "Question",
"categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata",
"metaUrl": "URL",
"metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed",
"updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by",
"sectionTitle": "Feedback"
"submittedBy": "Submitted by"
},
"shell": {
"overview": "Przegląd",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events."
},
"auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)",
"filterAction": "Action",
"filterActionAll": "All actions",
"filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range",
"range24h": "Last 24 hours",
"range7d": "Ostatnie 7 dni",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup",
"loading": "Loading backups...",
"loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!",
"completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement"
},
"hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!",
"description": "Tap to see the surprise."
"title": "You unlocked a hidden achievement!"
},
"dashboardCard": {
"title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title",
"description": "Opis",
"descriptionPlaceholder": "Describe the bug in detail. What did you do? What happened? What did you expect?",
"screenshot": "Screenshot (optional)",
"screenshotPreview": "Screenshot preview",
"attachScreenshot": "Attach screenshot",
"imageOnly": "Only image files allowed",
"tooLarge": "Screenshot is too large (max 5 MB)",
"submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report",
"notConfiguredTitle": "Bug reports not available yet",
"notConfiguredUser": "Bug reporting is disabled on this server. Please contact your administrator.",
"notConfiguredAdmin": "Bug reporting requires a GitHub integration (issue token + repository). Configure it in the admin panel under Settings → Bug reports.",
"openAdminSettings": "Open admin settings",
"category": "Typ",
"categoryBug": "Bug report",
"categoryFeature": "Feature request",
@@ -3058,8 +2742,7 @@
"githubEscalationNote": "Your feedback is stored locally. If the admin enables GitHub integration, it can be promoted to a public issue on request.",
"internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.",
"disabledError": "Bug reports are disabled by the administrator."
"disabledBody": "The administrator has disabled bug reports on this server."
},
"notifications": {
"title": "Powiadomienia",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings",
"channelDisabled": "Wyłączone",
"eventMedicationReminder": "Medication Reminder",
"eventMedicationReminderDesc": "Reminder when an intake is due.",
"eventMeasurementAnomaly": "Anomalous Measurement",
"eventMeasurementAnomalyDesc": "Warning for unusual measurements (e.g., high blood pressure).",
"eventComplianceLow": "Low Compliance",
"eventComplianceLowDesc": "Notification when medication compliance drops below a threshold.",
"eventWithingsSyncFailed": "Withings Sync Failed",
"eventWithingsSyncFailedDesc": "Alert when the automatic Withings data sync fails.",
"eventSystemAlert": "Alert systemowy",
"eventSystemAlertDesc": "Ważne komunikaty systemowe i powiadomienia administracyjne.",
"eventPersonalRecord": "Rekord osobisty",
"eventPersonalRecordDesc": "Powiadomienie po osiągnięciu nowego rekordu w metryce lub treningu. Domyślnie wyłączone."
},
"format": {
"dateShort": "{month}/{day}/{year}",
"timeShort": "{hours}:{minutes}",
"dateTime": "{month}/{day}/{year}, {hours}:{minutes}"
},
"i18n": {
"maintainershipBanner": {
"notice": "Ta wersja językowa jest opracowana przez AI, w tym instrukcje krytyczne dla bezpieczeństwa Coacha. Walidacja automatyczna działa w CI; proszę zgłaszać wszelkie regresje Coacha AI na GitHubie.",
@@ -3094,108 +2762,10 @@
"dismiss": "Zamknij"
}
},
"classifications": {
"bmi": {
"Underweight": "Underweight",
"Normal": "Normal",
"Overweight": "Overweight",
"ObesityGradeI": "Obesity Grade I",
"ObesityGradeII": "Obesity Grade II",
"ObesityGradeIII": "Obesity Grade III"
},
"bp": {
"Optimal": "Optimal",
"Normal": "Normal",
"HighNormal": "High-normal",
"HypertensionGrade1": "Hypertension Grade 1",
"HypertensionGrade2": "Hypertension Grade 2",
"HypertensionGrade3": "Hypertension Grade 3"
},
"pulse": {
"Bradycardia": "Bradycardia",
"Normal": "Normal",
"Elevated": "Elevated",
"Tachycardia": "Tachycardia"
},
"pulseTarget": {
"SignificantlyLow": "Significantly low",
"SlightlyLow": "Slightly low",
"OnTarget": "On target",
"SlightlyElevated": "Slightly elevated",
"SignificantlyElevated": "Significantly elevated"
},
"sleep": {
"FarTooShort": "Far too short",
"TooShort": "Too short",
"OnTarget": "On target",
"SlightlyLong": "Slightly long",
"FarTooLong": "Far too long"
},
"bodyFat": {
"Essential": "Essential",
"Athletic": "Athletic",
"Fitness": "Fitness",
"Average": "Średnia",
"Obese": "Obese"
},
"steps": {
"VeryLow": "Very low",
"LowActive": "Low active",
"ModeratelyActive": "Moderately active",
"Active": "Aktywne",
"VeryActive": "Very active"
},
"general": {
"Good": "Dobrze",
"Moderate": "Moderate",
"Low": "Low",
"VeryGood": "Very good",
"VeryStable": "Very stable",
"Stable": "Stable",
"Fluctuating": "Fluctuating"
},
"alerts": {
"bmiBelowNormalTitle": "BMI below normal range",
"bmiBelowNormalMessage": "Your BMI of {bmi} is below the normal range (18.5–24.9).",
"bmiOverweightTitle": "BMI in overweight range",
"bmiOverweightMessage": "Your BMI of {bmi} is in the overweight range. Regular exercise and a balanced diet can help.",
"bmiObesityTitle": "BMI in obesity range",
"bmiObesityMessage": "Your BMI of {bmi} is in the obesity range.",
"bmiNormalTitle": "BMI in normal range",
"bmiNormalMessage": "Your BMI of {bmi} is in the healthy range.",
"bpDangerTitle": "Blood pressure significantly elevated",
"bpDangerMessage": "Your average blood pressure ({sys}/{dia}) is classified as \"{category}\".",
"bpWarningTitle": "Blood pressure slightly elevated",
"bpWarningMessage": "Your average blood pressure ({sys}/{dia}) is in the \"{category}\" range.",
"bpTargetGoodTitle": "Good blood pressure target adherence",
"bpTargetGoodMessage": "{pct}% of your readings are within the target range.",
"bpTargetBadTitle": "Blood pressure often outside target range",
"bpTargetBadMessage": "Only {pct}% of your readings are within the target range.",
"weightIncreasingTitle": "Weight increasing",
"weightIncreasingMessage": "Your weight is increasing by approx. {change} kg per week over the last 30 days.",
"weightDecreasingTitle": "Weight decreasing",
"weightDecreasingMessage": "Your weight is decreasing by approx. {change} kg per week over the last 30 days.",
"pulseOutliersTitle": "Pulse outliers detected",
"pulseOutliersMessage": "{count} unusual pulse readings in the last 30 days.",
"complianceLowTitle": "Low compliance: {name}",
"complianceLowMessage": "Your 7-day compliance for {name} is only {pct}%. Regular intake is important.",
"complianceGoodTitle": "Excellent compliance: {name}",
"complianceGoodMessage": "{pct}% compliance over the last 7 days. Keep it up!"
}
},
"targets": {
"title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.",
"weight": "Waga",
"bloodPressure": "Ciśnienie krwi",
"bloodPressureOnTarget": "Blood pressure on target",
"restingPulse": "Resting pulse",
"sleepDuration": "Sleep duration",
"bmi": "BMI",
"bodyFat": "Tkanka tłuszczowa",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Kroki",
"average30d": "30-day average:",
"consistency": {
"ariaLabel": "Last 7 days, in-range status per day",
@@ -241,10 +241,6 @@ describe("i18n locale file integrity", () => {
// See `docs/audit/v1415-i18n-coverage.md` §Legitimate EN==DE==key cases.
const PLACEHOLDER_ALLOWLIST = new Set<string>([
"settings.ntfy",
"classifications.bp.Optimal",
"classifications.bp.Normal",
"classifications.pulse.Normal",
"classifications.bodyFat.Fitness",
// v1.4.19 phase A7 — "BMI" is the same acronym in EN and DE,
// and the medical / fitness "Optimal", "Fitness", "Normal"
// categories are technical terms that German clinics also use