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", "close": "Schließen",
"loading": "Laden...", "loading": "Laden...",
"error": "Fehler", "error": "Fehler",
"success": "Erfolgreich",
"saved": "Gespeichert", "saved": "Gespeichert",
"confirm": "Bestätigen",
"back": "Zurück",
"next": "Weiter",
"yes": "Ja",
"no": "Nein", "no": "Nein",
"search": "Suchen",
"filter": "Filtern",
"noData": "Keine Daten vorhanden", "noData": "Keine Daten vorhanden",
"optional": "Optional", "optional": "Optional",
"required": "Erforderlich",
"all": "Alle",
"active": "Aktiv", "active": "Aktiv",
"inactive": "Inaktiv", "inactive": "Inaktiv",
"enabled": "Aktiviert", "enabled": "Aktiviert",
"disabled": "Deaktiviert", "disabled": "Deaktiviert",
"networkError": "Netzwerkfehler", "networkError": "Netzwerkfehler",
"unknownError": "Unbekannter Fehler", "unknownError": "Unbekannter Fehler",
"notLoggedIn": "Nicht angemeldet",
"noAccess": "Kein Zugriff",
"copied": "Kopiert!", "copied": "Kopiert!",
"or": "oder", "or": "oder",
"unknown": "Unbekannt", "unknown": "Unbekannt",
"replace": "Ersetzen",
"add": "Hinzufügen", "add": "Hinzufügen",
"import": "Importieren", "import": "Importieren",
"test": "Test", "test": "Test",
@@ -169,7 +157,6 @@
"dashboard": "Dashboard", "dashboard": "Dashboard",
"measurements": "Messungen", "measurements": "Messungen",
"medications": "Medikamente", "medications": "Medikamente",
"charts": "Verlauf",
"insights": "Insights", "insights": "Insights",
"targets": "Zielwerte", "targets": "Zielwerte",
"achievements": "Erfolge", "achievements": "Erfolge",
@@ -198,8 +185,6 @@
"auth": { "auth": {
"login": "Anmelden", "login": "Anmelden",
"register": "Registrieren", "register": "Registrieren",
"loginTitle": "Anmeldung",
"registerTitle": "Registrierung",
"username": "Benutzername", "username": "Benutzername",
"password": "Passwort", "password": "Passwort",
"email": "E-Mail-Adresse", "email": "E-Mail-Adresse",
@@ -210,26 +195,17 @@
"loginWithPassword": "Mit Passwort anmelden", "loginWithPassword": "Mit Passwort anmelden",
"noAccount": "Noch kein Konto?", "noAccount": "Noch kein Konto?",
"hasAccount": "Bereits ein Konto?", "hasAccount": "Bereits ein Konto?",
"registerDisabled": "Registrierung ist deaktiviert.",
"loginFailed": "Anmeldung fehlgeschlagen", "loginFailed": "Anmeldung fehlgeschlagen",
"passkeyFailed": "Passkey-Anmeldung abgebrochen oder fehlgeschlagen",
"registerFailed": "Registrierung fehlgeschlagen", "registerFailed": "Registrierung fehlgeschlagen",
"createAccount": "Konto erstellen", "createAccount": "Konto erstellen",
"newAccount": "Neues Konto erstellen", "newAccount": "Neues Konto erstellen",
"backToPasskey": "Zurück zu Passkey", "backToPasskey": "Zurück zu Passkey",
"passkeySetupLater": "Passkeys kannst du jederzeit in den Einstellungen einrichten.", "passkeySetupLater": "Passkeys kannst du jederzeit in den Einstellungen einrichten.",
"passwordMinLength": "Min. 12 Zeichen", "passwordMinLength": "Min. 12 Zeichen",
"passwordTooShort": "Passwort muss mindestens {minLength} Zeichen lang sein.", "passwordTooShort": "Passwort muss mindestens {minLength} Zeichen lang sein."
"passwordStrength": "Passwortstärke",
"strengthWeak": "Sehr schwach",
"strengthFair": "Schwach",
"strengthGood": "Mittel",
"strengthStrong": "Stark",
"strengthVeryStrong": "Sehr stark"
}, },
"dashboard": { "dashboard": {
"title": "Dashboard", "title": "Dashboard",
"subtitle": "Dein Gesundheitsüberblick",
"greeting": { "greeting": {
"morning": "Guten Morgen", "morning": "Guten Morgen",
"day": "Hallo", "day": "Hallo",
@@ -260,25 +236,13 @@
"stepsShort": "Schritte", "stepsShort": "Schritte",
"vo2MaxShort": "VO₂ max", "vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BD-Ziel", "bpInTargetShort": "BD-Ziel",
"days30Short": "30T",
"medications": "Medikamente", "medications": "Medikamente",
"insightsPreview": "KI-Insights-Vorschau", "insightsPreview": "KI-Insights-Vorschau",
"lastMeasurement": "Letzter Messwert",
"noMeasurements": "Noch keine Messwerte",
"trend": "Trend",
"trendUp": "steigend",
"trendDown": "fallend",
"trendStable": "stabil",
"quickEntry": "Schnelleingabe",
"quickAddMeasurement": "Messung erfassen", "quickAddMeasurement": "Messung erfassen",
"quickAddMood": "Stimmung erfassen", "quickAddMood": "Stimmung erfassen",
"addMeasurement": "Messwert hinzufügen",
"compliance7d": "Einnahmetreue (7 Tage)", "compliance7d": "Einnahmetreue (7 Tage)",
"complianceGood": "Gut",
"complianceLow": "Niedrig",
"mood": "Stimmung", "mood": "Stimmung",
"customizeTitle": "Dashboard-Layout", "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", "layoutReset": "Auf Defaults zurücksetzen",
"layoutSaveSuccess": "Dashboard-Layout gespeichert", "layoutSaveSuccess": "Dashboard-Layout gespeichert",
"layoutSaveError": "Layout konnte nicht gespeichert werden", "layoutSaveError": "Layout konnte nicht gespeichert werden",
@@ -297,11 +261,7 @@
"lastInjection": "Letzte Injektion", "lastInjection": "Letzte Injektion",
"nextInjection": "Nächste Injektion", "nextInjection": "Nächste Injektion",
"weightDelta": "seit Beginn", "weightDelta": "seit Beginn",
"inDays": "in {count} Tagen", "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."
}
} }
}, },
"measurements": { "measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Messwert bearbeiten", "editMeasurement": "Messwert bearbeiten",
"type": "Typ", "type": "Typ",
"value": "Wert", "value": "Wert",
"unit": "Einheit",
"date": "Datum", "date": "Datum",
"source": "Quelle", "source": "Quelle",
"notes": "Notizen", "notes": "Notizen",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Postprandial (2 h nach dem Essen)", "glucoseContextPostprandial": "Postprandial (2 h nach dem Essen)",
"glucoseContextRandom": "Beliebig / ohne Kontext", "glucoseContextRandom": "Beliebig / ohne Kontext",
"glucoseContextBedtime": "Vor dem Schlafen", "glucoseContextBedtime": "Vor dem Schlafen",
"glucoseUnit": "Blutzucker-Einheit",
"glucoseUnitHint": "Gespeichert in mg/dL; Anzeige-Einheit ist deine Präferenz.",
"unitHours": "Stunden", "unitHours": "Stunden",
"unitSteps": "Schritte", "unitSteps": "Schritte",
"sourceManual": "Manuell", "sourceManual": "Manuell",
@@ -371,7 +328,6 @@
"loginRequired": "Bitte anmelden, um Messwerte zu sehen.", "loginRequired": "Bitte anmelden, um Messwerte zu sehen.",
"allTypes": "Alle Typen", "allTypes": "Alle Typen",
"measurementCount": "{count} Messwerte", "measurementCount": "{count} Messwerte",
"noMeasurements": "Keine Messwerte vorhanden",
"emptyTitle": "Noch keine Messwerte", "emptyTitle": "Noch keine Messwerte",
"emptyDescription": "Erfasse Gewicht, Blutdruck, Puls oder andere Werte, um Trends zu erkennen.", "emptyDescription": "Erfasse Gewicht, Blutdruck, Puls oder andere Werte, um Trends zu erkennen.",
"emptyFilteredTitle": "Kein Messwert passt zum Filter", "emptyFilteredTitle": "Kein Messwert passt zum Filter",
@@ -382,10 +338,7 @@
"actions": "Aktionen", "actions": "Aktionen",
"deleteConfirmTitle": "Messwert löschen?", "deleteConfirmTitle": "Messwert löschen?",
"deleteConfirmDescription": "Dieser Messwert wird unwiderruflich gelöscht.", "deleteConfirmDescription": "Dieser Messwert wird unwiderruflich gelöscht.",
"pageInfo": "Seite {page} von {total}", "pageInfo": "Seite {page} von {total}"
"showing": "Zeigt",
"of": "von",
"entries": "Einträgen"
}, },
"mood": { "mood": {
"title": "Stimmung", "title": "Stimmung",
@@ -404,14 +357,9 @@
"levelOkay": "Okay", "levelOkay": "Okay",
"levelSchlecht": "Schlecht", "levelSchlecht": "Schlecht",
"levelLausig": "Lausig", "levelLausig": "Lausig",
"sourceManual": "Manuell",
"sourceMoodlog": "moodLog", "sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "Alle Stimmungen", "allMoods": "Alle Stimmungen",
"entryCount": "{count} Einträge", "entryCount": "{count} Einträge",
"noEntries": "Keine Stimmungseinträge vorhanden",
"emptyTitle": "Noch keine Stimmungseinträge", "emptyTitle": "Noch keine Stimmungseinträge",
"emptyDescription": "Erfasse, wie du dich heute fühlst, um Muster über die Zeit zu erkennen.", "emptyDescription": "Erfasse, wie du dich heute fühlst, um Muster über die Zeit zu erkennen.",
"emptyFilteredTitle": "Kein Eintrag passt zum Filter", "emptyFilteredTitle": "Kein Eintrag passt zum Filter",
@@ -436,34 +384,21 @@
"editMedication": "Medikament bearbeiten", "editMedication": "Medikament bearbeiten",
"newMedication": "Neues Medikament", "newMedication": "Neues Medikament",
"firstMedication": "Erstes Medikament anlegen", "firstMedication": "Erstes Medikament anlegen",
"noMedicationsYet": "Noch keine Medikamente angelegt",
"emptyTitle": "Noch keine Medikamente", "emptyTitle": "Noch keine Medikamente",
"emptyDescription": "Lege Medikamente, Dosierungen und Einnahmefenster an, um Compliance zu erfassen.", "emptyDescription": "Lege Medikamente, Dosierungen und Einnahmefenster an, um Compliance zu erfassen.",
"loadFailed": "Medikamente konnten nicht geladen werden", "loadFailed": "Medikamente konnten nicht geladen werden",
"retryLoad": "Erneut laden", "retryLoad": "Erneut laden",
"name": "Name", "name": "Name",
"dose": "Dosis", "dose": "Dosis",
"doseAmount": "Menge",
"doseUnit": "Einheit",
"category": "Kategorie",
"schedule": "Zeitfenster",
"scheduleFrom": "Von", "scheduleFrom": "Von",
"scheduleTo": "Bis", "scheduleTo": "Bis",
"scheduleLabel": "Bezeichnung", "scheduleLabel": "Bezeichnung",
"scheduleDays": "Tage", "scheduleDays": "Tage",
"scheduleDaily": "Täglich", "scheduleDaily": "Täglich",
"active": "Aktiv",
"inactive": "Pausiert", "inactive": "Pausiert",
"intakeHistory": "Einnahme-Verlauf", "intakeHistory": "Einnahme-Verlauf",
"showIntakeHistory": "Einnahme-Verlauf anzeigen",
"hideIntakeHistory": "Einnahme-Verlauf ausblenden",
"markTaken": "Eingenommen",
"markSkipped": "Übersprungen",
"deleteConfirm": "Medikament löschen?", "deleteConfirm": "Medikament löschen?",
"deleteDescription": "Das Medikament und alle Einnahmen werden unwiderruflich gelöscht.",
"noMedications": "Keine Medikamente vorhanden.",
"compliance": "Einnahmetreue", "compliance": "Einnahmetreue",
"import": "Import",
"importIntakes": "Einnahmen importieren", "importIntakes": "Einnahmen importieren",
"importDescription": "JSON-Array mit Einnahme-Daten einfügen. Erwartetes Format:", "importDescription": "JSON-Array mit Einnahme-Daten einfügen. Erwartetes Format:",
"importUploadFile": "JSON-Datei hochladen", "importUploadFile": "JSON-Datei hochladen",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} ungültige Einträge übersprungen", "importInvalidSkipped": "{count} ungültige Einträge übersprungen",
"importFailed": "Import fehlgeschlagen", "importFailed": "Import fehlgeschlagen",
"importInvalidFormat": "Ungültiges JSON-Format", "importInvalidFormat": "Ungültiges JSON-Format",
"apiAccess": "API-Zugang",
"apiEndpointTitle": "API-Endpoint: {name}", "apiEndpointTitle": "API-Endpoint: {name}",
"apiEndpointDescription": "Nutze diesen Endpoint, um Einnahmen per API zu erfassen (z.B. via iPhone-Kurzbefehl oder cron-Job).", "apiEndpointDescription": "Nutze diesen Endpoint, um Einnahmen per API zu erfassen (z.B. via iPhone-Kurzbefehl oder cron-Job).",
"apiEndpointActive": "API-Endpoint aktiv", "apiEndpointActive": "API-Endpoint aktiv",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Status konnte nicht geladen werden", "statusLoadFailed": "Status konnte nicht geladen werden",
"changeFailed": "Ändern fehlgeschlagen", "changeFailed": "Ändern fehlgeschlagen",
"categoryBloodPressure": "Blutdrucksenker", "categoryBloodPressure": "Blutdrucksenker",
"categoryCholesterol": "Cholesterin",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamine", "categoryVitamin": "Vitamine",
"categoryThyroid": "Schilddrüse", "categoryThyroid": "Schilddrüse",
"categoryHormone": "Hormone", "categoryHormone": "Hormone",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Einnahme-Eintrag löschen?", "intakeDeleteConfirm": "Einnahme-Eintrag löschen?",
"intakeDeleteDescription": "Dieser Einnahme-Eintrag wird unwiderruflich gelöscht.", "intakeDeleteDescription": "Dieser Einnahme-Eintrag wird unwiderruflich gelöscht.",
"intakeCount": "{count} Einnahmen", "intakeCount": "{count} Einnahmen",
"viewHistory": "Verlauf",
"today": "Heute", "today": "Heute",
"yesterday": "Gestern", "yesterday": "Gestern",
"tomorrow": "Morgen", "tomorrow": "Morgen",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Dosen pro Pen / Ampulle", "glp1DosesPerUnit": "Dosen pro Pen / Ampulle",
"glp1DosesPerUnitPlaceholder": "z. B. 4 für einen Mounjaro KwikPen", "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.", "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}", "glp1LastInjection": "Letzter Termin: {label}",
"glp1LastInjectionWithSite": "Letzter Termin: {label} · {site}", "glp1LastInjectionWithSite": "Letzter Termin: {label} · {site}",
"glp1NextInjection": "Nächster Termin: {label}",
"glp1NextInjectionDays": "Nächster Termin: {label} (in {days} Tagen)", "glp1NextInjectionDays": "Nächster Termin: {label} (in {days} Tagen)",
"glp1NextInjectionToday": "Nächster Termin: heute", "glp1NextInjectionToday": "Nächster Termin: heute",
"glp1NextInjectionTomorrow": "Nächster Termin: morgen", "glp1NextInjectionTomorrow": "Nächster Termin: morgen",
@@ -738,7 +667,6 @@
"siteThighRight": "Rechter Oberschenkel", "siteThighRight": "Rechter Oberschenkel",
"siteUpperArmLeft": "Linker Oberarm", "siteUpperArmLeft": "Linker Oberarm",
"siteUpperArmRight": "Rechter Oberarm", "siteUpperArmRight": "Rechter Oberarm",
"sideEffectTagsLabel": "Häufige GLP-1-Nebenwirkungen",
"sideEffectTagsHelp": "Tippe einen Chip, um ihn zu den Mood-Tags hinzuzufügen.", "sideEffectTagsHelp": "Tippe einen Chip, um ihn zu den Mood-Tags hinzuzufügen.",
"sideEffectTagNausea": "Übelkeit", "sideEffectTagNausea": "Übelkeit",
"sideEffectTagConstipation": "Verstopfung", "sideEffectTagConstipation": "Verstopfung",
@@ -774,12 +702,10 @@
"purgeError": "Fehler beim Löschen der Aufzeichnungen", "purgeError": "Fehler beim Löschen der Aufzeichnungen",
"invalidTimestamp": "Bitte einen gültigen Zeitpunkt wählen.", "invalidTimestamp": "Bitte einen gültigen Zeitpunkt wählen.",
"noIntakesYet": "Noch keine Einnahmen vorhanden", "noIntakesYet": "Noch keine Einnahmen vorhanden",
"noIntakesForMedication": "Noch keine Einnahmen für",
"deleteIntakeAriaLabel": "Einnahme löschen", "deleteIntakeAriaLabel": "Einnahme löschen",
"actions": "Aktionen", "actions": "Aktionen",
"pageInfo": "Seite {page} von {total}", "pageInfo": "Seite {page} von {total}",
"loginRequiredIntakes": "Bitte anmelden, um Einnahmen zu sehen.", "loginRequiredIntakes": "Bitte anmelden, um Einnahmen zu sehen.",
"clear": "Löschen",
"phaseConfig": "Erinnerungsphasen", "phaseConfig": "Erinnerungsphasen",
"phaseConfigDescription": "Konfiguriere die Zeitpunkte für Erinnerungen.", "phaseConfigDescription": "Konfiguriere die Zeitpunkte für Erinnerungen.",
"phaseGreen": "Grün", "phaseGreen": "Grün",
@@ -872,24 +798,13 @@
} }
}, },
"charts": { "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", "weight": "Gewicht",
"bloodPressure": "Blutdruck", "bloodPressure": "Blutdruck",
"pulse": "Puls", "pulse": "Puls",
"bodyFat": "Körperfett", "bodyFat": "Körperfett",
"sleep": "Schlaf", "sleep": "Schlaf",
"steps": "Schritte", "steps": "Schritte",
"compliance": "Einnahmetreue",
"noData": "Keine Daten im gewählten Zeitraum", "noData": "Keine Daten im gewählten Zeitraum",
"movingAverage": "Gleitender Durchschnitt",
"target": "Zielbereich",
"bucketWeekly": "Wochendurchschnitt", "bucketWeekly": "Wochendurchschnitt",
"bucketMonthly": "Monatsdurchschnitt", "bucketMonthly": "Monatsdurchschnitt",
"points7Label": "7 Pkt", "points7Label": "7 Pkt",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "Allzeit", "avgAllTimeShort": "Allzeit",
"trend7dShort": "7-Tage-Trend", "trend7dShort": "7-Tage-Trend",
"trend": "Trend", "trend": "Trend",
"targetRanges": "Zielbereiche",
"perWeek": "/Woche", "perWeek": "/Woche",
"totalDelta": "Gesamt", "totalDelta": "Gesamt",
"selectMedication": "Medikament wählen", "selectMedication": "Medikament wählen",
@@ -923,7 +837,6 @@
"colorRed": "Rot:", "colorRed": "Rot:",
"mood": "Stimmung", "mood": "Stimmung",
"moodScore": "Stimmungswert", "moodScore": "Stimmungswert",
"moodMA": "7-Tage-Trend",
"moodLabel1": "Lausig", "moodLabel1": "Lausig",
"moodLabel2": "Schlecht", "moodLabel2": "Schlecht",
"moodLabel3": "Okay", "moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Dein Mittel", "personalBaseline": "Dein Mittel",
"deltaVsBaseline": "{delta} vs. dein Mittel", "deltaVsBaseline": "{delta} vs. dein Mittel",
"deltaUnchanged": "entspricht deinem Mittel", "deltaUnchanged": "entspricht deinem Mittel",
"targetWeight": "Ziel",
"deltaVsTarget": "{delta} vs. Ziel" "deltaVsTarget": "{delta} vs. Ziel"
}, },
"chart": { "chart": {
@@ -989,25 +901,15 @@
}, },
"captionLastMonth": "vs. Vormonat", "captionLastMonth": "vs. Vormonat",
"captionLastYear": "vs. Vorjahr", "captionLastYear": "vs. Vorjahr",
"delta": {
"improved": "{delta} besser",
"worsened": "{delta} schlechter",
"stable": "unverändert"
},
"deltaVs": { "deltaVs": {
"lastMonth": "{delta} vs. Vormonat", "lastMonth": "{delta} vs. Vormonat",
"lastYear": "{delta} vs. Vorjahr" "lastYear": "{delta} vs. Vorjahr"
}, },
"tooltipPrior": "Vorperiode", "tooltipPrior": "Vorperiode",
"tooltipDelta": "Δ {delta}",
"unavailable": { "unavailable": {
"lastMonth": "Vergleich nicht verfügbar — noch keine Daten aus dem Vormonat", "lastMonth": "Vergleich nicht verfügbar — noch keine Daten aus dem Vormonat",
"lastYear": "Vergleich nicht verfügbar — noch keine Daten aus dem Vorjahr" "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" "notAvailableForCompliance": "Vergleich für Compliance nicht verfügbar"
}, },
"insights": { "insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Klicke auf \"Generieren\" für KI-basierte Insights deiner Gesundheitsdaten." "generatePrompt": "Klicke auf \"Generieren\" für KI-basierte Insights deiner Gesundheitsdaten."
}, },
"thresholds": { "thresholds": {
"title": "Persönliche Zielwerte",
"subtitle": "Überschreibe den berechneten Zielbereich für jede Metrik. Ohne Eintrag gilt der Default.",
"defaultLabel": "Default", "defaultLabel": "Default",
"overrideLabel": "Dein Wert",
"autoModeLabel": "Auto", "autoModeLabel": "Auto",
"overrideModeLabel": "Überschrieben", "overrideModeLabel": "Überschrieben",
"resetAction": "Auf Default zurücksetzen", "resetAction": "Auf Default zurücksetzen",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Körperwasser", "metricBodyWater": "Körperwasser",
"metricBoneMass": "Knochenmasse", "metricBoneMass": "Knochenmasse",
"metricOxygenSaturation": "Sauerstoffsättigung (SpO₂)", "metricOxygenSaturation": "Sauerstoffsättigung (SpO₂)",
"unsetExplanation": "Kein eigener Wert — berechneter Default aktiv.", "unsetExplanation": "Kein eigener Wert — berechneter Default aktiv."
"loadError": "Zielwerte konnten nicht geladen werden"
}, },
"onboarding": { "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.", "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.", "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": { "v2": {
"title": "Willkommen bei HealthLog", "title": "Willkommen bei HealthLog",
"subtitle": "Drei schnelle Schritte. Alles weitere kannst du später in den Einstellungen erledigen.", "subtitle": "Drei schnelle Schritte. Alles weitere kannst du später in den Einstellungen erledigen.",
@@ -1582,27 +1460,6 @@
"step3of4": "Schritt 3 von 4", "step3of4": "Schritt 3 von 4",
"step4of4": "Schritt 4 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": { "goals": {
"title": "Was möchtest du erfassen?", "title": "Was möchtest du erfassen?",
"body": "Wähle die Bereiche, die dir wichtig sind. Dashboard und Erinnerungen richten sich danach.", "body": "Wähle die Bereiche, die dir wichtig sind. Dashboard und Erinnerungen richten sich danach.",
@@ -1669,10 +1526,8 @@
"title": "Erste Schritte", "title": "Erste Schritte",
"subtitle": "Quick Wins, damit du das Beste aus HealthLog herausholst.", "subtitle": "Quick Wins, damit du das Beste aus HealthLog herausholst.",
"progress": "{done} von {total} erledigt", "progress": "{done} von {total} erledigt",
"dismiss": "Ausblenden",
"dismissAll": "Checkliste ausblenden", "dismissAll": "Checkliste ausblenden",
"dismissTooltip": "Diesen Punkt ausblenden", "dismissTooltip": "Diesen Punkt ausblenden",
"restoreHint": "Du kannst die Checkliste in den Einstellungen wiederherstellen.",
"items": { "items": {
"profileTitle": "Profil einrichten", "profileTitle": "Profil einrichten",
"profileDescription": "Größe, Geburtsdatum und Geschlecht schalten personalisierte Zielwerte frei.", "profileDescription": "Größe, Geburtsdatum und Geschlecht schalten personalisierte Zielwerte frei.",
@@ -1697,8 +1552,6 @@
"remainingMany": "Noch {count} Messungen bis zum Trend." "remainingMany": "Noch {count} Messungen bis zum Trend."
}, },
"settings": { "settings": {
"title": "Einstellungen",
"subtitle": "Profil, Sicherheit & Verbindungen",
"researchMode": { "researchMode": {
"sectionTitle": "Forschungsmodus", "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.", "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." "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", "profile": "Profil",
"security": "Sicherheit",
"language": "Sprache", "language": "Sprache",
"languageDescription": "Wähle die Anzeigesprache der Anwendung.", "languageDescription": "Wähle die Anzeigesprache der Anwendung.",
"languageSystem": "System (automatisch)",
"username": "Benutzername", "username": "Benutzername",
"height": "Körpergröße (cm)", "height": "Körpergröße (cm)",
"dateOfBirth": "Geburtsdatum", "dateOfBirth": "Geburtsdatum",
@@ -1930,16 +1774,6 @@
"webPushActive": "Aktiv", "webPushActive": "Aktiv",
"kiInsights": "KI-Insights (OpenAI)", "kiInsights": "KI-Insights (OpenAI)",
"kiInsightsDescription": "Optional: Hinterlege deinen OpenAI-Key für tägliche, automatische KI-Auswertungen in den Insights.", "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.", "codexConnected": "ChatGPT erfolgreich verbunden! KI-Insights sind jetzt aktiv.",
"codexDisconnected": "ChatGPT-Verbindung getrennt.", "codexDisconnected": "ChatGPT-Verbindung getrennt.",
"codexConnectionFailed": "ChatGPT-Verbindung fehlgeschlagen. Bitte versuche es erneut.", "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.", "regenerateRateLimit": "Bitte warte — du hast das stündliche Limit für Analysen erreicht.",
"lastGeneratedAt": "Zuletzt generiert", "lastGeneratedAt": "Zuletzt generiert",
"ai": { "ai": {
"title": "KI-Insights",
"description": "Anbieter, Modell, Key.",
"chatgptConnectedBadge": "ChatGPT verbunden", "chatgptConnectedBadge": "ChatGPT verbunden",
"adminAiActiveBadge": "Admin-KI aktiv", "adminAiActiveBadge": "Admin-KI aktiv",
"connectionExpiredBadge": "Verbindung abgelaufen", "connectionExpiredBadge": "Verbindung abgelaufen",
"chatgptConnectedHeading": "ChatGPT verbunden",
"chatgptConnectedBody": "Insights werden über dein ChatGPT-Abo generiert — keine zusätzlichen Kosten.",
"connectedSince": "Verbunden seit {when}.", "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", "deviceCodeHeading": "Verbindung auf chatgpt.com abschließen",
"deviceCodeStep1": "Öffne diesen Link auf einem beliebigen Gerät:", "deviceCodeStep1": "Öffne diesen Link auf einem beliebigen Gerät:",
"deviceCodeStep2": "Gib diesen Einmalcode ein:", "deviceCodeStep2": "Gib diesen Einmalcode ein:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Warte auf Bestätigung…", "deviceCodeWaiting": "Warte auf Bestätigung…",
"deviceCodeCancel": "Abbrechen", "deviceCodeCancel": "Abbrechen",
"oauthNotConfigured": "ChatGPT-OAuth ist auf dieser Instanz nicht konfiguriert — nutze stattdessen einen eigenen API-Key unten.", "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", "modelLabel": "Modell",
"modelOptionDefault": "— Standard —", "modelOptionDefault": "— Standard —",
"modelOptionCustom": "Eigenes…", "modelOptionCustom": "Eigenes…",
"customModelLabel": "Eigener Modellname", "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", "anthropicKeyLabel": "Anthropic API-Key",
"baseUrlLabel": "Base URL", "baseUrlLabel": "Base URL",
"localKeyLabel": "API-Key (optional)", "localKeyLabel": "API-Key (optional)",
"savedPreview": "(gespeichert {preview})", "savedPreview": "(gespeichert {preview})",
"savedShort": "(gespeichert)", "savedShort": "(gespeichert)",
"saveCta": "Speichern", "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", "saved": "Gespeichert",
"saveFailed": "Speichern fehlgeschlagen", "saveFailed": "Speichern fehlgeschlagen",
"testFailed": "Test fehlgeschlagen",
"errorGeneric": "Fehler", "errorGeneric": "Fehler",
"providerChain": { "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": { "types": {
"codex": "ChatGPT (Codex)", "codex": "ChatGPT (Codex)",
"openai": "OpenAI (eigener Key)", "openai": "OpenAI (eigener Key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Gespeichert — neue eingeben zum Ersetzen", "withingsCredentialsSavedPlaceholder": "Gespeichert — neue eingeben zum Ersetzen",
"withingsCredentialsSavedPlaceholderSecret": "Gespeichert — neues eingeben zum Ersetzen", "withingsCredentialsSavedPlaceholderSecret": "Gespeichert — neues eingeben zum Ersetzen",
"withingsSaveCredentials": "Zugangsdaten speichern", "withingsSaveCredentials": "Zugangsdaten speichern",
"withingsConnected": "Verbunden",
"configured": "Konfiguriert", "configured": "Konfiguriert",
"withingsTokenExpired": "Token abgelaufen",
"withingsLastSync": "Letzte Sync",
"withingsSync": "Jetzt synchronisieren", "withingsSync": "Jetzt synchronisieren",
"withingsFullSync": "Alle Daten synchronisieren", "withingsFullSync": "Alle Daten synchronisieren",
"withingsFullSyncTitle": "Vollsynchronisierung?", "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": { "integrationPill": {
"connected": "Verbunden", "connected": "Verbunden",
"errorReconnect": "Fehler — neu verbinden", "errorReconnect": "Fehler — neu verbinden",
@@ -2130,7 +1922,6 @@
}, },
"apiTokens": "API-Tokens", "apiTokens": "API-Tokens",
"apiTokensDescription": "Erstelle API-Tokens für die externe Medikamenten-Einnahme (z.B. Shortcuts, Automationen).", "apiTokensDescription": "Erstelle API-Tokens für die externe Medikamenten-Einnahme (z.B. Shortcuts, Automationen).",
"tokenName": "Token-Name",
"tokenNamePlaceholder": "Token-Name (z.B. iPhone Shortcut)", "tokenNamePlaceholder": "Token-Name (z.B. iPhone Shortcut)",
"tokenCreated": "Token erstellt — kopiere ihn jetzt! Er wird nicht erneut angezeigt.", "tokenCreated": "Token erstellt — kopiere ihn jetzt! Er wird nicht erneut angezeigt.",
"tokenRevoke": "Token widerrufen?", "tokenRevoke": "Token widerrufen?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Aktionen", "tokenTableActions": "Aktionen",
"noActiveTokens": "Keine aktiven Tokens vorhanden.", "noActiveTokens": "Keine aktiven Tokens vorhanden.",
"tokenNeverUsed": "Nie", "tokenNeverUsed": "Nie",
"tokenLastUsed": "Zuletzt:",
"tokenCreatedAt": "Erstellt:",
"apiEndpoint": "API-Endpoint für Medikamenten-Einnahme:",
"apiEndpointsTitle": "API-Endpoints", "apiEndpointsTitle": "API-Endpoints",
"apiEndpointsDescription": "Übersicht der derzeit verfügbaren externen Endpoint(s) für Token-basierte Eingaben.", "apiEndpointsDescription": "Übersicht der derzeit verfügbaren externen Endpoint(s) für Token-basierte Eingaben.",
"apiEndpointMethod": "Methode", "apiEndpointMethod": "Methode",
"apiEndpointPath": "Pfad", "apiEndpointPath": "Pfad",
"apiEndpointAuth": "Authentifizierung", "apiEndpointAuth": "Authentifizierung",
"apiEndpointExample": "Body-Beispiel", "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", "collapse": "Einklappen",
"expand": "Ausklappen", "expand": "Ausklappen",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Alle Daten löschen", "dangerZone": "Alle Daten löschen",
"dangerZoneDescription": "Löscht alle deine Gesundheitsdaten und Integrationen. Dein Benutzerkonto bleibt erhalten.", "dangerZoneDescription": "Löscht alle deine Gesundheitsdaten und Integrationen. Dein Benutzerkonto bleibt erhalten.",
"dangerZoneConfirm": "Alle Daten löschen?", "dangerZoneConfirm": "Alle Daten löschen?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Endgültig löschen", "finalDelete": "Endgültig löschen",
"saved": "Gespeichert", "saved": "Gespeichert",
"savingError": "Fehler beim Speichern", "savingError": "Fehler beim Speichern",
"adminAreaTitle": "Admin-Bereich",
"adminAreaDescription": "Systemweite Einstellungen und Benutzerverwaltung findest du in der Admin-Konsole.",
"openAdminConsole": "Admin-Konsole öffnen",
"moodLogTitle": "moodLog", "moodLogTitle": "moodLog",
"moodLogDescription": "Stimmungsdaten aus moodLog importieren", "moodLogDescription": "Stimmungsdaten aus moodLog importieren",
"moodLogUrl": "moodLog URL", "moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Trennen", "moodLogDisconnect": "Trennen",
"moodLogDisconnectTitle": "moodLog trennen?", "moodLogDisconnectTitle": "moodLog trennen?",
"moodLogDisconnectDescription": "Die Verbindung wird getrennt und alle importierten Stimmungsdaten werden gelöscht.", "moodLogDisconnectDescription": "Die Verbindung wird getrennt und alle importierten Stimmungsdaten werden gelöscht.",
"moodLogLastSync": "Letzter Sync",
"moodLogEntries": "Einträge", "moodLogEntries": "Einträge",
"moodLogSyncResult": "{count} Einträge synchronisiert", "moodLogSyncResult": "{count} Einträge synchronisiert",
"moodLogSyncFailed": "Sync fehlgeschlagen", "moodLogSyncFailed": "Sync fehlgeschlagen",
@@ -2298,14 +2037,10 @@
"title": "Administration", "title": "Administration",
"subtitle": "Systemstatus, Benutzer und Einstellungen", "subtitle": "Systemstatus, Benutzer und Einstellungen",
"settingsSaveError": "Einstellungen konnten nicht gespeichert werden", "settingsSaveError": "Einstellungen konnten nicht gespeichert werden",
"settingsSaveValidationError": "Bitte markierte Felder prüfen",
"sectionsTitle": "Admin",
"systemStatus": "Systemstatus", "systemStatus": "Systemstatus",
"version": "Version",
"database": "Datenbank", "database": "Datenbank",
"databaseConnected": "Verbunden", "databaseConnected": "Verbunden",
"databaseError": "Fehler", "databaseError": "Fehler",
"gitCommit": "Git Commit",
"startedAt": "Gestartet", "startedAt": "Gestartet",
"users": "Benutzer", "users": "Benutzer",
"measurementsCount": "Messwerte", "measurementsCount": "Messwerte",
@@ -2320,8 +2055,6 @@
"load1": "Last (1m)", "load1": "Last (1m)",
"memUsedPercent": "Speicher", "memUsedPercent": "Speicher",
"diskBusyPercent": "Disk-I/O", "diskBusyPercent": "Disk-I/O",
"diskReadBps": "Disk lesen",
"diskWriteBps": "Disk schreiben",
"last2hours": "Letzte 2 Stunden", "last2hours": "Letzte 2 Stunden",
"empty": "Erfassung läuft — Daten erscheinen in 1–2 Minuten.", "empty": "Erfassung läuft — Daten erscheinen in 1–2 Minuten.",
"loadError": "Host-Metriken konnten nicht geladen werden. Bitte die Seite neu laden." "loadError": "Host-Metriken konnten nicht geladen werden. Bitte die Seite neu laden."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push", "integrationWebPush": "Web Push",
"integrationBugReport": "Bug-Reports", "integrationBugReport": "Bug-Reports",
"apiGlobal": "API-Endpunkte und API-Tokens erlauben.", "apiGlobal": "API-Endpunkte und API-Tokens erlauben.",
"moodLogGlobal": "moodLog-Integration erlauben.",
"sectionGeneral": "Allgemein",
"sectionIntegrations": "Integrationen",
"sectionMedication": "Medikamente",
"sectionManagement": "Verwaltung",
"umamiTitle": "Umami", "umamiTitle": "Umami",
"umamiDescription": "Web-Analyse mit Umami", "umamiDescription": "Web-Analyse mit Umami",
"glitchtipTitle": "GlitchTip", "glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Fehler-Tracking mit GlitchTip", "glitchtipDescription": "Fehler-Tracking mit GlitchTip",
"webPushVapidTitle": "Web Push VAPID", "webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Konfiguration für Website-Analytics und Fehler-Tracking.",
"umamiEnabled": "Umami-Tracking aktivieren.", "umamiEnabled": "Umami-Tracking aktivieren.",
"umamiScriptUrl": "Umami Script-URL", "umamiScriptUrl": "Umami Script-URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>", "glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip Environment", "glitchtipEnvironment": "GlitchTip Environment",
"glitchtipEnvironmentPlaceholder": "production", "glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Konfiguriere VAPID-Schlüssel und Subject direkt hier, damit Browser-Push ohne ENV-Variablen funktioniert.", "webPushVapidDescription": "Konfiguriere VAPID-Schlüssel und Subject direkt hier, damit Browser-Push ohne ENV-Variablen funktioniert.",
"webPushVapidPublicKey": "VAPID Public Key", "webPushVapidPublicKey": "VAPID Public Key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID Subject", "webPushVapidSubject": "VAPID Subject",
"webPushVapidSubjectPlaceholder": "mailto:deine-adresse@example.com", "webPushVapidSubjectPlaceholder": "mailto:deine-adresse@example.com",
"configured": "Konfiguriert", "configured": "Konfiguriert",
"notConfigured": "Nicht konfiguriert",
"monitoringTestUmami": "Umami-Test senden",
"monitoringTestGlitchTip": "GlitchTip-Test senden",
"monitoringTestSuccess": "Testevent wurde gesendet", "monitoringTestSuccess": "Testevent wurde gesendet",
"monitoringTestFailed": "Monitoring-Test fehlgeschlagen", "monitoringTestFailed": "Monitoring-Test fehlgeschlagen",
"monitoringSave": "Monitoring speichern",
"bugReportGithub": "Bugreport (GitHub Issues)", "bugReportGithub": "Bugreport (GitHub Issues)",
"bugReportGithubDescription": "Hinterlege GitHub-Issue-Token und Repository für eingehende Bugreports.", "bugReportGithubDescription": "Hinterlege GitHub-Issue-Token und Repository für eingehende Bugreports.",
"bugReportEnabledLabel": "Bug-Reports aktiviert", "bugReportEnabledLabel": "Bug-Reports aktiviert",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo", "bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue-Token", "bugReportToken": "Issue-Token",
"bugReportTokenPlaceholder": "ghp_...", "bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bugreport ist konfiguriert.",
"bugReportNotConfigured": "Bugreport ist noch nicht vollständig konfiguriert.",
"bugReportSave": "Bugreport speichern",
"userManagement": "Benutzerverwaltung", "userManagement": "Benutzerverwaltung",
"userName": "Name", "userName": "Name",
"userEmail": "E-Mail", "userEmail": "E-Mail",
@@ -2438,7 +2156,6 @@
"toUser": "Zum Benutzer", "toUser": "Zum Benutzer",
"toAdmin": "Zum Admin", "toAdmin": "Zum Admin",
"ownRoleUnchangeable": "Eigene Rolle nicht änderbar", "ownRoleUnchangeable": "Eigene Rolle nicht änderbar",
"lastAdminError": "Der letzte Admin kann nicht degradiert werden",
"resetPassword": "Passwort zurücksetzen", "resetPassword": "Passwort zurücksetzen",
"resetPasswordTitle": "Passwort zurücksetzen: {name}", "resetPasswordTitle": "Passwort zurücksetzen: {name}",
"newPassword": "Neues Passwort", "newPassword": "Neues Passwort",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Zuletzt benutzt", "tokenLastUsed": "Zuletzt benutzt",
"tokenCreated": "Erstellt", "tokenCreated": "Erstellt",
"tokenNeverUsed": "Nie", "tokenNeverUsed": "Nie",
"noTokens": "Keine API-Tokens vorhanden.",
"tokensEmptyTitle": "Noch keine API-Tokens", "tokensEmptyTitle": "Noch keine API-Tokens",
"tokensEmptyDescription": "Tokens werden bei der Anmeldung nativer Clients oder über Einstellungen → Account ausgestellt.", "tokensEmptyDescription": "Tokens werden bei der Anmeldung nativer Clients oder über Einstellungen → Account ausgestellt.",
"loginOverview": "Anmeldeübersicht", "loginOverview": "Anmeldeübersicht",
"allAuthEvents": "Alle Auth-Ereignisse", "allAuthEvents": "Alle Auth-Ereignisse",
"failedOnly": "Nur fehlgeschlagene", "failedOnly": "Nur fehlgeschlagene",
"noEntries": "Keine Einträge vorhanden.",
"loginEmptyTitle": "Noch keine Auth-Ereignisse",
"loginEmptyDescription": "Anmeldungen, Abmeldungen und Passkey-Änderungen erscheinen hier.", "loginEmptyDescription": "Anmeldungen, Abmeldungen und Passkey-Änderungen erscheinen hier.",
"loginEmptyFailedTitle": "Keine fehlgeschlagenen Anmeldungen", "loginEmptyFailedTitle": "Keine fehlgeschlagenen Anmeldungen",
"loginEmptyFailedDescription": "Das ist der sichere Zustand. Wechsle zu „Alle Auth-Ereignisse“, um erfolgreiche Anmeldungen zu sehen.", "loginEmptyFailedDescription": "Das ist der sichere Zustand. Wechsle zu „Alle Auth-Ereignisse“, um erfolgreiche Anmeldungen zu sehen.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Erfolgreich", "outcomeSuccess": "Erfolgreich",
"outcomeFailed": "Fehlgeschlagen", "outcomeFailed": "Fehlgeschlagen",
"auditDetails": "Details", "auditDetails": "Details",
"dangerZone": "Gefahrenzone",
"deleteAllData": "Alle Daten global löschen", "deleteAllData": "Alle Daten global löschen",
"deleteAllDescription": "Löscht alle Mess-, Medikamenten-, Integrations- und Protokoll-Daten aller Benutzer. Benutzerkonten bleiben bestehen.", "deleteAllDescription": "Löscht alle Mess-, Medikamenten-, Integrations- und Protokoll-Daten aller Benutzer. Benutzerkonten bleiben bestehen.",
"deleteAllConfirm": "Alle Daten wirklich löschen?", "deleteAllConfirm": "Alle Daten wirklich löschen?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minuten nach Fenster-Ende bis der Badge von Gelb auf Orange wechselt.", "reminderLateMinutesDescription": "Minuten nach Fenster-Ende bis der Badge von Gelb auf Orange wechselt.",
"reminderMissedMinutes": "Verpasst-Schwellenwert (Minuten)", "reminderMissedMinutes": "Verpasst-Schwellenwert (Minuten)",
"reminderMissedMinutesDescription": "Minuten nach Fenster-Ende bis die Einnahme als verpasst gilt.", "reminderMissedMinutesDescription": "Minuten nach Fenster-Ende bis die Einnahme als verpasst gilt.",
"reminderThresholdsSave": "Schwellenwerte speichern",
"notificationTest": "Benachrichtigungen testen",
"notificationTestSend": "Test senden", "notificationTestSend": "Test senden",
"notificationTestSuccess": "Test-Notification wurde gesendet", "notificationTestSuccess": "Test-Notification wurde gesendet",
"notificationTestFailed": "Test-Notification konnte nicht gesendet werden", "notificationTestFailed": "Test-Notification konnte nicht gesendet werden",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Heutige Events", "reminderCheckEventsToday": "Heutige Events",
"reminderCheckNotifSent": "Gesendet", "reminderCheckNotifSent": "Gesendet",
"feedback": { "feedback": {
"title": "Feedback-Postfach",
"description": "Eingegangene Rückmeldungen, Fehlerberichte und Feature-Wünsche.",
"tabOpen": "Offen", "tabOpen": "Offen",
"tabAcknowledged": "Bestätigt", "tabAcknowledged": "Bestätigt",
"tabResolved": "Erledigt", "tabResolved": "Erledigt",
@@ -2535,7 +2244,6 @@
"createdAt": "Eingegangen", "createdAt": "Eingegangen",
"actions": "Aktionen", "actions": "Aktionen",
"details": "Details", "details": "Details",
"noEntries": "Keine Feedback-Einträge in dieser Kategorie.",
"emptyTitle": "Alles erledigt", "emptyTitle": "Alles erledigt",
"emptyDescription": "Kein Nutzer-Feedback in diesem Status. Bug-Reports, Fragen und Feature-Wünsche erscheinen hier.", "emptyDescription": "Kein Nutzer-Feedback in diesem Status. Bug-Reports, Fragen und Feature-Wünsche erscheinen hier.",
"loading": "Lade Feedback...", "loading": "Lade Feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature", "categoryFeature": "Feature",
"categoryQuestion": "Frage", "categoryQuestion": "Frage",
"categoryOther": "Sonstiges", "categoryOther": "Sonstiges",
"statusOpen": "Offen",
"statusAcknowledged": "Bestätigt",
"statusResolved": "Erledigt",
"statusArchived": "Archiviert",
"dialogTitle": "Feedback-Details",
"metadataHeading": "Metadaten", "metadataHeading": "Metadaten",
"metaUrl": "URL", "metaUrl": "URL",
"metaLocale": "Sprache", "metaLocale": "Sprache",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub-Veröffentlichung fehlgeschlagen", "publishFailed": "GitHub-Veröffentlichung fehlgeschlagen",
"updateFailed": "Aktualisierung fehlgeschlagen", "updateFailed": "Aktualisierung fehlgeschlagen",
"archiveConfirm": "Diesen Feedback-Eintrag archivieren?", "archiveConfirm": "Diesen Feedback-Eintrag archivieren?",
"submittedBy": "Eingereicht von", "submittedBy": "Eingereicht von"
"sectionTitle": "Feedback"
}, },
"shell": { "shell": {
"overview": "Übersicht", "overview": "Übersicht",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit-Spur für Authentifizierungs- und Admin-Ereignisse." "subtitle": "Audit-Spur für Authentifizierungs- und Admin-Ereignisse."
}, },
"auditLog": { "auditLog": {
"title": "Audit-Log",
"filterActor": "Akteur (Benutzer-ID oder -Name)", "filterActor": "Akteur (Benutzer-ID oder -Name)",
"filterAction": "Aktion", "filterAction": "Aktion",
"filterActionAll": "Alle Aktionen", "filterActionAll": "Alle Aktionen",
"filterTarget": "Ziel (ID oder Pfad)", "filterTarget": "Ziel (ID oder Pfad)",
"filterSeverity": "Schweregrad",
"filterDate": "Zeitraum", "filterDate": "Zeitraum",
"range24h": "Letzte 24 Stunden", "range24h": "Letzte 24 Stunden",
"range7d": "Letzte 7 Tage", "range7d": "Letzte 7 Tage",
@@ -2706,7 +2406,6 @@
"runFailed": "Backup konnte nicht eingeplant werden", "runFailed": "Backup konnte nicht eingeplant werden",
"loading": "Backups werden geladen...", "loading": "Backups werden geladen...",
"loadError": "Backups konnten nicht geladen werden.", "loadError": "Backups konnten nicht geladen werden.",
"empty": "Noch keine Backups vorhanden.",
"emptyTitle": "Noch keine Backups", "emptyTitle": "Noch keine Backups",
"emptyDescription": "Backups laufen automatisch jeden Sonntag um 03:00 Uhr — oder erstelle jetzt einen ersten Snapshot.", "emptyDescription": "Backups laufen automatisch jeden Sonntag um 03:00 Uhr — oder erstelle jetzt einen ersten Snapshot.",
"colUser": "Nutzer", "colUser": "Nutzer",
@@ -2753,10 +2452,7 @@
"nextGoal": "Nächstes Ziel", "nextGoal": "Nächstes Ziel",
"allCompleted": "Alle Erfolge freigeschaltet!", "allCompleted": "Alle Erfolge freigeschaltet!",
"completed": "Abgeschlossen", "completed": "Abgeschlossen",
"inProgress": "In Arbeit",
"progress": "Fortschritt",
"goalReached": "Ziel erreicht", "goalReached": "Ziel erreicht",
"remaining": "Noch {count} bis zum Ziel",
"remainingUnlocks": "Noch {count} freischaltbar", "remainingUnlocks": "Noch {count} freischaltbar",
"noneUnlockedYet": "Noch keine Erfolge freigeschaltet.", "noneUnlockedYet": "Noch keine Erfolge freigeschaltet.",
"pointsValue": "{points} Punkte", "pointsValue": "{points} Punkte",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Versteckter, gesperrter Erfolg" "ariaLabel": "Versteckter, gesperrter Erfolg"
}, },
"hiddenUnlockToast": { "hiddenUnlockToast": {
"title": "Du hast einen versteckten Erfolg freigeschaltet!", "title": "Du hast einen versteckten Erfolg freigeschaltet!"
"description": "Tippe, um die Überraschung zu sehen."
}, },
"dashboardCard": { "dashboardCard": {
"title": "Zuletzt freigeschaltet", "title": "Zuletzt freigeschaltet",
@@ -3035,20 +2730,9 @@
"loginRequired": "Bitte anmelden, um einen Bug zu melden.", "loginRequired": "Bitte anmelden, um einen Bug zu melden.",
"bugTitle": "Titel", "bugTitle": "Titel",
"description": "Beschreibung", "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", "submit": "Senden",
"success": "Vielen Dank! Dein Bug Report wurde erfolgreich übermittelt.", "success": "Vielen Dank! Dein Bug Report wurde erfolgreich übermittelt.",
"viewOnGithub": "Auf GitHub ansehen",
"errorCreating": "Fehler beim Erstellen", "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", "category": "Art",
"categoryBug": "Fehlermeldung", "categoryBug": "Fehlermeldung",
"categoryFeature": "Feature-Wunsch", "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.", "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.", "internalOnlyNote": "Dein Feedback wird lokal gespeichert und ist nur für den Administrator dieses Servers sichtbar.",
"disabledTitle": "Bug-Reports sind deaktiviert", "disabledTitle": "Bug-Reports sind deaktiviert",
"disabledBody": "Der Administrator hat Bug-Reports auf diesem Server deaktiviert.", "disabledBody": "Der Administrator hat Bug-Reports auf diesem Server deaktiviert."
"disabledError": "Bug-Reports sind vom Administrator deaktiviert."
}, },
"notifications": { "notifications": {
"title": "Benachrichtigungen", "title": "Benachrichtigungen",
@@ -3069,24 +2752,9 @@
"noChannels": "Konfiguriere zuerst einen Benachrichtigungskanal in den Einstellungen.", "noChannels": "Konfiguriere zuerst einen Benachrichtigungskanal in den Einstellungen.",
"goToSettings": "Zu den Einstellungen", "goToSettings": "Zu den Einstellungen",
"channelDisabled": "Deaktiviert", "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", "eventPersonalRecord": "Persönlicher Rekord",
"eventPersonalRecordDesc": "Push bei einem neuen Bestwert für eine erfasste Kennzahl oder ein Training. Standardmäßig aus." "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": { "i18n": {
"maintainershipBanner": { "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.", "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" "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": { "targets": {
"title": "Zielwerte", "title": "Zielwerte",
"introText": "Deine aktuellen Werte im Vergleich zu empfohlenen Zielbereichen. Quellen der Leitlinien sind auf jeder Karte verlinkt.", "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", "bmi": "BMI",
"bodyFat": "Körperfett",
"stepsPerDay": "Schritte/Tag",
"medicationCompliance": "Einnahmetreue",
"steps": "Schritte",
"average30d": "30-Tage-Schnitt:", "average30d": "30-Tage-Schnitt:",
"consistency": { "consistency": {
"ariaLabel": "Letzte 7 Tage, im-Zielbereich-Status pro Tag", "ariaLabel": "Letzte 7 Tage, im-Zielbereich-Status pro Tag",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Close", "close": "Close",
"loading": "Loading...", "loading": "Loading...",
"error": "Error", "error": "Error",
"success": "Success",
"saved": "Saved", "saved": "Saved",
"confirm": "Confirm",
"back": "Back",
"next": "Next",
"yes": "Yes",
"no": "No", "no": "No",
"search": "Search",
"filter": "Filter",
"noData": "No data available", "noData": "No data available",
"optional": "Optional", "optional": "Optional",
"required": "Required",
"all": "All",
"active": "Active", "active": "Active",
"inactive": "Inactive", "inactive": "Inactive",
"enabled": "Enabled", "enabled": "Enabled",
"disabled": "Disabled", "disabled": "Disabled",
"networkError": "Network error", "networkError": "Network error",
"unknownError": "Unknown error", "unknownError": "Unknown error",
"notLoggedIn": "Not logged in",
"noAccess": "Access denied",
"copied": "Copied!", "copied": "Copied!",
"or": "or", "or": "or",
"unknown": "Unknown", "unknown": "Unknown",
"replace": "Replace",
"add": "Add", "add": "Add",
"import": "Import", "import": "Import",
"test": "Test", "test": "Test",
@@ -169,7 +157,6 @@
"dashboard": "Dashboard", "dashboard": "Dashboard",
"measurements": "Measurements", "measurements": "Measurements",
"medications": "Medications", "medications": "Medications",
"charts": "History",
"insights": "Insights", "insights": "Insights",
"targets": "Targets", "targets": "Targets",
"achievements": "Achievements", "achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": { "auth": {
"login": "Sign in", "login": "Sign in",
"register": "Sign up", "register": "Sign up",
"loginTitle": "Sign In",
"registerTitle": "Sign Up",
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"email": "Email address", "email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password", "loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?", "noAccount": "Don't have an account?",
"hasAccount": "Already have an account?", "hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed", "loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed", "registerFailed": "Registration failed",
"createAccount": "Create account", "createAccount": "Create account",
"newAccount": "Create new account", "newAccount": "Create new account",
"backToPasskey": "Back to Passkey", "backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.", "passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters", "passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.", "passwordTooShort": "Password must be at least {minLength} characters long."
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
}, },
"dashboard": { "dashboard": {
"title": "Dashboard", "title": "Dashboard",
"subtitle": "Your health overview",
"greeting": { "greeting": {
"morning": "Good morning", "morning": "Good morning",
"day": "Hello", "day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Steps", "stepsShort": "Steps",
"vo2MaxShort": "VO₂ max", "vo2MaxShort": "VO₂ max",
"bpInTargetShort": "BP in Target", "bpInTargetShort": "BP in Target",
"days30Short": "30d",
"medications": "Medications", "medications": "Medications",
"insightsPreview": "AI Insights preview", "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", "quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood", "quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)", "compliance7d": "Compliance (7 days)",
"complianceGood": "Good",
"complianceLow": "Low",
"mood": "Mood", "mood": "Mood",
"customizeTitle": "Dashboard layout", "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", "layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved", "layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout", "layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection", "lastInjection": "Last injection",
"nextInjection": "Next injection", "nextInjection": "Next injection",
"weightDelta": "since start", "weightDelta": "since start",
"inDays": "in {count} days", "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."
}
} }
}, },
"measurements": { "measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement", "editMeasurement": "Edit measurement",
"type": "Type", "type": "Type",
"value": "Value", "value": "Value",
"unit": "Unit",
"date": "Date", "date": "Date",
"source": "Source", "source": "Source",
"notes": "Notes", "notes": "Notes",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)", "glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual", "glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed", "glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours", "unitHours": "hours",
"unitSteps": "steps", "unitSteps": "steps",
"sourceManual": "Manual", "sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.", "loginRequired": "Please sign in to view measurements.",
"allTypes": "All types", "allTypes": "All types",
"measurementCount": "{count} measurements", "measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet", "emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.", "emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter", "emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Actions", "actions": "Actions",
"deleteConfirmTitle": "Delete measurement?", "deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.", "deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} of {total}", "pageInfo": "Page {page} of {total}"
"showing": "Showing",
"of": "of",
"entries": "entries"
}, },
"mood": { "mood": {
"title": "Mood", "title": "Mood",
@@ -404,14 +357,9 @@
"levelOkay": "Okay", "levelOkay": "Okay",
"levelSchlecht": "Bad", "levelSchlecht": "Bad",
"levelLausig": "Terrible", "levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog", "sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods", "allMoods": "All moods",
"entryCount": "{count} entries", "entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet", "emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.", "emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter", "emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication", "editMedication": "Edit medication",
"newMedication": "New medication", "newMedication": "New medication",
"firstMedication": "Add first medication", "firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet", "emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.", "emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications", "loadFailed": "Could not load medications",
"retryLoad": "Retry", "retryLoad": "Retry",
"name": "Name", "name": "Name",
"dose": "Dose", "dose": "Dose",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "From", "scheduleFrom": "From",
"scheduleTo": "To", "scheduleTo": "To",
"scheduleLabel": "Label", "scheduleLabel": "Label",
"scheduleDays": "Days", "scheduleDays": "Days",
"scheduleDaily": "Daily", "scheduleDaily": "Daily",
"active": "Active",
"inactive": "Paused", "inactive": "Paused",
"intakeHistory": "Intake history", "intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Taken",
"markSkipped": "Skipped",
"deleteConfirm": "Delete medication?", "deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Compliance", "compliance": "Compliance",
"import": "Import",
"importIntakes": "Import intakes", "importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:", "importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file", "importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped", "importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed", "importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format", "importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}", "apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).", "apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active", "apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status", "statusLoadFailed": "Could not load status",
"changeFailed": "Change failed", "changeFailed": "Change failed",
"categoryBloodPressure": "Blood Pressure", "categoryBloodPressure": "Blood Pressure",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins", "categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid", "categoryThyroid": "Thyroid",
"categoryHormone": "Hormones", "categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?", "intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.", "intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes", "intakeCount": "{count} intakes",
"viewHistory": "History",
"today": "Today", "today": "Today",
"yesterday": "Yesterday", "yesterday": "Yesterday",
"tomorrow": "Tomorrow", "tomorrow": "Tomorrow",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial", "glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen", "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.", "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}", "glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}", "glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Next: {label}",
"glp1NextInjectionDays": "Next: {label} (in {days} days)", "glp1NextInjectionDays": "Next: {label} (in {days} days)",
"glp1NextInjectionToday": "Next: today", "glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow", "glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh", "siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm", "siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm", "siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.", "sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea", "sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation", "sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records", "purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.", "invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet", "noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake", "deleteIntakeAriaLabel": "Delete intake",
"actions": "Actions", "actions": "Actions",
"pageInfo": "Page {page} of {total}", "pageInfo": "Page {page} of {total}",
"loginRequiredIntakes": "Please sign in to view intakes.", "loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases", "phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.", "phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green", "phaseGreen": "Green",
@@ -872,24 +798,13 @@
} }
}, },
"charts": { "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", "weight": "Weight",
"bloodPressure": "Blood Pressure", "bloodPressure": "Blood Pressure",
"pulse": "Pulse", "pulse": "Pulse",
"bodyFat": "Body Fat", "bodyFat": "Body Fat",
"sleep": "Sleep", "sleep": "Sleep",
"steps": "Steps", "steps": "Steps",
"compliance": "Compliance",
"noData": "No data in selected time range", "noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg", "bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg", "bucketMonthly": "Monthly avg",
"points7Label": "7 pts", "points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time", "avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend", "trend7dShort": "7-day trend",
"trend": "Trend", "trend": "Trend",
"targetRanges": "Target ranges",
"perWeek": "/week", "perWeek": "/week",
"totalDelta": "Total", "totalDelta": "Total",
"selectMedication": "Select medication", "selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:", "colorRed": "Red:",
"mood": "Mood", "mood": "Mood",
"moodScore": "Mood Score", "moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Awful", "moodLabel1": "Awful",
"moodLabel2": "Bad", "moodLabel2": "Bad",
"moodLabel3": "Okay", "moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal", "personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal", "deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal", "deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target" "deltaVsTarget": "{delta} vs. target"
}, },
"chart": { "chart": {
@@ -989,25 +901,15 @@
}, },
"captionLastMonth": "vs. last month", "captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year", "captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": { "deltaVs": {
"lastMonth": "{delta} vs. last month", "lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year" "lastYear": "{delta} vs. last year"
}, },
"tooltipPrior": "Prior period", "tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": { "unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet", "lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year 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" "notAvailableForCompliance": "Comparison N/A for compliance"
}, },
"insights": { "insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data." "generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
}, },
"thresholds": { "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", "defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto", "autoModeLabel": "Auto",
"overrideModeLabel": "Override", "overrideModeLabel": "Override",
"resetAction": "Reset to default", "resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water", "metricBodyWater": "Body water",
"metricBoneMass": "Bone mass", "metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)", "metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.", "unsetExplanation": "No override — using computed default."
"loadError": "Could not load thresholds"
}, },
"onboarding": { "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.", "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.", "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": { "v2": {
"title": "Welcome to HealthLog", "title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.", "subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Step 3 of 4", "step3of4": "Step 3 of 4",
"step4of4": "Step 4 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": { "goals": {
"title": "What would you like to track?", "title": "What would you like to track?",
"body": "Pick the areas you care about. Your dashboard and the default reminders follow your choice.", "body": "Pick the areas you care about. Your dashboard and the default reminders follow your choice.",
@@ -1669,10 +1526,8 @@
"title": "Getting started", "title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.", "subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} of {total} done", "progress": "{done} of {total} done",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist", "dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item", "dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": { "items": {
"profileTitle": "Set your profile", "profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.", "profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go." "remainingMany": "{count} more readings to go."
}, },
"settings": { "settings": {
"title": "Settings",
"subtitle": "Profile, Security & Connections",
"researchMode": { "researchMode": {
"sectionTitle": "Research Mode", "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.", "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." "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", "profile": "Profile",
"security": "Security",
"language": "Language", "language": "Language",
"languageDescription": "Choose the display language of the application.", "languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Username", "username": "Username",
"height": "Height (cm)", "height": "Height (cm)",
"dateOfBirth": "Date of birth", "dateOfBirth": "Date of birth",
@@ -1930,16 +1774,6 @@
"webPushActive": "Active", "webPushActive": "Active",
"kiInsights": "AI Insights (OpenAI)", "kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.", "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.", "codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.", "codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.", "codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.", "regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated", "lastGeneratedAt": "Last generated",
"ai": { "ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected", "chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active", "adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired", "connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.", "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", "deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:", "deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:", "deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…", "deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Cancel", "deviceCodeCancel": "Cancel",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.", "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", "modelLabel": "Model",
"modelOptionDefault": "— Default —", "modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…", "modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name", "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", "anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL", "baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)", "localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})", "savedPreview": "(saved {preview})",
"savedShort": "(saved)", "savedShort": "(saved)",
"saveCta": "Save", "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", "saved": "Saved",
"saveFailed": "Save failed", "saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Error", "errorGeneric": "Error",
"providerChain": { "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": { "types": {
"codex": "ChatGPT (Codex)", "codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)", "openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials", "withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured", "configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now", "withingsSync": "Sync now",
"withingsFullSync": "Sync all data", "withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?", "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": { "integrationPill": {
"connected": "Connected", "connected": "Connected",
"errorReconnect": "Error — reconnect", "errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
}, },
"apiTokens": "API Tokens", "apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).", "apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)", "tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.", "tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?", "tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Actions", "tokenTableActions": "Actions",
"noActiveTokens": "No active tokens available.", "noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints", "apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.", "apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method", "apiEndpointMethod": "Method",
"apiEndpointPath": "Path", "apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication", "apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example", "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", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data", "dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.", "dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?", "dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently", "finalDelete": "Delete permanently",
"saved": "Saved", "saved": "Saved",
"savingError": "Error saving", "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", "moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog", "moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL", "moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect", "moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?", "moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.", "moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries", "moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized", "moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed", "moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration", "title": "Administration",
"subtitle": "System status, users, and settings", "subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings", "settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status", "systemStatus": "System Status",
"version": "Version",
"database": "Database", "database": "Database",
"databaseConnected": "Connected", "databaseConnected": "Connected",
"databaseError": "Error", "databaseError": "Error",
"gitCommit": "Git Commit",
"startedAt": "Started", "startedAt": "Started",
"users": "Users", "users": "Users",
"measurementsCount": "Measurements", "measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)", "load1": "Load (1m)",
"memUsedPercent": "Memory", "memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O", "diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours", "last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.", "empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page." "loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push", "integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report", "integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.", "apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integrations",
"sectionMedication": "Medications",
"sectionManagement": "Management",
"umamiTitle": "Umami", "umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami", "umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip", "glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip", "glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID", "webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.", "umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL", "umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>", "glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment", "glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production", "glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.", "webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key", "webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject", "webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com", "webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured", "configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent", "monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed", "monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)", "bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.", "bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled", "bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo", "bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token", "bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...", "bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management", "userManagement": "User Management",
"userName": "Name", "userName": "Name",
"userEmail": "Email", "userEmail": "Email",
@@ -2438,7 +2156,6 @@
"toUser": "Make user", "toUser": "Make user",
"toAdmin": "Make admin", "toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role", "ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password", "resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}", "resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password", "newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used", "tokenLastUsed": "Last used",
"tokenCreated": "Created", "tokenCreated": "Created",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet", "tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.", "tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview", "loginOverview": "Login Overview",
"allAuthEvents": "All auth events", "allAuthEvents": "All auth events",
"failedOnly": "Failed only", "failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.", "loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
"loginEmptyFailedTitle": "No failed sign-in attempts", "loginEmptyFailedTitle": "No failed sign-in attempts",
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.", "loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Success", "outcomeSuccess": "Success",
"outcomeFailed": "Failed", "outcomeFailed": "Failed",
"auditDetails": "Details", "auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally", "deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.", "deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?", "deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.", "reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
"reminderMissedMinutes": "Missed threshold (minutes)", "reminderMissedMinutes": "Missed threshold (minutes)",
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.", "reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test", "notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent", "notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification", "notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today", "reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent", "reminderCheckNotifSent": "Sent",
"feedback": { "feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open", "tabOpen": "Open",
"tabAcknowledged": "Acknowledged", "tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved", "tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted", "createdAt": "Submitted",
"actions": "Actions", "actions": "Actions",
"details": "Details", "details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up", "emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.", "emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...", "loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature", "categoryFeature": "Feature",
"categoryQuestion": "Question", "categoryQuestion": "Question",
"categoryOther": "Other", "categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata", "metadataHeading": "Metadata",
"metaUrl": "URL", "metaUrl": "URL",
"metaLocale": "Locale", "metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed", "publishFailed": "GitHub publish failed",
"updateFailed": "Update failed", "updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?", "archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by", "submittedBy": "Submitted by"
"sectionTitle": "Feedback"
}, },
"shell": { "shell": {
"overview": "Overview", "overview": "Overview",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events." "subtitle": "Audit trail of authentication and admin events."
}, },
"auditLog": { "auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)", "filterActor": "Actor (user id or username)",
"filterAction": "Action", "filterAction": "Action",
"filterActionAll": "All actions", "filterActionAll": "All actions",
"filterTarget": "Target (id or path)", "filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range", "filterDate": "Date range",
"range24h": "Last 24 hours", "range24h": "Last 24 hours",
"range7d": "Last 7 days", "range7d": "Last 7 days",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup", "runFailed": "Failed to enqueue backup",
"loading": "Loading backups...", "loading": "Loading backups...",
"loadError": "Failed to load backups.", "loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet", "emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.", "emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User", "colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal", "nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!", "allCompleted": "All achievements unlocked!",
"completed": "Completed", "completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached", "goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable", "remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.", "noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points", "pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement" "ariaLabel": "Hidden locked achievement"
}, },
"hiddenUnlockToast": { "hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!", "title": "You unlocked a hidden achievement!"
"description": "Tap to see the surprise."
}, },
"dashboardCard": { "dashboardCard": {
"title": "Recent unlocks", "title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.", "loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title", "bugTitle": "Title",
"description": "Description", "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", "submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.", "success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report", "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", "category": "Type",
"categoryBug": "Bug report", "categoryBug": "Bug report",
"categoryFeature": "Feature request", "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.", "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.", "internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off", "disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.", "disabledBody": "The administrator has disabled bug reports on this server."
"disabledError": "Bug reports are disabled by the administrator."
}, },
"notifications": { "notifications": {
"title": "Notifications", "title": "Notifications",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.", "noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings", "goToSettings": "Go to Settings",
"channelDisabled": "Disabled", "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", "eventPersonalRecord": "Personal Record",
"eventPersonalRecordDesc": "Push when an all-time best is reached for a tracked metric or workout. Off by default." "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": { "i18n": {
"maintainershipBanner": { "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.", "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" "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": { "targets": {
"title": "Targets", "title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.", "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", "bmi": "BMI",
"bodyFat": "Body fat",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "steps",
"average30d": "30-day average:", "average30d": "30-day average:",
"consistency": { "consistency": {
"ariaLabel": "Last 7 days, in-range status per day", "ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Cerrar", "close": "Cerrar",
"loading": "Cargando…...", "loading": "Cargando…...",
"error": "Error", "error": "Error",
"success": "Éxito",
"saved": "Guardado", "saved": "Guardado",
"confirm": "Confirmar",
"back": "Atrás",
"next": "Siguiente",
"yes": "Sí",
"no": "No", "no": "No",
"search": "Buscar",
"filter": "Filtrar",
"noData": "Sin datos disponibles", "noData": "Sin datos disponibles",
"optional": "Opcional", "optional": "Opcional",
"required": "Obligatorio",
"all": "Todo",
"active": "Activo", "active": "Activo",
"inactive": "Inactivo", "inactive": "Inactivo",
"enabled": "Activado", "enabled": "Activado",
"disabled": "Desactivado", "disabled": "Desactivado",
"networkError": "Error de red", "networkError": "Error de red",
"unknownError": "Error desconocido", "unknownError": "Error desconocido",
"notLoggedIn": "No conectado",
"noAccess": "Acceso denegado",
"copied": "Copied!", "copied": "Copied!",
"or": "o", "or": "o",
"unknown": "Desconocido", "unknown": "Desconocido",
"replace": "Reemplazar",
"add": "Añadir", "add": "Añadir",
"import": "Importar", "import": "Importar",
"test": "Probar", "test": "Probar",
@@ -169,7 +157,6 @@
"dashboard": "Panel", "dashboard": "Panel",
"measurements": "Measurements", "measurements": "Measurements",
"medications": "Medicamentos", "medications": "Medicamentos",
"charts": "Historial",
"insights": "Análisis", "insights": "Análisis",
"targets": "Targets", "targets": "Targets",
"achievements": "Achievements", "achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": { "auth": {
"login": "Iniciar sesión", "login": "Iniciar sesión",
"register": "Registrarse", "register": "Registrarse",
"loginTitle": "Iniciar sesión",
"registerTitle": "Registrarse",
"username": "Nombre de usuario", "username": "Nombre de usuario",
"password": "Contraseña", "password": "Contraseña",
"email": "Email address", "email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password", "loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?", "noAccount": "Don't have an account?",
"hasAccount": "Already have an account?", "hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed", "loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed", "registerFailed": "Registration failed",
"createAccount": "Create account", "createAccount": "Create account",
"newAccount": "Create new account", "newAccount": "Create new account",
"backToPasskey": "Back to Passkey", "backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.", "passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters", "passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.", "passwordTooShort": "Password must be at least {minLength} characters long."
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
}, },
"dashboard": { "dashboard": {
"title": "Panel", "title": "Panel",
"subtitle": "Your health overview",
"greeting": { "greeting": {
"morning": "Good morning", "morning": "Good morning",
"day": "Hello", "day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Pasos", "stepsShort": "Pasos",
"vo2MaxShort": "VO₂ max", "vo2MaxShort": "VO₂ max",
"bpInTargetShort": "PA-objetivo", "bpInTargetShort": "PA-objetivo",
"days30Short": "30d",
"medications": "Medicamentos", "medications": "Medicamentos",
"insightsPreview": "AI Insights preview", "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", "quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood", "quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)", "compliance7d": "Compliance (7 days)",
"complianceGood": "Bien",
"complianceLow": "Low",
"mood": "Estado de ánimo", "mood": "Estado de ánimo",
"customizeTitle": "Dashboard layout", "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", "layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved", "layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout", "layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection", "lastInjection": "Last injection",
"nextInjection": "Next injection", "nextInjection": "Next injection",
"weightDelta": "since start", "weightDelta": "since start",
"inDays": "in {count} days", "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."
}
} }
}, },
"measurements": { "measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement", "editMeasurement": "Edit measurement",
"type": "Tipo", "type": "Tipo",
"value": "Valor", "value": "Valor",
"unit": "Unit",
"date": "Fecha", "date": "Fecha",
"source": "Source", "source": "Source",
"notes": "Notas", "notes": "Notas",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)", "glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual", "glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed", "glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours", "unitHours": "hours",
"unitSteps": "Pasos", "unitSteps": "Pasos",
"sourceManual": "Manual", "sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.", "loginRequired": "Please sign in to view measurements.",
"allTypes": "All types", "allTypes": "All types",
"measurementCount": "{count} measurements", "measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet", "emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.", "emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter", "emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Acciones", "actions": "Acciones",
"deleteConfirmTitle": "Delete measurement?", "deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.", "deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} de{total}", "pageInfo": "Page {page} de{total}"
"showing": "Showing",
"of": "de",
"entries": "entries"
}, },
"mood": { "mood": {
"title": "Estado de ánimo", "title": "Estado de ánimo",
@@ -404,14 +357,9 @@
"levelOkay": "Okay", "levelOkay": "Okay",
"levelSchlecht": "Mal", "levelSchlecht": "Mal",
"levelLausig": "Terrible", "levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog", "sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods", "allMoods": "All moods",
"entryCount": "{count} entries", "entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet", "emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.", "emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter", "emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication", "editMedication": "Edit medication",
"newMedication": "New medication", "newMedication": "New medication",
"firstMedication": "Add first medication", "firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet", "emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.", "emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications", "loadFailed": "Could not load medications",
"retryLoad": "Reintentar", "retryLoad": "Reintentar",
"name": "Nombre", "name": "Nombre",
"dose": "Dosis", "dose": "Dosis",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "Desde", "scheduleFrom": "Desde",
"scheduleTo": "Hasta", "scheduleTo": "Hasta",
"scheduleLabel": "Label", "scheduleLabel": "Label",
"scheduleDays": "Days", "scheduleDays": "Days",
"scheduleDaily": "Daily", "scheduleDaily": "Daily",
"active": "Activo",
"inactive": "Paused", "inactive": "Paused",
"intakeHistory": "Intake history", "intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Tomada",
"markSkipped": "Omitida",
"deleteConfirm": "Delete medication?", "deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Cumplimiento", "compliance": "Cumplimiento",
"import": "Importar",
"importIntakes": "Import intakes", "importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:", "importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file", "importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped", "importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed", "importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format", "importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}", "apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).", "apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active", "apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status", "statusLoadFailed": "Could not load status",
"changeFailed": "Change failed", "changeFailed": "Change failed",
"categoryBloodPressure": "Presión arterial", "categoryBloodPressure": "Presión arterial",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins", "categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid", "categoryThyroid": "Thyroid",
"categoryHormone": "Hormones", "categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?", "intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.", "intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes", "intakeCount": "{count} intakes",
"viewHistory": "Historial",
"today": "Hoy", "today": "Hoy",
"yesterday": "Ayer", "yesterday": "Ayer",
"tomorrow": "Mañana", "tomorrow": "Mañana",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial", "glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen", "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.", "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}", "glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}", "glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Siguiente:{label}",
"glp1NextInjectionDays": "Siguiente:{label} (in {days} days)", "glp1NextInjectionDays": "Siguiente:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today", "glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow", "glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh", "siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm", "siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm", "siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.", "sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea", "sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation", "sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records", "purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.", "invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet", "noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake", "deleteIntakeAriaLabel": "Delete intake",
"actions": "Acciones", "actions": "Acciones",
"pageInfo": "Page {page} de{total}", "pageInfo": "Page {page} de{total}",
"loginRequiredIntakes": "Please sign in to view intakes.", "loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases", "phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.", "phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green", "phaseGreen": "Green",
@@ -872,24 +798,13 @@
} }
}, },
"charts": { "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", "weight": "Peso",
"bloodPressure": "Presión arterial", "bloodPressure": "Presión arterial",
"pulse": "Pulso", "pulse": "Pulso",
"bodyFat": "Grasa corporal", "bodyFat": "Grasa corporal",
"sleep": "Sueño", "sleep": "Sueño",
"steps": "Pasos", "steps": "Pasos",
"compliance": "Cumplimiento",
"noData": "No data in selected time range", "noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg", "bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg", "bucketMonthly": "Monthly avg",
"points7Label": "7 pts", "points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time", "avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend", "trend7dShort": "7-day trend",
"trend": "Tendencia", "trend": "Tendencia",
"targetRanges": "Target ranges",
"perWeek": "/week", "perWeek": "/week",
"totalDelta": "Total", "totalDelta": "Total",
"selectMedication": "Select medication", "selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:", "colorRed": "Red:",
"mood": "Estado de ánimo", "mood": "Estado de ánimo",
"moodScore": "Mood Score", "moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Terrible", "moodLabel1": "Terrible",
"moodLabel2": "Mal", "moodLabel2": "Mal",
"moodLabel3": "Okay", "moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal", "personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal", "deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal", "deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target" "deltaVsTarget": "{delta} vs. target"
}, },
"chart": { "chart": {
@@ -989,25 +901,15 @@
}, },
"captionLastMonth": "vs. last month", "captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year", "captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": { "deltaVs": {
"lastMonth": "{delta} vs. last month", "lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year" "lastYear": "{delta} vs. last year"
}, },
"tooltipPrior": "Prior period", "tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": { "unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet", "lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year 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" "notAvailableForCompliance": "Comparison N/A for compliance"
}, },
"insights": { "insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data." "generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
}, },
"thresholds": { "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", "defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto", "autoModeLabel": "Auto",
"overrideModeLabel": "Override", "overrideModeLabel": "Override",
"resetAction": "Reset to default", "resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water", "metricBodyWater": "Body water",
"metricBoneMass": "Bone mass", "metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)", "metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.", "unsetExplanation": "No override — using computed default."
"loadError": "Could not load thresholds"
}, },
"onboarding": { "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.", "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.", "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": { "v2": {
"title": "Welcome to HealthLog", "title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.", "subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Paso 3 de 4", "step3of4": "Paso 3 de 4",
"step4of4": "Paso 4 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": { "goals": {
"title": "¿Qué te gustaría registrar?", "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.", "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", "title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.", "subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} de{total} Hecho", "progress": "{done} de{total} Hecho",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist", "dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item", "dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": { "items": {
"profileTitle": "Set your profile", "profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.", "profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go." "remainingMany": "{count} more readings to go."
}, },
"settings": { "settings": {
"title": "Ajustes",
"subtitle": "Profile, Security & Connections",
"researchMode": { "researchMode": {
"sectionTitle": "Modo Investigación", "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.", "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." "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", "profile": "Perfil",
"security": "Seguridad",
"language": "Idioma", "language": "Idioma",
"languageDescription": "Choose the display language of the application.", "languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nombre de usuario", "username": "Nombre de usuario",
"height": "Height (cm)", "height": "Height (cm)",
"dateOfBirth": "Fecha de nacimiento", "dateOfBirth": "Fecha de nacimiento",
@@ -1930,16 +1774,6 @@
"webPushActive": "Activo", "webPushActive": "Activo",
"kiInsights": "AI Insights (OpenAI)", "kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.", "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.", "codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.", "codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.", "codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.", "regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated", "lastGeneratedAt": "Last generated",
"ai": { "ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected", "chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active", "adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired", "connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.", "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", "deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:", "deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:", "deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…", "deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Cancelar", "deviceCodeCancel": "Cancelar",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.", "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", "modelLabel": "Model",
"modelOptionDefault": "— Default —", "modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…", "modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name", "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", "anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL", "baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)", "localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})", "savedPreview": "(saved {preview})",
"savedShort": "(saved)", "savedShort": "(saved)",
"saveCta": "Guardar", "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", "saved": "Guardado",
"saveFailed": "Save failed", "saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Error", "errorGeneric": "Error",
"providerChain": { "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": { "types": {
"codex": "ChatGPT (Codex)", "codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)", "openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials", "withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured", "configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now", "withingsSync": "Sync now",
"withingsFullSync": "Sync all data", "withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?", "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": { "integrationPill": {
"connected": "Connected", "connected": "Connected",
"errorReconnect": "Error — reconnect", "errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
}, },
"apiTokens": "API Tokens", "apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).", "apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)", "tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.", "tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?", "tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Acciones", "tokenTableActions": "Acciones",
"noActiveTokens": "No active tokens available.", "noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints", "apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.", "apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method", "apiEndpointMethod": "Method",
"apiEndpointPath": "Path", "apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication", "apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example", "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", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data", "dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.", "dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?", "dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently", "finalDelete": "Delete permanently",
"saved": "Guardado", "saved": "Guardado",
"savingError": "Error saving", "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", "moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog", "moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL", "moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect", "moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?", "moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.", "moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries", "moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized", "moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed", "moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration", "title": "Administration",
"subtitle": "System status, users, and settings", "subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings", "settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status", "systemStatus": "System Status",
"version": "Version",
"database": "Database", "database": "Database",
"databaseConnected": "Connected", "databaseConnected": "Connected",
"databaseError": "Error", "databaseError": "Error",
"gitCommit": "Git Commit",
"startedAt": "Started", "startedAt": "Started",
"users": "Users", "users": "Users",
"measurementsCount": "Measurements", "measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)", "load1": "Load (1m)",
"memUsedPercent": "Memory", "memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O", "diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours", "last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.", "empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page." "loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push", "integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report", "integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.", "apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integraciones",
"sectionMedication": "Medicamentos",
"sectionManagement": "Management",
"umamiTitle": "Umami", "umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami", "umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip", "glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip", "glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID", "webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.", "umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL", "umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>", "glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment", "glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production", "glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.", "webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key", "webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject", "webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com", "webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured", "configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent", "monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed", "monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)", "bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.", "bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled", "bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo", "bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token", "bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...", "bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management", "userManagement": "User Management",
"userName": "Nombre", "userName": "Nombre",
"userEmail": "Correo electrónico", "userEmail": "Correo electrónico",
@@ -2438,7 +2156,6 @@
"toUser": "Make user", "toUser": "Make user",
"toAdmin": "Make admin", "toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role", "ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password", "resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}", "resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password", "newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used", "tokenLastUsed": "Last used",
"tokenCreated": "Created", "tokenCreated": "Created",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet", "tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.", "tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview", "loginOverview": "Login Overview",
"allAuthEvents": "All auth events", "allAuthEvents": "All auth events",
"failedOnly": "Failed only", "failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.", "loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
"loginEmptyFailedTitle": "No failed sign-in attempts", "loginEmptyFailedTitle": "No failed sign-in attempts",
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.", "loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Éxito", "outcomeSuccess": "Éxito",
"outcomeFailed": "Failed", "outcomeFailed": "Failed",
"auditDetails": "Details", "auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally", "deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.", "deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?", "deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.", "reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
"reminderMissedMinutes": "Missed threshold (minutes)", "reminderMissedMinutes": "Missed threshold (minutes)",
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.", "reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test", "notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent", "notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification", "notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today", "reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent", "reminderCheckNotifSent": "Sent",
"feedback": { "feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open", "tabOpen": "Open",
"tabAcknowledged": "Acknowledged", "tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved", "tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted", "createdAt": "Submitted",
"actions": "Acciones", "actions": "Acciones",
"details": "Details", "details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up", "emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.", "emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...", "loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature", "categoryFeature": "Feature",
"categoryQuestion": "Question", "categoryQuestion": "Question",
"categoryOther": "Other", "categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata", "metadataHeading": "Metadata",
"metaUrl": "URL", "metaUrl": "URL",
"metaLocale": "Locale", "metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed", "publishFailed": "GitHub publish failed",
"updateFailed": "Update failed", "updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?", "archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by", "submittedBy": "Submitted by"
"sectionTitle": "Feedback"
}, },
"shell": { "shell": {
"overview": "Resumen", "overview": "Resumen",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events." "subtitle": "Audit trail of authentication and admin events."
}, },
"auditLog": { "auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)", "filterActor": "Actor (user id or username)",
"filterAction": "Action", "filterAction": "Action",
"filterActionAll": "All actions", "filterActionAll": "All actions",
"filterTarget": "Target (id or path)", "filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range", "filterDate": "Date range",
"range24h": "Last 24 hours", "range24h": "Last 24 hours",
"range7d": "Últimos 7 días", "range7d": "Últimos 7 días",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup", "runFailed": "Failed to enqueue backup",
"loading": "Loading backups...", "loading": "Loading backups...",
"loadError": "Failed to load backups.", "loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet", "emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.", "emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User", "colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal", "nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!", "allCompleted": "All achievements unlocked!",
"completed": "Completed", "completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached", "goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable", "remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.", "noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points", "pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement" "ariaLabel": "Hidden locked achievement"
}, },
"hiddenUnlockToast": { "hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!", "title": "You unlocked a hidden achievement!"
"description": "Tap to see the surprise."
}, },
"dashboardCard": { "dashboardCard": {
"title": "Recent unlocks", "title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.", "loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title", "bugTitle": "Title",
"description": "Descripción", "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", "submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.", "success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report", "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", "category": "Tipo",
"categoryBug": "Bug report", "categoryBug": "Bug report",
"categoryFeature": "Feature request", "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.", "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.", "internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off", "disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.", "disabledBody": "The administrator has disabled bug reports on this server."
"disabledError": "Bug reports are disabled by the administrator."
}, },
"notifications": { "notifications": {
"title": "Notificaciones", "title": "Notificaciones",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.", "noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings", "goToSettings": "Go to Settings",
"channelDisabled": "Desactivado", "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", "eventPersonalRecord": "Récord personal",
"eventPersonalRecordDesc": "Notificación cuando se alcanza un nuevo récord en una métrica o entrenamiento. Desactivado por defecto." "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": { "i18n": {
"maintainershipBanner": { "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.", "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" "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": { "targets": {
"title": "Targets", "title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.", "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", "bmi": "IMC",
"bodyFat": "Grasa corporal",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Pasos",
"average30d": "30-day average:", "average30d": "30-day average:",
"consistency": { "consistency": {
"ariaLabel": "Last 7 days, in-range status per day", "ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Fermer", "close": "Fermer",
"loading": "Chargement…...", "loading": "Chargement…...",
"error": "Erreur", "error": "Erreur",
"success": "Succès",
"saved": "Enregistré", "saved": "Enregistré",
"confirm": "Confirmer",
"back": "Retour",
"next": "Suivant",
"yes": "Oui",
"no": "Non", "no": "Non",
"search": "Rechercher",
"filter": "Filtrer",
"noData": "Aucune donnée disponible", "noData": "Aucune donnée disponible",
"optional": "Facultatif", "optional": "Facultatif",
"required": "Requis",
"all": "Tout",
"active": "Actif", "active": "Actif",
"inactive": "Inactif", "inactive": "Inactif",
"enabled": "Activé", "enabled": "Activé",
"disabled": "Désactivé", "disabled": "Désactivé",
"networkError": "Erreur réseau", "networkError": "Erreur réseau",
"unknownError": "Erreur inconnue", "unknownError": "Erreur inconnue",
"notLoggedIn": "Non connecté",
"noAccess": "Accès refusé",
"copied": "Copied!", "copied": "Copied!",
"or": "ou", "or": "ou",
"unknown": "Inconnu", "unknown": "Inconnu",
"replace": "Remplacer",
"add": "Ajouter", "add": "Ajouter",
"import": "Importer", "import": "Importer",
"test": "Tester", "test": "Tester",
@@ -169,7 +157,6 @@
"dashboard": "Tableau de bord", "dashboard": "Tableau de bord",
"measurements": "Measurements", "measurements": "Measurements",
"medications": "Médicaments", "medications": "Médicaments",
"charts": "Historique",
"insights": "Analyses", "insights": "Analyses",
"targets": "Targets", "targets": "Targets",
"achievements": "Achievements", "achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": { "auth": {
"login": "Se connecter", "login": "Se connecter",
"register": "S'inscrire", "register": "S'inscrire",
"loginTitle": "Se connecter",
"registerTitle": "S'inscrire",
"username": "Nom d'utilisateur", "username": "Nom d'utilisateur",
"password": "Mot de passe", "password": "Mot de passe",
"email": "Email address", "email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password", "loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?", "noAccount": "Don't have an account?",
"hasAccount": "Already have an account?", "hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed", "loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed", "registerFailed": "Registration failed",
"createAccount": "Create account", "createAccount": "Create account",
"newAccount": "Create new account", "newAccount": "Create new account",
"backToPasskey": "Back to Passkey", "backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.", "passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters", "passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.", "passwordTooShort": "Password must be at least {minLength} characters long."
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
}, },
"dashboard": { "dashboard": {
"title": "Tableau de bord", "title": "Tableau de bord",
"subtitle": "Your health overview",
"greeting": { "greeting": {
"morning": "Good morning", "morning": "Good morning",
"day": "Hello", "day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Pas", "stepsShort": "Pas",
"vo2MaxShort": "VO₂ max", "vo2MaxShort": "VO₂ max",
"bpInTargetShort": "TA-cible", "bpInTargetShort": "TA-cible",
"days30Short": "30d",
"medications": "Médicaments", "medications": "Médicaments",
"insightsPreview": "AI Insights preview", "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", "quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood", "quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)", "compliance7d": "Compliance (7 days)",
"complianceGood": "Bien",
"complianceLow": "Low",
"mood": "Humeur", "mood": "Humeur",
"customizeTitle": "Dashboard layout", "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", "layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved", "layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout", "layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection", "lastInjection": "Last injection",
"nextInjection": "Next injection", "nextInjection": "Next injection",
"weightDelta": "since start", "weightDelta": "since start",
"inDays": "in {count} days", "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."
}
} }
}, },
"measurements": { "measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement", "editMeasurement": "Edit measurement",
"type": "Type", "type": "Type",
"value": "Valeur", "value": "Valeur",
"unit": "Unit",
"date": "Date", "date": "Date",
"source": "Source", "source": "Source",
"notes": "Notes", "notes": "Notes",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)", "glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual", "glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed", "glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours", "unitHours": "hours",
"unitSteps": "Pas", "unitSteps": "Pas",
"sourceManual": "Manual", "sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.", "loginRequired": "Please sign in to view measurements.",
"allTypes": "All types", "allTypes": "All types",
"measurementCount": "{count} measurements", "measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet", "emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.", "emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter", "emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Actions", "actions": "Actions",
"deleteConfirmTitle": "Delete measurement?", "deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.", "deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} de{total}", "pageInfo": "Page {page} de{total}"
"showing": "Showing",
"of": "de",
"entries": "entries"
}, },
"mood": { "mood": {
"title": "Humeur", "title": "Humeur",
@@ -404,14 +357,9 @@
"levelOkay": "Okay", "levelOkay": "Okay",
"levelSchlecht": "Mauvais", "levelSchlecht": "Mauvais",
"levelLausig": "Terrible", "levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog", "sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods", "allMoods": "All moods",
"entryCount": "{count} entries", "entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet", "emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.", "emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter", "emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication", "editMedication": "Edit medication",
"newMedication": "New medication", "newMedication": "New medication",
"firstMedication": "Add first medication", "firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet", "emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.", "emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications", "loadFailed": "Could not load medications",
"retryLoad": "Réessayer", "retryLoad": "Réessayer",
"name": "Nom", "name": "Nom",
"dose": "Dose", "dose": "Dose",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "De", "scheduleFrom": "De",
"scheduleTo": "À", "scheduleTo": "À",
"scheduleLabel": "Label", "scheduleLabel": "Label",
"scheduleDays": "Days", "scheduleDays": "Days",
"scheduleDaily": "Daily", "scheduleDaily": "Daily",
"active": "Actif",
"inactive": "Paused", "inactive": "Paused",
"intakeHistory": "Intake history", "intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Pris",
"markSkipped": "Sauté",
"deleteConfirm": "Delete medication?", "deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Observance", "compliance": "Observance",
"import": "Importer",
"importIntakes": "Import intakes", "importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:", "importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file", "importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped", "importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed", "importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format", "importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}", "apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).", "apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active", "apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status", "statusLoadFailed": "Could not load status",
"changeFailed": "Change failed", "changeFailed": "Change failed",
"categoryBloodPressure": "Tension artérielle", "categoryBloodPressure": "Tension artérielle",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins", "categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid", "categoryThyroid": "Thyroid",
"categoryHormone": "Hormones", "categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?", "intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.", "intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes", "intakeCount": "{count} intakes",
"viewHistory": "Historique",
"today": "Aujourd'hui", "today": "Aujourd'hui",
"yesterday": "Hier", "yesterday": "Hier",
"tomorrow": "Demain", "tomorrow": "Demain",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial", "glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen", "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.", "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}", "glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}", "glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Suivant:{label}",
"glp1NextInjectionDays": "Suivant:{label} (in {days} days)", "glp1NextInjectionDays": "Suivant:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today", "glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow", "glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh", "siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm", "siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm", "siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.", "sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea", "sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation", "sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records", "purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.", "invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet", "noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake", "deleteIntakeAriaLabel": "Delete intake",
"actions": "Actions", "actions": "Actions",
"pageInfo": "Page {page} de{total}", "pageInfo": "Page {page} de{total}",
"loginRequiredIntakes": "Please sign in to view intakes.", "loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases", "phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.", "phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green", "phaseGreen": "Green",
@@ -872,24 +798,13 @@
} }
}, },
"charts": { "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", "weight": "Poids",
"bloodPressure": "Tension artérielle", "bloodPressure": "Tension artérielle",
"pulse": "Pouls", "pulse": "Pouls",
"bodyFat": "Masse grasse", "bodyFat": "Masse grasse",
"sleep": "Sommeil", "sleep": "Sommeil",
"steps": "Pas", "steps": "Pas",
"compliance": "Observance",
"noData": "No data in selected time range", "noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg", "bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg", "bucketMonthly": "Monthly avg",
"points7Label": "7 pts", "points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time", "avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend", "trend7dShort": "7-day trend",
"trend": "Tendance", "trend": "Tendance",
"targetRanges": "Target ranges",
"perWeek": "/week", "perWeek": "/week",
"totalDelta": "Total", "totalDelta": "Total",
"selectMedication": "Select medication", "selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:", "colorRed": "Red:",
"mood": "Humeur", "mood": "Humeur",
"moodScore": "Mood Score", "moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Terrible", "moodLabel1": "Terrible",
"moodLabel2": "Mauvais", "moodLabel2": "Mauvais",
"moodLabel3": "Okay", "moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal", "personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal", "deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal", "deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target" "deltaVsTarget": "{delta} vs. target"
}, },
"chart": { "chart": {
@@ -989,25 +901,15 @@
}, },
"captionLastMonth": "vs. last month", "captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year", "captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": { "deltaVs": {
"lastMonth": "{delta} vs. last month", "lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year" "lastYear": "{delta} vs. last year"
}, },
"tooltipPrior": "Prior period", "tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": { "unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet", "lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year 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" "notAvailableForCompliance": "Comparison N/A for compliance"
}, },
"insights": { "insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data." "generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
}, },
"thresholds": { "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", "defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto", "autoModeLabel": "Auto",
"overrideModeLabel": "Override", "overrideModeLabel": "Override",
"resetAction": "Reset to default", "resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water", "metricBodyWater": "Body water",
"metricBoneMass": "Bone mass", "metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)", "metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.", "unsetExplanation": "No override — using computed default."
"loadError": "Could not load thresholds"
}, },
"onboarding": { "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.", "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.", "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": { "v2": {
"title": "Welcome to HealthLog", "title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.", "subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Étape 3 sur 4", "step3of4": "Étape 3 sur 4",
"step4of4": "Étape 4 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": { "goals": {
"title": "Que souhaitez-vous suivre ?", "title": "Que souhaitez-vous suivre ?",
"body": "Sélectionnez les domaines qui comptent pour vous. Le tableau de bord et les rappels s'y adapteront.", "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", "title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.", "subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} de{total} Terminé", "progress": "{done} de{total} Terminé",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist", "dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item", "dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": { "items": {
"profileTitle": "Set your profile", "profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.", "profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go." "remainingMany": "{count} more readings to go."
}, },
"settings": { "settings": {
"title": "Paramètres",
"subtitle": "Profile, Security & Connections",
"researchMode": { "researchMode": {
"sectionTitle": "Mode Recherche", "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.", "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." "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", "profile": "Profil",
"security": "Sécurité",
"language": "Langue", "language": "Langue",
"languageDescription": "Choose the display language of the application.", "languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nom d'utilisateur", "username": "Nom d'utilisateur",
"height": "Height (cm)", "height": "Height (cm)",
"dateOfBirth": "Date de naissance", "dateOfBirth": "Date de naissance",
@@ -1930,16 +1774,6 @@
"webPushActive": "Actif", "webPushActive": "Actif",
"kiInsights": "AI Insights (OpenAI)", "kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.", "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.", "codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.", "codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.", "codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.", "regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated", "lastGeneratedAt": "Last generated",
"ai": { "ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected", "chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active", "adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired", "connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.", "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", "deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:", "deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:", "deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…", "deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Annuler", "deviceCodeCancel": "Annuler",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.", "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", "modelLabel": "Model",
"modelOptionDefault": "— Default —", "modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…", "modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name", "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", "anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL", "baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)", "localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})", "savedPreview": "(saved {preview})",
"savedShort": "(saved)", "savedShort": "(saved)",
"saveCta": "Enregistrer", "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é", "saved": "Enregistré",
"saveFailed": "Save failed", "saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Erreur", "errorGeneric": "Erreur",
"providerChain": { "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": { "types": {
"codex": "ChatGPT (Codex)", "codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)", "openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials", "withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured", "configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now", "withingsSync": "Sync now",
"withingsFullSync": "Sync all data", "withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?", "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": { "integrationPill": {
"connected": "Connected", "connected": "Connected",
"errorReconnect": "Error — reconnect", "errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
}, },
"apiTokens": "API Tokens", "apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).", "apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)", "tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.", "tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?", "tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Actions", "tokenTableActions": "Actions",
"noActiveTokens": "No active tokens available.", "noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints", "apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.", "apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method", "apiEndpointMethod": "Method",
"apiEndpointPath": "Path", "apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication", "apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example", "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", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data", "dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.", "dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?", "dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently", "finalDelete": "Delete permanently",
"saved": "Enregistré", "saved": "Enregistré",
"savingError": "Error saving", "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", "moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog", "moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL", "moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect", "moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?", "moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.", "moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries", "moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized", "moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed", "moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration", "title": "Administration",
"subtitle": "System status, users, and settings", "subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings", "settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status", "systemStatus": "System Status",
"version": "Version",
"database": "Database", "database": "Database",
"databaseConnected": "Connected", "databaseConnected": "Connected",
"databaseError": "Erreur", "databaseError": "Erreur",
"gitCommit": "Git Commit",
"startedAt": "Started", "startedAt": "Started",
"users": "Users", "users": "Users",
"measurementsCount": "Measurements", "measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)", "load1": "Load (1m)",
"memUsedPercent": "Memory", "memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O", "diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours", "last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.", "empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page." "loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push", "integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report", "integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.", "apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Intégrations",
"sectionMedication": "Médicaments",
"sectionManagement": "Management",
"umamiTitle": "Umami", "umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami", "umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip", "glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip", "glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID", "webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.", "umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL", "umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>", "glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment", "glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production", "glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.", "webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key", "webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject", "webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com", "webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured", "configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent", "monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed", "monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)", "bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.", "bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled", "bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo", "bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token", "bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...", "bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management", "userManagement": "User Management",
"userName": "Nom", "userName": "Nom",
"userEmail": "E-mail", "userEmail": "E-mail",
@@ -2438,7 +2156,6 @@
"toUser": "Make user", "toUser": "Make user",
"toAdmin": "Make admin", "toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role", "ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password", "resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}", "resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password", "newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used", "tokenLastUsed": "Last used",
"tokenCreated": "Created", "tokenCreated": "Created",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet", "tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.", "tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview", "loginOverview": "Login Overview",
"allAuthEvents": "All auth events", "allAuthEvents": "All auth events",
"failedOnly": "Failed only", "failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.", "loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
"loginEmptyFailedTitle": "No failed sign-in attempts", "loginEmptyFailedTitle": "No failed sign-in attempts",
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.", "loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Succès", "outcomeSuccess": "Succès",
"outcomeFailed": "Failed", "outcomeFailed": "Failed",
"auditDetails": "Details", "auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally", "deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.", "deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?", "deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.", "reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
"reminderMissedMinutes": "Missed threshold (minutes)", "reminderMissedMinutes": "Missed threshold (minutes)",
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.", "reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test", "notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent", "notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification", "notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today", "reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent", "reminderCheckNotifSent": "Sent",
"feedback": { "feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open", "tabOpen": "Open",
"tabAcknowledged": "Acknowledged", "tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved", "tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted", "createdAt": "Submitted",
"actions": "Actions", "actions": "Actions",
"details": "Details", "details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up", "emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.", "emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...", "loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature", "categoryFeature": "Feature",
"categoryQuestion": "Question", "categoryQuestion": "Question",
"categoryOther": "Other", "categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata", "metadataHeading": "Metadata",
"metaUrl": "URL", "metaUrl": "URL",
"metaLocale": "Locale", "metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed", "publishFailed": "GitHub publish failed",
"updateFailed": "Update failed", "updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?", "archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by", "submittedBy": "Submitted by"
"sectionTitle": "Feedback"
}, },
"shell": { "shell": {
"overview": "Vue d'ensemble", "overview": "Vue d'ensemble",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events." "subtitle": "Audit trail of authentication and admin events."
}, },
"auditLog": { "auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)", "filterActor": "Actor (user id or username)",
"filterAction": "Action", "filterAction": "Action",
"filterActionAll": "All actions", "filterActionAll": "All actions",
"filterTarget": "Target (id or path)", "filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range", "filterDate": "Date range",
"range24h": "Last 24 hours", "range24h": "Last 24 hours",
"range7d": "7 derniers jours", "range7d": "7 derniers jours",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup", "runFailed": "Failed to enqueue backup",
"loading": "Loading backups...", "loading": "Loading backups...",
"loadError": "Failed to load backups.", "loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet", "emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.", "emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User", "colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal", "nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!", "allCompleted": "All achievements unlocked!",
"completed": "Completed", "completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached", "goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable", "remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.", "noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points", "pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement" "ariaLabel": "Hidden locked achievement"
}, },
"hiddenUnlockToast": { "hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!", "title": "You unlocked a hidden achievement!"
"description": "Tap to see the surprise."
}, },
"dashboardCard": { "dashboardCard": {
"title": "Recent unlocks", "title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.", "loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title", "bugTitle": "Title",
"description": "Description", "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", "submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.", "success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report", "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", "category": "Type",
"categoryBug": "Bug report", "categoryBug": "Bug report",
"categoryFeature": "Feature request", "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.", "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.", "internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off", "disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.", "disabledBody": "The administrator has disabled bug reports on this server."
"disabledError": "Bug reports are disabled by the administrator."
}, },
"notifications": { "notifications": {
"title": "Notifications", "title": "Notifications",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.", "noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings", "goToSettings": "Go to Settings",
"channelDisabled": "Désactivé", "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", "eventPersonalRecord": "Record personnel",
"eventPersonalRecordDesc": "Notification lorsqu'un nouveau record est atteint pour une mesure ou un entraînement. Désactivé par défaut." "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": { "i18n": {
"maintainershipBanner": { "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.", "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" "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": { "targets": {
"title": "Targets", "title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.", "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", "bmi": "IMC",
"bodyFat": "Masse grasse",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Pas",
"average30d": "30-day average:", "average30d": "30-day average:",
"consistency": { "consistency": {
"ariaLabel": "Last 7 days, in-range status per day", "ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Chiudi", "close": "Chiudi",
"loading": "Caricamento…...", "loading": "Caricamento…...",
"error": "Errore", "error": "Errore",
"success": "Successo",
"saved": "Salvato", "saved": "Salvato",
"confirm": "Conferma",
"back": "Indietro",
"next": "Avanti",
"yes": "Sì",
"no": "No", "no": "No",
"search": "Cerca",
"filter": "Filtra",
"noData": "Nessun dato disponibile", "noData": "Nessun dato disponibile",
"optional": "Opzionale", "optional": "Opzionale",
"required": "Obbligatorio",
"all": "Tutto",
"active": "Attivo", "active": "Attivo",
"inactive": "Inattivo", "inactive": "Inattivo",
"enabled": "Abilitato", "enabled": "Abilitato",
"disabled": "Disabilitato", "disabled": "Disabilitato",
"networkError": "Errore di rete", "networkError": "Errore di rete",
"unknownError": "Errore sconosciuto", "unknownError": "Errore sconosciuto",
"notLoggedIn": "Non connesso",
"noAccess": "Accesso negato",
"copied": "Copied!", "copied": "Copied!",
"or": "o", "or": "o",
"unknown": "Sconosciuto", "unknown": "Sconosciuto",
"replace": "Sostituisci",
"add": "Aggiungi", "add": "Aggiungi",
"import": "Importa", "import": "Importa",
"test": "Verifica", "test": "Verifica",
@@ -169,7 +157,6 @@
"dashboard": "Cruscotto", "dashboard": "Cruscotto",
"measurements": "Measurements", "measurements": "Measurements",
"medications": "Farmaci", "medications": "Farmaci",
"charts": "Cronologia",
"insights": "Analisi", "insights": "Analisi",
"targets": "Targets", "targets": "Targets",
"achievements": "Achievements", "achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": { "auth": {
"login": "Accedi", "login": "Accedi",
"register": "Registrati", "register": "Registrati",
"loginTitle": "Accedi",
"registerTitle": "Registrati",
"username": "Nome utente", "username": "Nome utente",
"password": "Password", "password": "Password",
"email": "Email address", "email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password", "loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?", "noAccount": "Don't have an account?",
"hasAccount": "Already have an account?", "hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed", "loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed", "registerFailed": "Registration failed",
"createAccount": "Create account", "createAccount": "Create account",
"newAccount": "Create new account", "newAccount": "Create new account",
"backToPasskey": "Back to Passkey", "backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.", "passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters", "passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.", "passwordTooShort": "Password must be at least {minLength} characters long."
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
}, },
"dashboard": { "dashboard": {
"title": "Cruscotto", "title": "Cruscotto",
"subtitle": "Your health overview",
"greeting": { "greeting": {
"morning": "Good morning", "morning": "Good morning",
"day": "Hello", "day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Passi", "stepsShort": "Passi",
"vo2MaxShort": "VO₂ max", "vo2MaxShort": "VO₂ max",
"bpInTargetShort": "PA-target", "bpInTargetShort": "PA-target",
"days30Short": "30d",
"medications": "Farmaci", "medications": "Farmaci",
"insightsPreview": "AI Insights preview", "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", "quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood", "quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)", "compliance7d": "Compliance (7 days)",
"complianceGood": "Bene",
"complianceLow": "Low",
"mood": "Umore", "mood": "Umore",
"customizeTitle": "Dashboard layout", "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", "layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved", "layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout", "layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection", "lastInjection": "Last injection",
"nextInjection": "Next injection", "nextInjection": "Next injection",
"weightDelta": "since start", "weightDelta": "since start",
"inDays": "in {count} days", "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."
}
} }
}, },
"measurements": { "measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement", "editMeasurement": "Edit measurement",
"type": "Tipo", "type": "Tipo",
"value": "Valore", "value": "Valore",
"unit": "Unit",
"date": "Data", "date": "Data",
"source": "Source", "source": "Source",
"notes": "Note", "notes": "Note",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)", "glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual", "glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed", "glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours", "unitHours": "hours",
"unitSteps": "Passi", "unitSteps": "Passi",
"sourceManual": "Manual", "sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.", "loginRequired": "Please sign in to view measurements.",
"allTypes": "All types", "allTypes": "All types",
"measurementCount": "{count} measurements", "measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet", "emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.", "emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter", "emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Azioni", "actions": "Azioni",
"deleteConfirmTitle": "Delete measurement?", "deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.", "deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} di{total}", "pageInfo": "Page {page} di{total}"
"showing": "Showing",
"of": "di",
"entries": "entries"
}, },
"mood": { "mood": {
"title": "Umore", "title": "Umore",
@@ -404,14 +357,9 @@
"levelOkay": "Okay", "levelOkay": "Okay",
"levelSchlecht": "Male", "levelSchlecht": "Male",
"levelLausig": "Terrible", "levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog", "sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods", "allMoods": "All moods",
"entryCount": "{count} entries", "entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet", "emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.", "emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter", "emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication", "editMedication": "Edit medication",
"newMedication": "New medication", "newMedication": "New medication",
"firstMedication": "Add first medication", "firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet", "emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.", "emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications", "loadFailed": "Could not load medications",
"retryLoad": "Riprova", "retryLoad": "Riprova",
"name": "Nome", "name": "Nome",
"dose": "Dose", "dose": "Dose",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "Da", "scheduleFrom": "Da",
"scheduleTo": "A", "scheduleTo": "A",
"scheduleLabel": "Label", "scheduleLabel": "Label",
"scheduleDays": "Days", "scheduleDays": "Days",
"scheduleDaily": "Daily", "scheduleDaily": "Daily",
"active": "Attivo",
"inactive": "Paused", "inactive": "Paused",
"intakeHistory": "Intake history", "intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Assunta",
"markSkipped": "Saltata",
"deleteConfirm": "Delete medication?", "deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Aderenza", "compliance": "Aderenza",
"import": "Importa",
"importIntakes": "Import intakes", "importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:", "importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file", "importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped", "importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed", "importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format", "importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}", "apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).", "apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active", "apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status", "statusLoadFailed": "Could not load status",
"changeFailed": "Change failed", "changeFailed": "Change failed",
"categoryBloodPressure": "Pressione arteriosa", "categoryBloodPressure": "Pressione arteriosa",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins", "categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid", "categoryThyroid": "Thyroid",
"categoryHormone": "Hormones", "categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?", "intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.", "intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes", "intakeCount": "{count} intakes",
"viewHistory": "Cronologia",
"today": "Oggi", "today": "Oggi",
"yesterday": "Ieri", "yesterday": "Ieri",
"tomorrow": "Domani", "tomorrow": "Domani",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial", "glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen", "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.", "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}", "glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}", "glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Avanti:{label}",
"glp1NextInjectionDays": "Avanti:{label} (in {days} days)", "glp1NextInjectionDays": "Avanti:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today", "glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow", "glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh", "siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm", "siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm", "siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.", "sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea", "sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation", "sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records", "purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.", "invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet", "noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake", "deleteIntakeAriaLabel": "Delete intake",
"actions": "Azioni", "actions": "Azioni",
"pageInfo": "Page {page} di{total}", "pageInfo": "Page {page} di{total}",
"loginRequiredIntakes": "Please sign in to view intakes.", "loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases", "phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.", "phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green", "phaseGreen": "Green",
@@ -872,24 +798,13 @@
} }
}, },
"charts": { "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", "weight": "Peso",
"bloodPressure": "Pressione arteriosa", "bloodPressure": "Pressione arteriosa",
"pulse": "Polso", "pulse": "Polso",
"bodyFat": "Massa grassa", "bodyFat": "Massa grassa",
"sleep": "Sonno", "sleep": "Sonno",
"steps": "Passi", "steps": "Passi",
"compliance": "Aderenza",
"noData": "No data in selected time range", "noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg", "bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg", "bucketMonthly": "Monthly avg",
"points7Label": "7 pts", "points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time", "avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend", "trend7dShort": "7-day trend",
"trend": "Tendenza", "trend": "Tendenza",
"targetRanges": "Target ranges",
"perWeek": "/week", "perWeek": "/week",
"totalDelta": "Totale", "totalDelta": "Totale",
"selectMedication": "Select medication", "selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:", "colorRed": "Red:",
"mood": "Umore", "mood": "Umore",
"moodScore": "Mood Score", "moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Pessimo", "moodLabel1": "Pessimo",
"moodLabel2": "Male", "moodLabel2": "Male",
"moodLabel3": "Okay", "moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal", "personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal", "deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal", "deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target" "deltaVsTarget": "{delta} vs. target"
}, },
"chart": { "chart": {
@@ -989,25 +901,15 @@
}, },
"captionLastMonth": "vs. last month", "captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year", "captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": { "deltaVs": {
"lastMonth": "{delta} vs. last month", "lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year" "lastYear": "{delta} vs. last year"
}, },
"tooltipPrior": "Prior period", "tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": { "unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet", "lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year 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" "notAvailableForCompliance": "Comparison N/A for compliance"
}, },
"insights": { "insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data." "generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
}, },
"thresholds": { "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", "defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto", "autoModeLabel": "Auto",
"overrideModeLabel": "Override", "overrideModeLabel": "Override",
"resetAction": "Reset to default", "resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water", "metricBodyWater": "Body water",
"metricBoneMass": "Bone mass", "metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)", "metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.", "unsetExplanation": "No override — using computed default."
"loadError": "Could not load thresholds"
}, },
"onboarding": { "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.", "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.", "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": { "v2": {
"title": "Welcome to HealthLog", "title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.", "subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Passo 3 di 4", "step3of4": "Passo 3 di 4",
"step4of4": "Passo 4 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": { "goals": {
"title": "Cosa vuoi monitorare?", "title": "Cosa vuoi monitorare?",
"body": "Scegli gli ambiti che ti interessano. Dashboard e promemoria si adatteranno alle tue scelte.", "body": "Scegli gli ambiti che ti interessano. Dashboard e promemoria si adatteranno alle tue scelte.",
@@ -1669,10 +1526,8 @@
"title": "Getting started", "title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.", "subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} di{total} Fatto", "progress": "{done} di{total} Fatto",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist", "dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item", "dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": { "items": {
"profileTitle": "Set your profile", "profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.", "profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go." "remainingMany": "{count} more readings to go."
}, },
"settings": { "settings": {
"title": "Impostazioni",
"subtitle": "Profile, Security & Connections",
"researchMode": { "researchMode": {
"sectionTitle": "Modalità Ricerca", "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.", "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." "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", "profile": "Profilo",
"security": "Sicurezza",
"language": "Lingua", "language": "Lingua",
"languageDescription": "Choose the display language of the application.", "languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nome utente", "username": "Nome utente",
"height": "Height (cm)", "height": "Height (cm)",
"dateOfBirth": "Data di nascita", "dateOfBirth": "Data di nascita",
@@ -1930,16 +1774,6 @@
"webPushActive": "Attivo", "webPushActive": "Attivo",
"kiInsights": "AI Insights (OpenAI)", "kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.", "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.", "codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.", "codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.", "codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.", "regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated", "lastGeneratedAt": "Last generated",
"ai": { "ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected", "chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active", "adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired", "connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.", "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", "deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:", "deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:", "deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…", "deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Annulla", "deviceCodeCancel": "Annulla",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.", "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", "modelLabel": "Model",
"modelOptionDefault": "— Default —", "modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…", "modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name", "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", "anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL", "baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)", "localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})", "savedPreview": "(saved {preview})",
"savedShort": "(saved)", "savedShort": "(saved)",
"saveCta": "Salva", "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", "saved": "Salvato",
"saveFailed": "Save failed", "saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Errore", "errorGeneric": "Errore",
"providerChain": { "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": { "types": {
"codex": "ChatGPT (Codex)", "codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)", "openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials", "withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured", "configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now", "withingsSync": "Sync now",
"withingsFullSync": "Sync all data", "withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?", "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": { "integrationPill": {
"connected": "Connected", "connected": "Connected",
"errorReconnect": "Error — reconnect", "errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
}, },
"apiTokens": "API Tokens", "apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).", "apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)", "tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.", "tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?", "tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Azioni", "tokenTableActions": "Azioni",
"noActiveTokens": "No active tokens available.", "noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints", "apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.", "apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method", "apiEndpointMethod": "Method",
"apiEndpointPath": "Path", "apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication", "apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example", "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", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data", "dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.", "dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?", "dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently", "finalDelete": "Delete permanently",
"saved": "Salvato", "saved": "Salvato",
"savingError": "Error saving", "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", "moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog", "moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL", "moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect", "moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?", "moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.", "moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries", "moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized", "moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed", "moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration", "title": "Administration",
"subtitle": "System status, users, and settings", "subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings", "settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status", "systemStatus": "System Status",
"version": "Version",
"database": "Database", "database": "Database",
"databaseConnected": "Connected", "databaseConnected": "Connected",
"databaseError": "Errore", "databaseError": "Errore",
"gitCommit": "Git Commit",
"startedAt": "Started", "startedAt": "Started",
"users": "Users", "users": "Users",
"measurementsCount": "Measurements", "measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)", "load1": "Load (1m)",
"memUsedPercent": "Memory", "memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O", "diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours", "last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.", "empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page." "loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push", "integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report", "integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.", "apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integrazioni",
"sectionMedication": "Farmaci",
"sectionManagement": "Management",
"umamiTitle": "Umami", "umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami", "umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip", "glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip", "glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID", "webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.", "umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL", "umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>", "glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment", "glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production", "glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.", "webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key", "webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject", "webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com", "webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured", "configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent", "monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed", "monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)", "bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.", "bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled", "bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo", "bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token", "bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...", "bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management", "userManagement": "User Management",
"userName": "Nome", "userName": "Nome",
"userEmail": "E-mail", "userEmail": "E-mail",
@@ -2438,7 +2156,6 @@
"toUser": "Make user", "toUser": "Make user",
"toAdmin": "Make admin", "toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role", "ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password", "resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}", "resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password", "newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used", "tokenLastUsed": "Last used",
"tokenCreated": "Created", "tokenCreated": "Created",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet", "tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.", "tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview", "loginOverview": "Login Overview",
"allAuthEvents": "All auth events", "allAuthEvents": "All auth events",
"failedOnly": "Failed only", "failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.", "loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
"loginEmptyFailedTitle": "No failed sign-in attempts", "loginEmptyFailedTitle": "No failed sign-in attempts",
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.", "loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Successo", "outcomeSuccess": "Successo",
"outcomeFailed": "Failed", "outcomeFailed": "Failed",
"auditDetails": "Details", "auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally", "deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.", "deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?", "deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.", "reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
"reminderMissedMinutes": "Missed threshold (minutes)", "reminderMissedMinutes": "Missed threshold (minutes)",
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.", "reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test", "notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent", "notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification", "notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today", "reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent", "reminderCheckNotifSent": "Sent",
"feedback": { "feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open", "tabOpen": "Open",
"tabAcknowledged": "Acknowledged", "tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved", "tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted", "createdAt": "Submitted",
"actions": "Azioni", "actions": "Azioni",
"details": "Details", "details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up", "emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.", "emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...", "loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature", "categoryFeature": "Feature",
"categoryQuestion": "Question", "categoryQuestion": "Question",
"categoryOther": "Other", "categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata", "metadataHeading": "Metadata",
"metaUrl": "URL", "metaUrl": "URL",
"metaLocale": "Locale", "metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed", "publishFailed": "GitHub publish failed",
"updateFailed": "Update failed", "updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?", "archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by", "submittedBy": "Submitted by"
"sectionTitle": "Feedback"
}, },
"shell": { "shell": {
"overview": "Panoramica", "overview": "Panoramica",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events." "subtitle": "Audit trail of authentication and admin events."
}, },
"auditLog": { "auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)", "filterActor": "Actor (user id or username)",
"filterAction": "Action", "filterAction": "Action",
"filterActionAll": "All actions", "filterActionAll": "All actions",
"filterTarget": "Target (id or path)", "filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range", "filterDate": "Date range",
"range24h": "Last 24 hours", "range24h": "Last 24 hours",
"range7d": "Ultimi 7 giorni", "range7d": "Ultimi 7 giorni",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup", "runFailed": "Failed to enqueue backup",
"loading": "Loading backups...", "loading": "Loading backups...",
"loadError": "Failed to load backups.", "loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet", "emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.", "emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User", "colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal", "nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!", "allCompleted": "All achievements unlocked!",
"completed": "Completed", "completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached", "goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable", "remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.", "noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points", "pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement" "ariaLabel": "Hidden locked achievement"
}, },
"hiddenUnlockToast": { "hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!", "title": "You unlocked a hidden achievement!"
"description": "Tap to see the surprise."
}, },
"dashboardCard": { "dashboardCard": {
"title": "Recent unlocks", "title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.", "loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title", "bugTitle": "Title",
"description": "Descrizione", "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", "submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.", "success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report", "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", "category": "Tipo",
"categoryBug": "Bug report", "categoryBug": "Bug report",
"categoryFeature": "Feature request", "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.", "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.", "internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off", "disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.", "disabledBody": "The administrator has disabled bug reports on this server."
"disabledError": "Bug reports are disabled by the administrator."
}, },
"notifications": { "notifications": {
"title": "Notifiche", "title": "Notifiche",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.", "noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings", "goToSettings": "Go to Settings",
"channelDisabled": "Disabilitato", "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", "eventPersonalRecord": "Record personale",
"eventPersonalRecordDesc": "Notifica quando viene raggiunto un nuovo record per una metrica o un allenamento. Disattivato per impostazione predefinita." "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": { "i18n": {
"maintainershipBanner": { "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.", "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" "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": { "targets": {
"title": "Targets", "title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.", "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", "bmi": "IMC",
"bodyFat": "Massa grassa",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Passi",
"average30d": "30-day average:", "average30d": "30-day average:",
"consistency": { "consistency": {
"ariaLabel": "Last 7 days, in-range status per day", "ariaLabel": "Last 7 days, in-range status per day",
+7 -437
View File
@@ -9,31 +9,19 @@
"close": "Zamknij", "close": "Zamknij",
"loading": "Ładowanie…...", "loading": "Ładowanie…...",
"error": "Błąd", "error": "Błąd",
"success": "Sukces",
"saved": "Zapisano", "saved": "Zapisano",
"confirm": "Potwierdź",
"back": "Wstecz",
"next": "Dalej",
"yes": "Tak",
"no": "Nie", "no": "Nie",
"search": "Szukaj",
"filter": "Filtruj",
"noData": "Brak danych", "noData": "Brak danych",
"optional": "Opcjonalne", "optional": "Opcjonalne",
"required": "Wymagane",
"all": "Wszystko",
"active": "Aktywne", "active": "Aktywne",
"inactive": "Nieaktywne", "inactive": "Nieaktywne",
"enabled": "Włączone", "enabled": "Włączone",
"disabled": "Wyłączone", "disabled": "Wyłączone",
"networkError": "Błąd sieci", "networkError": "Błąd sieci",
"unknownError": "Nieznany błąd", "unknownError": "Nieznany błąd",
"notLoggedIn": "Niezalogowany",
"noAccess": "Brak dostępu",
"copied": "Copied!", "copied": "Copied!",
"or": "lub", "or": "lub",
"unknown": "Nieznane", "unknown": "Nieznane",
"replace": "Zastąp",
"add": "Dodaj", "add": "Dodaj",
"import": "Importuj", "import": "Importuj",
"test": "Testuj", "test": "Testuj",
@@ -169,7 +157,6 @@
"dashboard": "Pulpit", "dashboard": "Pulpit",
"measurements": "Measurements", "measurements": "Measurements",
"medications": "Leki", "medications": "Leki",
"charts": "Historia",
"insights": "Statystyki", "insights": "Statystyki",
"targets": "Targets", "targets": "Targets",
"achievements": "Achievements", "achievements": "Achievements",
@@ -198,8 +185,6 @@
"auth": { "auth": {
"login": "Zaloguj się", "login": "Zaloguj się",
"register": "Zarejestruj się", "register": "Zarejestruj się",
"loginTitle": "Zaloguj się",
"registerTitle": "Zarejestruj się",
"username": "Nazwa użytkownika", "username": "Nazwa użytkownika",
"password": "Hasło", "password": "Hasło",
"email": "Email address", "email": "Email address",
@@ -210,26 +195,17 @@
"loginWithPassword": "Sign in with password", "loginWithPassword": "Sign in with password",
"noAccount": "Don't have an account?", "noAccount": "Don't have an account?",
"hasAccount": "Already have an account?", "hasAccount": "Already have an account?",
"registerDisabled": "Registration is disabled.",
"loginFailed": "Login failed", "loginFailed": "Login failed",
"passkeyFailed": "Passkey authentication cancelled or failed",
"registerFailed": "Registration failed", "registerFailed": "Registration failed",
"createAccount": "Create account", "createAccount": "Create account",
"newAccount": "Create new account", "newAccount": "Create new account",
"backToPasskey": "Back to Passkey", "backToPasskey": "Back to Passkey",
"passkeySetupLater": "You can set up passkeys at any time in Settings.", "passkeySetupLater": "You can set up passkeys at any time in Settings.",
"passwordMinLength": "Min. 12 characters", "passwordMinLength": "Min. 12 characters",
"passwordTooShort": "Password must be at least {minLength} characters long.", "passwordTooShort": "Password must be at least {minLength} characters long."
"passwordStrength": "Password strength",
"strengthWeak": "Very weak",
"strengthFair": "Weak",
"strengthGood": "Fair",
"strengthStrong": "Strong",
"strengthVeryStrong": "Very strong"
}, },
"dashboard": { "dashboard": {
"title": "Pulpit", "title": "Pulpit",
"subtitle": "Your health overview",
"greeting": { "greeting": {
"morning": "Good morning", "morning": "Good morning",
"day": "Hello", "day": "Hello",
@@ -260,25 +236,13 @@
"stepsShort": "Kroki", "stepsShort": "Kroki",
"vo2MaxShort": "VO₂ max", "vo2MaxShort": "VO₂ max",
"bpInTargetShort": "RR-cel", "bpInTargetShort": "RR-cel",
"days30Short": "30d",
"medications": "Leki", "medications": "Leki",
"insightsPreview": "AI Insights preview", "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", "quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood", "quickAddMood": "Log mood",
"addMeasurement": "Add measurement",
"compliance7d": "Compliance (7 days)", "compliance7d": "Compliance (7 days)",
"complianceGood": "Dobrze",
"complianceLow": "Low",
"mood": "Nastrój", "mood": "Nastrój",
"customizeTitle": "Dashboard layout", "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", "layoutReset": "Reset to defaults",
"layoutSaveSuccess": "Dashboard layout saved", "layoutSaveSuccess": "Dashboard layout saved",
"layoutSaveError": "Could not save dashboard layout", "layoutSaveError": "Could not save dashboard layout",
@@ -297,11 +261,7 @@
"lastInjection": "Last injection", "lastInjection": "Last injection",
"nextInjection": "Next injection", "nextInjection": "Next injection",
"weightDelta": "since start", "weightDelta": "since start",
"inDays": "in {count} days", "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."
}
} }
}, },
"measurements": { "measurements": {
@@ -311,7 +271,6 @@
"editMeasurement": "Edit measurement", "editMeasurement": "Edit measurement",
"type": "Typ", "type": "Typ",
"value": "Wartość", "value": "Wartość",
"unit": "Unit",
"date": "Data", "date": "Data",
"source": "Source", "source": "Source",
"notes": "Notatki", "notes": "Notatki",
@@ -349,8 +308,6 @@
"glucoseContextPostprandial": "Post-meal (2h after eating)", "glucoseContextPostprandial": "Post-meal (2h after eating)",
"glucoseContextRandom": "Random / casual", "glucoseContextRandom": "Random / casual",
"glucoseContextBedtime": "Before bed", "glucoseContextBedtime": "Before bed",
"glucoseUnit": "Glucose display unit",
"glucoseUnitHint": "Stored canonically in mg/dL; display unit is your preference.",
"unitHours": "hours", "unitHours": "hours",
"unitSteps": "Kroki", "unitSteps": "Kroki",
"sourceManual": "Manual", "sourceManual": "Manual",
@@ -371,7 +328,6 @@
"loginRequired": "Please sign in to view measurements.", "loginRequired": "Please sign in to view measurements.",
"allTypes": "All types", "allTypes": "All types",
"measurementCount": "{count} measurements", "measurementCount": "{count} measurements",
"noMeasurements": "No measurements found",
"emptyTitle": "No measurements yet", "emptyTitle": "No measurements yet",
"emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.", "emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.",
"emptyFilteredTitle": "No measurements match this filter", "emptyFilteredTitle": "No measurements match this filter",
@@ -382,10 +338,7 @@
"actions": "Akcje", "actions": "Akcje",
"deleteConfirmTitle": "Delete measurement?", "deleteConfirmTitle": "Delete measurement?",
"deleteConfirmDescription": "This measurement will be permanently deleted.", "deleteConfirmDescription": "This measurement will be permanently deleted.",
"pageInfo": "Page {page} z{total}", "pageInfo": "Page {page} z{total}"
"showing": "Showing",
"of": "z",
"entries": "entries"
}, },
"mood": { "mood": {
"title": "Nastrój", "title": "Nastrój",
@@ -404,14 +357,9 @@
"levelOkay": "Okay", "levelOkay": "Okay",
"levelSchlecht": "Źle", "levelSchlecht": "Źle",
"levelLausig": "Terrible", "levelLausig": "Terrible",
"sourceManual": "Manual",
"sourceMoodlog": "moodLog", "sourceMoodlog": "moodLog",
"sourceWeb": "Web",
"sourceTelegram": "Telegram",
"sourceDaylio": "Daylio",
"allMoods": "All moods", "allMoods": "All moods",
"entryCount": "{count} entries", "entryCount": "{count} entries",
"noEntries": "No mood entries found",
"emptyTitle": "No mood entries yet", "emptyTitle": "No mood entries yet",
"emptyDescription": "Log how you feel today to spot patterns over time.", "emptyDescription": "Log how you feel today to spot patterns over time.",
"emptyFilteredTitle": "No mood entries match this filter", "emptyFilteredTitle": "No mood entries match this filter",
@@ -436,34 +384,21 @@
"editMedication": "Edit medication", "editMedication": "Edit medication",
"newMedication": "New medication", "newMedication": "New medication",
"firstMedication": "Add first medication", "firstMedication": "Add first medication",
"noMedicationsYet": "No medications added yet",
"emptyTitle": "No medications yet", "emptyTitle": "No medications yet",
"emptyDescription": "Add medications, dosages, and reminder windows to track compliance.", "emptyDescription": "Add medications, dosages, and reminder windows to track compliance.",
"loadFailed": "Could not load medications", "loadFailed": "Could not load medications",
"retryLoad": "Spróbuj ponownie", "retryLoad": "Spróbuj ponownie",
"name": "Nazwa", "name": "Nazwa",
"dose": "Dawka", "dose": "Dawka",
"doseAmount": "Amount",
"doseUnit": "Unit",
"category": "Category",
"schedule": "Schedule",
"scheduleFrom": "Od", "scheduleFrom": "Od",
"scheduleTo": "Do", "scheduleTo": "Do",
"scheduleLabel": "Label", "scheduleLabel": "Label",
"scheduleDays": "Days", "scheduleDays": "Days",
"scheduleDaily": "Daily", "scheduleDaily": "Daily",
"active": "Aktywne",
"inactive": "Paused", "inactive": "Paused",
"intakeHistory": "Intake history", "intakeHistory": "Intake history",
"showIntakeHistory": "Show intake history",
"hideIntakeHistory": "Hide intake history",
"markTaken": "Przyjęte",
"markSkipped": "Pominięte",
"deleteConfirm": "Delete medication?", "deleteConfirm": "Delete medication?",
"deleteDescription": "The medication and all intake records will be permanently deleted.",
"noMedications": "No medications found.",
"compliance": "Przestrzeganie zaleceń", "compliance": "Przestrzeganie zaleceń",
"import": "Importuj",
"importIntakes": "Import intakes", "importIntakes": "Import intakes",
"importDescription": "Paste a JSON array with intake data. Expected format:", "importDescription": "Paste a JSON array with intake data. Expected format:",
"importUploadFile": "Upload JSON file", "importUploadFile": "Upload JSON file",
@@ -477,7 +412,6 @@
"importInvalidSkipped": "{count} invalid entries skipped", "importInvalidSkipped": "{count} invalid entries skipped",
"importFailed": "Import failed", "importFailed": "Import failed",
"importInvalidFormat": "Invalid JSON format", "importInvalidFormat": "Invalid JSON format",
"apiAccess": "API access",
"apiEndpointTitle": "API Endpoint: {name}", "apiEndpointTitle": "API Endpoint: {name}",
"apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).", "apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).",
"apiEndpointActive": "API endpoint active", "apiEndpointActive": "API endpoint active",
@@ -492,8 +426,6 @@
"statusLoadFailed": "Could not load status", "statusLoadFailed": "Could not load status",
"changeFailed": "Change failed", "changeFailed": "Change failed",
"categoryBloodPressure": "Ciśnienie krwi", "categoryBloodPressure": "Ciśnienie krwi",
"categoryCholesterol": "Cholesterol",
"categoryDiabetes": "Diabetes",
"categoryVitamin": "Vitamins", "categoryVitamin": "Vitamins",
"categoryThyroid": "Thyroid", "categoryThyroid": "Thyroid",
"categoryHormone": "Hormones", "categoryHormone": "Hormones",
@@ -524,7 +456,6 @@
"intakeDeleteConfirm": "Delete intake record?", "intakeDeleteConfirm": "Delete intake record?",
"intakeDeleteDescription": "This intake record will be permanently deleted.", "intakeDeleteDescription": "This intake record will be permanently deleted.",
"intakeCount": "{count} intakes", "intakeCount": "{count} intakes",
"viewHistory": "Historia",
"today": "Dzisiaj", "today": "Dzisiaj",
"yesterday": "Wczoraj", "yesterday": "Wczoraj",
"tomorrow": "Jutro", "tomorrow": "Jutro",
@@ -568,10 +499,8 @@
"glp1DosesPerUnit": "Doses per pen / vial", "glp1DosesPerUnit": "Doses per pen / vial",
"glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen", "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.", "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}", "glp1LastInjection": "Last: {label}",
"glp1LastInjectionWithSite": "Last: {label} · {site}", "glp1LastInjectionWithSite": "Last: {label} · {site}",
"glp1NextInjection": "Dalej:{label}",
"glp1NextInjectionDays": "Dalej:{label} (in {days} days)", "glp1NextInjectionDays": "Dalej:{label} (in {days} days)",
"glp1NextInjectionToday": "Next: today", "glp1NextInjectionToday": "Next: today",
"glp1NextInjectionTomorrow": "Next: tomorrow", "glp1NextInjectionTomorrow": "Next: tomorrow",
@@ -738,7 +667,6 @@
"siteThighRight": "Right thigh", "siteThighRight": "Right thigh",
"siteUpperArmLeft": "Left upper arm", "siteUpperArmLeft": "Left upper arm",
"siteUpperArmRight": "Right upper arm", "siteUpperArmRight": "Right upper arm",
"sideEffectTagsLabel": "Common GLP-1 side effects",
"sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.", "sideEffectTagsHelp": "Tap a chip to add it to your mood-entry tags.",
"sideEffectTagNausea": "nausea", "sideEffectTagNausea": "nausea",
"sideEffectTagConstipation": "constipation", "sideEffectTagConstipation": "constipation",
@@ -774,12 +702,10 @@
"purgeError": "Error deleting records", "purgeError": "Error deleting records",
"invalidTimestamp": "Please select a valid time.", "invalidTimestamp": "Please select a valid time.",
"noIntakesYet": "No intakes recorded yet", "noIntakesYet": "No intakes recorded yet",
"noIntakesForMedication": "No intakes yet for",
"deleteIntakeAriaLabel": "Delete intake", "deleteIntakeAriaLabel": "Delete intake",
"actions": "Akcje", "actions": "Akcje",
"pageInfo": "Page {page} z{total}", "pageInfo": "Page {page} z{total}",
"loginRequiredIntakes": "Please sign in to view intakes.", "loginRequiredIntakes": "Please sign in to view intakes.",
"clear": "Clear",
"phaseConfig": "Reminder phases", "phaseConfig": "Reminder phases",
"phaseConfigDescription": "Configure timing for reminders.", "phaseConfigDescription": "Configure timing for reminders.",
"phaseGreen": "Green", "phaseGreen": "Green",
@@ -872,24 +798,13 @@
} }
}, },
"charts": { "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", "weight": "Waga",
"bloodPressure": "Ciśnienie krwi", "bloodPressure": "Ciśnienie krwi",
"pulse": "Tętno", "pulse": "Tętno",
"bodyFat": "Tkanka tłuszczowa", "bodyFat": "Tkanka tłuszczowa",
"sleep": "Sen", "sleep": "Sen",
"steps": "Kroki", "steps": "Kroki",
"compliance": "Przestrzeganie zaleceń",
"noData": "No data in selected time range", "noData": "No data in selected time range",
"movingAverage": "Moving average",
"target": "Target range",
"bucketWeekly": "Weekly avg", "bucketWeekly": "Weekly avg",
"bucketMonthly": "Monthly avg", "bucketMonthly": "Monthly avg",
"points7Label": "7 pts", "points7Label": "7 pts",
@@ -911,7 +826,6 @@
"avgAllTimeShort": "All-time", "avgAllTimeShort": "All-time",
"trend7dShort": "7-day trend", "trend7dShort": "7-day trend",
"trend": "Trend", "trend": "Trend",
"targetRanges": "Target ranges",
"perWeek": "/week", "perWeek": "/week",
"totalDelta": "Łącznie", "totalDelta": "Łącznie",
"selectMedication": "Select medication", "selectMedication": "Select medication",
@@ -923,7 +837,6 @@
"colorRed": "Red:", "colorRed": "Red:",
"mood": "Nastrój", "mood": "Nastrój",
"moodScore": "Mood Score", "moodScore": "Mood Score",
"moodMA": "7-day trend",
"moodLabel1": "Okropnie", "moodLabel1": "Okropnie",
"moodLabel2": "Źle", "moodLabel2": "Źle",
"moodLabel3": "Okay", "moodLabel3": "Okay",
@@ -961,7 +874,6 @@
"personalBaseline": "Your normal", "personalBaseline": "Your normal",
"deltaVsBaseline": "{delta} vs. your normal", "deltaVsBaseline": "{delta} vs. your normal",
"deltaUnchanged": "matches your normal", "deltaUnchanged": "matches your normal",
"targetWeight": "Target",
"deltaVsTarget": "{delta} vs. target" "deltaVsTarget": "{delta} vs. target"
}, },
"chart": { "chart": {
@@ -989,25 +901,15 @@
}, },
"captionLastMonth": "vs. last month", "captionLastMonth": "vs. last month",
"captionLastYear": "vs. last year", "captionLastYear": "vs. last year",
"delta": {
"improved": "{delta} improved",
"worsened": "{delta} worsened",
"stable": "unchanged"
},
"deltaVs": { "deltaVs": {
"lastMonth": "{delta} vs. last month", "lastMonth": "{delta} vs. last month",
"lastYear": "{delta} vs. last year" "lastYear": "{delta} vs. last year"
}, },
"tooltipPrior": "Prior period", "tooltipPrior": "Prior period",
"tooltipDelta": "Δ {delta}",
"unavailable": { "unavailable": {
"lastMonth": "Comparison unavailable — no data from last month yet", "lastMonth": "Comparison unavailable — no data from last month yet",
"lastYear": "Comparison unavailable — no data from last year 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" "notAvailableForCompliance": "Comparison N/A for compliance"
}, },
"insights": { "insights": {
@@ -1447,10 +1349,7 @@
"generatePrompt": "Click \"Generate\" for AI-powered insights about your health data." "generatePrompt": "Click \"Generate\" for AI-powered insights about your health data."
}, },
"thresholds": { "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", "defaultLabel": "Default",
"overrideLabel": "Your override",
"autoModeLabel": "Auto", "autoModeLabel": "Auto",
"overrideModeLabel": "Override", "overrideModeLabel": "Override",
"resetAction": "Reset to default", "resetAction": "Reset to default",
@@ -1478,32 +1377,11 @@
"metricBodyWater": "Body water", "metricBodyWater": "Body water",
"metricBoneMass": "Bone mass", "metricBoneMass": "Bone mass",
"metricOxygenSaturation": "Oxygen saturation (SpO₂)", "metricOxygenSaturation": "Oxygen saturation (SpO₂)",
"unsetExplanation": "No override — using computed default.", "unsetExplanation": "No override — using computed default."
"loadError": "Could not load thresholds"
}, },
"onboarding": { "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.", "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.", "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": { "v2": {
"title": "Welcome to HealthLog", "title": "Welcome to HealthLog",
"subtitle": "Three quick steps. You can finish anything later from Settings.", "subtitle": "Three quick steps. You can finish anything later from Settings.",
@@ -1582,27 +1460,6 @@
"step3of4": "Krok 3 z 4", "step3of4": "Krok 3 z 4",
"step4of4": "Krok 4 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": { "goals": {
"title": "Co chcesz śledzić?", "title": "Co chcesz śledzić?",
"body": "Wybierz obszary, które są dla Ciebie ważne. Pulpit i przypomnienia dostosują się do Twojego wyboru.", "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", "title": "Getting started",
"subtitle": "Quick wins to get the most out of HealthLog.", "subtitle": "Quick wins to get the most out of HealthLog.",
"progress": "{done} z{total} Gotowe", "progress": "{done} z{total} Gotowe",
"dismiss": "Dismiss",
"dismissAll": "Hide checklist", "dismissAll": "Hide checklist",
"dismissTooltip": "Hide this item", "dismissTooltip": "Hide this item",
"restoreHint": "You can restore the checklist from Settings.",
"items": { "items": {
"profileTitle": "Set your profile", "profileTitle": "Set your profile",
"profileDescription": "Height, date of birth and gender unlock personalised targets.", "profileDescription": "Height, date of birth and gender unlock personalised targets.",
@@ -1697,8 +1552,6 @@
"remainingMany": "{count} more readings to go." "remainingMany": "{count} more readings to go."
}, },
"settings": { "settings": {
"title": "Ustawienia",
"subtitle": "Profile, Security & Connections",
"researchMode": { "researchMode": {
"sectionTitle": "Tryb Badawczy", "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.", "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." "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", "profile": "Profil",
"security": "Bezpieczeństwo",
"language": "Język", "language": "Język",
"languageDescription": "Choose the display language of the application.", "languageDescription": "Choose the display language of the application.",
"languageSystem": "System (automatic)",
"username": "Nazwa użytkownika", "username": "Nazwa użytkownika",
"height": "Height (cm)", "height": "Height (cm)",
"dateOfBirth": "Data urodzenia", "dateOfBirth": "Data urodzenia",
@@ -1930,16 +1774,6 @@
"webPushActive": "Aktywne", "webPushActive": "Aktywne",
"kiInsights": "AI Insights (OpenAI)", "kiInsights": "AI Insights (OpenAI)",
"kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic AI evaluations in Insights.", "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.", "codexConnected": "ChatGPT connected successfully! AI insights are now active.",
"codexDisconnected": "ChatGPT connection removed.", "codexDisconnected": "ChatGPT connection removed.",
"codexConnectionFailed": "ChatGPT connection failed. Please try again.", "codexConnectionFailed": "ChatGPT connection failed. Please try again.",
@@ -1952,18 +1786,10 @@
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.", "regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
"lastGeneratedAt": "Last generated", "lastGeneratedAt": "Last generated",
"ai": { "ai": {
"title": "AI Insights",
"description": "Provider, model, key.",
"chatgptConnectedBadge": "ChatGPT connected", "chatgptConnectedBadge": "ChatGPT connected",
"adminAiActiveBadge": "Admin AI active", "adminAiActiveBadge": "Admin AI active",
"connectionExpiredBadge": "Connection expired", "connectionExpiredBadge": "Connection expired",
"chatgptConnectedHeading": "ChatGPT connected",
"chatgptConnectedBody": "Insights are generated through your ChatGPT subscription — no extra cost.",
"connectedSince": "Connected since {when}.", "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", "deviceCodeHeading": "Finish connecting on chatgpt.com",
"deviceCodeStep1": "Open this link on any device:", "deviceCodeStep1": "Open this link on any device:",
"deviceCodeStep2": "Enter this one-time code:", "deviceCodeStep2": "Enter this one-time code:",
@@ -1972,42 +1798,20 @@
"deviceCodeWaiting": "Waiting for approval…", "deviceCodeWaiting": "Waiting for approval…",
"deviceCodeCancel": "Anuluj", "deviceCodeCancel": "Anuluj",
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.", "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", "modelLabel": "Model",
"modelOptionDefault": "— Default —", "modelOptionDefault": "— Default —",
"modelOptionCustom": "Custom…", "modelOptionCustom": "Custom…",
"customModelLabel": "Custom model name", "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", "anthropicKeyLabel": "Anthropic API key",
"baseUrlLabel": "Base URL", "baseUrlLabel": "Base URL",
"localKeyLabel": "API key (optional)", "localKeyLabel": "API key (optional)",
"savedPreview": "(saved {preview})", "savedPreview": "(saved {preview})",
"savedShort": "(saved)", "savedShort": "(saved)",
"saveCta": "Zapisz", "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", "saved": "Zapisano",
"saveFailed": "Save failed", "saveFailed": "Save failed",
"testFailed": "Test failed",
"errorGeneric": "Błąd", "errorGeneric": "Błąd",
"providerChain": { "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": { "types": {
"codex": "ChatGPT (Codex)", "codex": "ChatGPT (Codex)",
"openai": "OpenAI (your key)", "openai": "OpenAI (your key)",
@@ -2081,10 +1885,7 @@
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace", "withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
"withingsSaveCredentials": "Save credentials", "withingsSaveCredentials": "Save credentials",
"withingsConnected": "Connected",
"configured": "Configured", "configured": "Configured",
"withingsTokenExpired": "Token expired",
"withingsLastSync": "Last sync",
"withingsSync": "Sync now", "withingsSync": "Sync now",
"withingsFullSync": "Sync all data", "withingsFullSync": "Sync all data",
"withingsFullSyncTitle": "Full synchronization?", "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": { "integrationPill": {
"connected": "Connected", "connected": "Connected",
"errorReconnect": "Error — reconnect", "errorReconnect": "Error — reconnect",
@@ -2130,7 +1922,6 @@
}, },
"apiTokens": "API Tokens", "apiTokens": "API Tokens",
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).", "apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
"tokenName": "Token name",
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)", "tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.", "tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?", "tokenRevoke": "Revoke token?",
@@ -2148,62 +1939,14 @@
"tokenTableActions": "Akcje", "tokenTableActions": "Akcje",
"noActiveTokens": "No active tokens available.", "noActiveTokens": "No active tokens available.",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"tokenLastUsed": "Last used:",
"tokenCreatedAt": "Created:",
"apiEndpoint": "API endpoint for medication intake:",
"apiEndpointsTitle": "API endpoints", "apiEndpointsTitle": "API endpoints",
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.", "apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
"apiEndpointMethod": "Method", "apiEndpointMethod": "Method",
"apiEndpointPath": "Path", "apiEndpointPath": "Path",
"apiEndpointAuth": "Authentication", "apiEndpointAuth": "Authentication",
"apiEndpointExample": "Body example", "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", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
"dangerZoneTitle": "Danger Zone",
"dangerZone": "Delete All Data", "dangerZone": "Delete All Data",
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.", "dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
"dangerZoneConfirm": "Delete all data?", "dangerZoneConfirm": "Delete all data?",
@@ -2213,9 +1956,6 @@
"finalDelete": "Delete permanently", "finalDelete": "Delete permanently",
"saved": "Zapisano", "saved": "Zapisano",
"savingError": "Error saving", "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", "moodLogTitle": "moodLog",
"moodLogDescription": "Import mood data from moodLog", "moodLogDescription": "Import mood data from moodLog",
"moodLogUrl": "moodLog URL", "moodLogUrl": "moodLog URL",
@@ -2231,7 +1971,6 @@
"moodLogDisconnect": "Disconnect", "moodLogDisconnect": "Disconnect",
"moodLogDisconnectTitle": "Disconnect moodLog?", "moodLogDisconnectTitle": "Disconnect moodLog?",
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.", "moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
"moodLogLastSync": "Last sync",
"moodLogEntries": "Entries", "moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized", "moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed", "moodLogSyncFailed": "Sync failed",
@@ -2298,14 +2037,10 @@
"title": "Administration", "title": "Administration",
"subtitle": "System status, users, and settings", "subtitle": "System status, users, and settings",
"settingsSaveError": "Failed to save settings", "settingsSaveError": "Failed to save settings",
"settingsSaveValidationError": "Please check the highlighted fields",
"sectionsTitle": "Admin",
"systemStatus": "System Status", "systemStatus": "System Status",
"version": "Version",
"database": "Database", "database": "Database",
"databaseConnected": "Connected", "databaseConnected": "Connected",
"databaseError": "Błąd", "databaseError": "Błąd",
"gitCommit": "Git Commit",
"startedAt": "Started", "startedAt": "Started",
"users": "Users", "users": "Users",
"measurementsCount": "Measurements", "measurementsCount": "Measurements",
@@ -2320,8 +2055,6 @@
"load1": "Load (1m)", "load1": "Load (1m)",
"memUsedPercent": "Memory", "memUsedPercent": "Memory",
"diskBusyPercent": "Disk I/O", "diskBusyPercent": "Disk I/O",
"diskReadBps": "Disk read",
"diskWriteBps": "Disk write",
"last2hours": "Last 2 hours", "last2hours": "Last 2 hours",
"empty": "Sampling started — data appears in 1–2 minutes.", "empty": "Sampling started — data appears in 1–2 minutes.",
"loadError": "Failed to load host metrics. Try refreshing the page." "loadError": "Failed to load host metrics. Try refreshing the page."
@@ -2376,18 +2109,11 @@
"integrationWebPush": "Web Push", "integrationWebPush": "Web Push",
"integrationBugReport": "Bug Report", "integrationBugReport": "Bug Report",
"apiGlobal": "Allow API endpoints and API tokens.", "apiGlobal": "Allow API endpoints and API tokens.",
"moodLogGlobal": "Allow the moodLog integration.",
"sectionGeneral": "General",
"sectionIntegrations": "Integracje",
"sectionMedication": "Leki",
"sectionManagement": "Management",
"umamiTitle": "Umami", "umamiTitle": "Umami",
"umamiDescription": "Web analytics with Umami", "umamiDescription": "Web analytics with Umami",
"glitchtipTitle": "GlitchTip", "glitchtipTitle": "GlitchTip",
"glitchtipDescription": "Error tracking with GlitchTip", "glitchtipDescription": "Error tracking with GlitchTip",
"webPushVapidTitle": "Web Push VAPID", "webPushVapidTitle": "Web Push VAPID",
"monitoring": "Monitoring (Umami/GlitchTip)",
"monitoringDescription": "Configuration for website analytics and error tracking.",
"umamiEnabled": "Enable Umami tracking.", "umamiEnabled": "Enable Umami tracking.",
"umamiScriptUrl": "Umami script URL", "umamiScriptUrl": "Umami script URL",
"umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js",
@@ -2398,7 +2124,6 @@
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>", "glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
"glitchtipEnvironment": "GlitchTip environment", "glitchtipEnvironment": "GlitchTip environment",
"glitchtipEnvironmentPlaceholder": "production", "glitchtipEnvironmentPlaceholder": "production",
"webPushVapid": "Web Push (VAPID)",
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.", "webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
"webPushVapidPublicKey": "VAPID public key", "webPushVapidPublicKey": "VAPID public key",
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
@@ -2407,12 +2132,8 @@
"webPushVapidSubject": "VAPID subject", "webPushVapidSubject": "VAPID subject",
"webPushVapidSubjectPlaceholder": "mailto:you@example.com", "webPushVapidSubjectPlaceholder": "mailto:you@example.com",
"configured": "Configured", "configured": "Configured",
"notConfigured": "Not configured",
"monitoringTestUmami": "Send Umami test",
"monitoringTestGlitchTip": "Send GlitchTip test",
"monitoringTestSuccess": "Test event sent", "monitoringTestSuccess": "Test event sent",
"monitoringTestFailed": "Monitoring test failed", "monitoringTestFailed": "Monitoring test failed",
"monitoringSave": "Save monitoring",
"bugReportGithub": "Bug report (GitHub Issues)", "bugReportGithub": "Bug report (GitHub Issues)",
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.", "bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
"bugReportEnabledLabel": "Bug reports enabled", "bugReportEnabledLabel": "Bug reports enabled",
@@ -2421,9 +2142,6 @@
"bugReportRepoPlaceholder": "owner/repo", "bugReportRepoPlaceholder": "owner/repo",
"bugReportToken": "Issue token", "bugReportToken": "Issue token",
"bugReportTokenPlaceholder": "ghp_...", "bugReportTokenPlaceholder": "ghp_...",
"bugReportConfigured": "Bug report is configured.",
"bugReportNotConfigured": "Bug report is not fully configured yet.",
"bugReportSave": "Save bug report settings",
"userManagement": "User Management", "userManagement": "User Management",
"userName": "Nazwa", "userName": "Nazwa",
"userEmail": "E-mail", "userEmail": "E-mail",
@@ -2438,7 +2156,6 @@
"toUser": "Make user", "toUser": "Make user",
"toAdmin": "Make admin", "toAdmin": "Make admin",
"ownRoleUnchangeable": "Cannot change own role", "ownRoleUnchangeable": "Cannot change own role",
"lastAdminError": "Cannot demote the last admin",
"resetPassword": "Reset password", "resetPassword": "Reset password",
"resetPasswordTitle": "Reset password: {name}", "resetPasswordTitle": "Reset password: {name}",
"newPassword": "New password", "newPassword": "New password",
@@ -2456,14 +2173,11 @@
"tokenLastUsed": "Last used", "tokenLastUsed": "Last used",
"tokenCreated": "Created", "tokenCreated": "Created",
"tokenNeverUsed": "Never", "tokenNeverUsed": "Never",
"noTokens": "No API tokens found.",
"tokensEmptyTitle": "No API tokens yet", "tokensEmptyTitle": "No API tokens yet",
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.", "tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
"loginOverview": "Login Overview", "loginOverview": "Login Overview",
"allAuthEvents": "All auth events", "allAuthEvents": "All auth events",
"failedOnly": "Failed only", "failedOnly": "Failed only",
"noEntries": "No entries found.",
"loginEmptyTitle": "No authentication events yet",
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.", "loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
"loginEmptyFailedTitle": "No failed sign-in attempts", "loginEmptyFailedTitle": "No failed sign-in attempts",
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.", "loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
@@ -2484,7 +2198,6 @@
"outcomeSuccess": "Sukces", "outcomeSuccess": "Sukces",
"outcomeFailed": "Failed", "outcomeFailed": "Failed",
"auditDetails": "Details", "auditDetails": "Details",
"dangerZone": "Danger Zone",
"deleteAllData": "Delete all data globally", "deleteAllData": "Delete all data globally",
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.", "deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
"deleteAllConfirm": "Really delete all data?", "deleteAllConfirm": "Really delete all data?",
@@ -2509,8 +2222,6 @@
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.", "reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
"reminderMissedMinutes": "Missed threshold (minutes)", "reminderMissedMinutes": "Missed threshold (minutes)",
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.", "reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
"reminderThresholdsSave": "Save thresholds",
"notificationTest": "Test Notifications",
"notificationTestSend": "Send test", "notificationTestSend": "Send test",
"notificationTestSuccess": "Test notification sent", "notificationTestSuccess": "Test notification sent",
"notificationTestFailed": "Failed to send test notification", "notificationTestFailed": "Failed to send test notification",
@@ -2523,8 +2234,6 @@
"reminderCheckEventsToday": "Events today", "reminderCheckEventsToday": "Events today",
"reminderCheckNotifSent": "Sent", "reminderCheckNotifSent": "Sent",
"feedback": { "feedback": {
"title": "Feedback Inbox",
"description": "User-submitted feedback, bug reports, and feature requests.",
"tabOpen": "Open", "tabOpen": "Open",
"tabAcknowledged": "Acknowledged", "tabAcknowledged": "Acknowledged",
"tabResolved": "Resolved", "tabResolved": "Resolved",
@@ -2535,7 +2244,6 @@
"createdAt": "Submitted", "createdAt": "Submitted",
"actions": "Akcje", "actions": "Akcje",
"details": "Details", "details": "Details",
"noEntries": "No feedback in this category.",
"emptyTitle": "All caught up", "emptyTitle": "All caught up",
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.", "emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
"loading": "Loading feedback...", "loading": "Loading feedback...",
@@ -2544,11 +2252,6 @@
"categoryFeature": "Feature", "categoryFeature": "Feature",
"categoryQuestion": "Question", "categoryQuestion": "Question",
"categoryOther": "Other", "categoryOther": "Other",
"statusOpen": "Open",
"statusAcknowledged": "Acknowledged",
"statusResolved": "Resolved",
"statusArchived": "Archived",
"dialogTitle": "Feedback details",
"metadataHeading": "Metadata", "metadataHeading": "Metadata",
"metaUrl": "URL", "metaUrl": "URL",
"metaLocale": "Locale", "metaLocale": "Locale",
@@ -2569,8 +2272,7 @@
"publishFailed": "GitHub publish failed", "publishFailed": "GitHub publish failed",
"updateFailed": "Update failed", "updateFailed": "Update failed",
"archiveConfirm": "Archive this feedback entry?", "archiveConfirm": "Archive this feedback entry?",
"submittedBy": "Submitted by", "submittedBy": "Submitted by"
"sectionTitle": "Feedback"
}, },
"shell": { "shell": {
"overview": "Przegląd", "overview": "Przegląd",
@@ -2654,12 +2356,10 @@
"subtitle": "Audit trail of authentication and admin events." "subtitle": "Audit trail of authentication and admin events."
}, },
"auditLog": { "auditLog": {
"title": "Audit log",
"filterActor": "Actor (user id or username)", "filterActor": "Actor (user id or username)",
"filterAction": "Action", "filterAction": "Action",
"filterActionAll": "All actions", "filterActionAll": "All actions",
"filterTarget": "Target (id or path)", "filterTarget": "Target (id or path)",
"filterSeverity": "Severity",
"filterDate": "Date range", "filterDate": "Date range",
"range24h": "Last 24 hours", "range24h": "Last 24 hours",
"range7d": "Ostatnie 7 dni", "range7d": "Ostatnie 7 dni",
@@ -2706,7 +2406,6 @@
"runFailed": "Failed to enqueue backup", "runFailed": "Failed to enqueue backup",
"loading": "Loading backups...", "loading": "Loading backups...",
"loadError": "Failed to load backups.", "loadError": "Failed to load backups.",
"empty": "No backups recorded yet.",
"emptyTitle": "No backups yet", "emptyTitle": "No backups yet",
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.", "emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
"colUser": "User", "colUser": "User",
@@ -2753,10 +2452,7 @@
"nextGoal": "Next goal", "nextGoal": "Next goal",
"allCompleted": "All achievements unlocked!", "allCompleted": "All achievements unlocked!",
"completed": "Completed", "completed": "Completed",
"inProgress": "In progress",
"progress": "Progress",
"goalReached": "Goal reached", "goalReached": "Goal reached",
"remaining": "{count} remaining",
"remainingUnlocks": "{count} still unlockable", "remainingUnlocks": "{count} still unlockable",
"noneUnlockedYet": "No achievements unlocked yet.", "noneUnlockedYet": "No achievements unlocked yet.",
"pointsValue": "{points} points", "pointsValue": "{points} points",
@@ -3020,8 +2716,7 @@
"ariaLabel": "Hidden locked achievement" "ariaLabel": "Hidden locked achievement"
}, },
"hiddenUnlockToast": { "hiddenUnlockToast": {
"title": "You unlocked a hidden achievement!", "title": "You unlocked a hidden achievement!"
"description": "Tap to see the surprise."
}, },
"dashboardCard": { "dashboardCard": {
"title": "Recent unlocks", "title": "Recent unlocks",
@@ -3035,20 +2730,9 @@
"loginRequired": "Please sign in to report a bug.", "loginRequired": "Please sign in to report a bug.",
"bugTitle": "Title", "bugTitle": "Title",
"description": "Opis", "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", "submit": "Send",
"success": "Thank you! Your bug report has been submitted successfully.", "success": "Thank you! Your bug report has been submitted successfully.",
"viewOnGithub": "View on GitHub",
"errorCreating": "Error creating report", "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", "category": "Typ",
"categoryBug": "Bug report", "categoryBug": "Bug report",
"categoryFeature": "Feature request", "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.", "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.", "internalOnlyNote": "Your feedback is stored locally and only visible to the administrator of this server.",
"disabledTitle": "Bug reports are turned off", "disabledTitle": "Bug reports are turned off",
"disabledBody": "The administrator has disabled bug reports on this server.", "disabledBody": "The administrator has disabled bug reports on this server."
"disabledError": "Bug reports are disabled by the administrator."
}, },
"notifications": { "notifications": {
"title": "Powiadomienia", "title": "Powiadomienia",
@@ -3069,24 +2752,9 @@
"noChannels": "Configure a notification channel in Settings first.", "noChannels": "Configure a notification channel in Settings first.",
"goToSettings": "Go to Settings", "goToSettings": "Go to Settings",
"channelDisabled": "Wyłączone", "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", "eventPersonalRecord": "Rekord osobisty",
"eventPersonalRecordDesc": "Powiadomienie po osiągnięciu nowego rekordu w metryce lub treningu. Domyślnie wyłączone." "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": { "i18n": {
"maintainershipBanner": { "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.", "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" "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": { "targets": {
"title": "Targets", "title": "Targets",
"introText": "Your current values compared to recommended target ranges. Guideline sources are linked on each card.", "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", "bmi": "BMI",
"bodyFat": "Tkanka tłuszczowa",
"stepsPerDay": "Steps/day",
"medicationCompliance": "Medication compliance",
"steps": "Kroki",
"average30d": "30-day average:", "average30d": "30-day average:",
"consistency": { "consistency": {
"ariaLabel": "Last 7 days, in-range status per day", "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. // See `docs/audit/v1415-i18n-coverage.md` §Legitimate EN==DE==key cases.
const PLACEHOLDER_ALLOWLIST = new Set<string>([ const PLACEHOLDER_ALLOWLIST = new Set<string>([
"settings.ntfy", "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, // v1.4.19 phase A7 — "BMI" is the same acronym in EN and DE,
// and the medical / fitness "Optimal", "Fitness", "Normal" // and the medical / fitness "Optimal", "Fitness", "Normal"
// categories are technical terms that German clinics also use // categories are technical terms that German clinics also use