diff --git a/messages/de.json b/messages/de.json index 0d6890d30..36c227c57 100644 --- a/messages/de.json +++ b/messages/de.json @@ -18,7 +18,6 @@ "optional": "Optional", "active": "Aktiv", "inactive": "Inaktiv", - "enabled": "Aktiviert", "disabled": "Deaktiviert", "networkError": "Netzwerkfehler", "unknownError": "Unbekannter Fehler", @@ -74,7 +73,6 @@ "colTaken": "Eingenommen", "colSkipped": "Übersprungen", "colMissed": "Verpasst", - "colTotal": "Gesamt", "colExpected": "Erwartet", "colComplianceRate": "Therapietreue", "moodTitle": "Stimmungsverlauf", @@ -202,14 +200,12 @@ "measurements": "Messungen", "medications": "Medikamente", "insights": "Insights", - "targets": "Zielwerte", "achievements": "Erfolge", "settings": "Einstellungen", "bugreport": "Bugreport", "admin": "Admin-Konsole", "logout": "Abmelden", "login": "Anmelden", - "about": "Über HealthLog", "notifications": "Benachrichtigungen", "theme": "Darstellung", "themeSystem": "System", @@ -219,13 +215,11 @@ "userMenu": "Benutzermenü", "accountSettings": "Kontoeinstellungen", "mood": "Stimmung", - "workouts": "Workouts", "coach": "Coach", "skipToContent": "Zum Inhalt springen", "sidebar": "Sidebar", "mainNavigation": "Hauptnavigation", "mobileNavigation": "Mobile Navigation", - "breadcrumb": "Brotkrumen-Navigation", "loadingScreen": "Laden…", "more": "Mehr", "moreSheetTitle": "Mehr", @@ -242,7 +236,6 @@ }, "cycle": "Zyklus", "labs": "Laborwerte", - "recovery": "Erholung", "vorsorge": "Vorsorge", "illness": "Krankheit" }, @@ -330,7 +323,6 @@ "sleepShort": "Schlaf", "stepsShort": "Schritte", "vo2MaxShort": "VO₂ max", - "bpInTargetShort": "BD-Ziel", "bpInTargetWindow90": "BD-Ziel · 90 T", "bpInTargetWindowDynamic": "BD-Ziel · {days} T", "bpInTargetCollecting": "sammelt noch Daten", @@ -384,7 +376,6 @@ "staleHintWeeksOther": "Letzter Wert vor {count} Wochen", "staleHintMonthsOne": "Letzter Wert vor 1 Monat", "staleHintMonthsOther": "Letzter Wert vor {count} Monaten", - "coachCta": "Frag den Coach", "recentWorkouts": { "title": "Letzte Workouts", "viewAll": "Alle anzeigen", @@ -499,7 +490,6 @@ "invalidTimestamp": "Bitte einen gültigen Zeitpunkt wählen.", "loginRequired": "Bitte anmelden, um Messwerte zu sehen.", "allTypes": "Alle Typen", - "filterByType": "Nach Typ filtern", "measurementCount": "{count} Messwerte", "emptyTitle": "Noch keine Messwerte", "emptyDescription": "Erfasse Gewicht, Blutdruck, Puls oder andere Werte, um Trends zu erkennen.", @@ -550,7 +540,6 @@ "typeCardioLoad": "Kardio-Belastung", "typeSleepScore": "Schlafscore", "typeBodyTemperatureDeviation": "Körpertemperaturabweichung", - "filterBySource": "Nach Quelle filtern", "sourceComputed": "Berechnet", "sourceWhoop": "WHOOP", "sourceFitbit": "Fitbit", @@ -670,7 +659,6 @@ "factorSadness": "Traurigkeit", "praise": "Lob" }, - "filterBySource": "Nach Quelle filtern", "sourceManual": "Manuell", "sourceWeb": "Web", "sourceTelegram": "Telegram", @@ -741,8 +729,6 @@ "subtitle": "Medikation, Zeitpläne & Einnahmen", "loginRequired": "Bitte anmelden, um Medikamente zu verwalten.", "addMedication": "Hinzufügen", - "editMedication": "Medikament bearbeiten", - "newMedication": "Neues Medikament", "firstMedication": "Erstes Medikament anlegen", "addChoice": { "logIntake": "Einnahme erfassen", @@ -778,16 +764,9 @@ "loadFailed": "Medikamente konnten nicht geladen werden", "retryLoad": "Erneut laden", "name": "Name", - "dose": "Dosis", - "scheduleFrom": "Von", - "scheduleTo": "Bis", - "scheduleLabel": "Bezeichnung", - "scheduleDays": "Tage", - "scheduleDaily": "Täglich", "inactive": "Pausiert", "intakeHistory": "Einnahme-Verlauf", "openDetailPage": "Medikament-Detailseite öffnen", - "deleteConfirm": "Medikament löschen?", "compliance": "Therapietreue", "importIntakes": "Einnahmen importieren", "importDescription": "JSON-Array mit Einnahme-Daten einfügen. Erwartetes Format:", @@ -802,19 +781,7 @@ "importInvalidSkipped": "{count} ungültige Einträge übersprungen", "importFailed": "Import fehlgeschlagen", "importInvalidFormat": "Ungültiges JSON-Format", - "apiEndpointTitle": "API-Endpoint: {name}", - "apiEndpointDescription": "Nutze diesen Endpoint, um Einnahmen per API zu erfassen (z.B. via iPhone-Kurzbefehl oder cron-Job).", - "apiEndpointActive": "API-Endpoint aktiv", - "apiEndpointActivated": "API-Endpoint aktiviert", - "apiEndpointDeactivated": "API-Endpoint deaktiviert", - "apiTokenCount": "Aktiv ({count} Token)", - "apiToken": "API-Token", - "apiTokenActiveHint": "Endpoint ist aktiv. Vorhandene Tokens bleiben gültig, können aber nicht erneut im Klartext angezeigt werden.", - "apiTokenActivateHint": "Aktiviere den Endpoint, um einen neuen Token zu erstellen.", - "apiTokenOnceHint": "Der Token wird nur bei der Erstellung einmal im Klartext angezeigt.", "requestExample": "Request-Beispiel", - "statusLoadFailed": "Status konnte nicht geladen werden", - "changeFailed": "Ändern fehlgeschlagen", "categoryBloodPressure": "Blutdrucksenker", "categoryVitamin": "Vitamine", "categoryThyroid": "Schilddrüse", @@ -847,21 +814,15 @@ "lastDoseDaysAgo": "Letzte Dosis vor {count} Tagen", "overdue": "Überfällig", "veryOverdue": "Stark überfällig", - "compliance7d": "Therapietreue (7 Tage)", - "compliance30d": "Therapietreue (30 Tage)", "complianceWindow": "Therapietreue ({days} Tage)", "complianceUnavailable": "Therapietreue konnte nicht geladen werden", "complianceInfo": "Anteil der erfassten an den erwarteten Dosen. Wöchentliche Pläne zählen wochenweise.", "complianceInfoLabel": "Was bedeutet Therapietreue?", - "complianceDoses": "{count} Dosen", "lastIntake": "Letzte Einnahme:", "nextIntake": "Nächste Einnahme:", "nextIntakeOverdue": "Überfällig · {time} — noch nachholbar", "dayStreak": "Tage Serie", "dayStreakOne": "Tag Serie", - "cycleNextDoseToday": "Nächste Dosis heute", - "cycleNextDoseTomorrow": "Nächste Dosis morgen", - "cycleNextDoseInDays": "Nächste Dosis in {days} Tagen", "cycleDueToday": "Heute fällig", "cycleOverdue": "Überfällig", "cycleNoClosedCycles": "Noch keine abgeschlossenen Dosiszyklen", @@ -873,40 +834,10 @@ "intakeUndo": "Rückgängig", "intakeUndone": "Eintrag zurückgenommen", "intakeUndoFailed": "Rückgängig fehlgeschlagen – im Verlauf korrigieren", - "weekdaySunday": "Sonntag", - "weekdayMonday": "Montag", - "weekdayTuesday": "Dienstag", - "weekdayWednesday": "Mittwoch", - "weekdayThursday": "Donnerstag", - "weekdayFriday": "Freitag", - "weekdaySaturday": "Samstag", - "weekdaySundayPlural": "Sonntags", - "weekdayMondayPlural": "Montags", - "weekdayTuesdayPlural": "Dienstags", - "weekdayWednesdayPlural": "Mittwochs", - "weekdayThursdayPlural": "Donnerstags", - "weekdayFridayPlural": "Freitags", - "weekdaySaturdayPlural": "Samstags", - "formType": "Typ", - "formDose": "Dosis", - "formUnit": "Einheit", - "formSchedule": "Zeitfenster", - "formTreatmentClass": "Behandlungsklasse", - "formTreatmentClassHelp": "Wähle „GLP-1-Injektion“ für wöchentliche Spritzen wie Mounjaro, Ozempic, Wegovy, Zepbound. Schaltet die Körperkarte und das GLP-1-Logbuch frei.", - "treatmentClassGeneric": "Standard-Medikament", - "treatmentClassGlp1": "GLP-1-Injektion", - "glp1WeeklyPresetTitle": "Einmal wöchentlich am …", - "glp1WeeklyPresetHelp": "Die meisten GLP-1-Rezeptoragonisten werden einmal pro Woche injiziert. Tippe einen Tag, um den Rhythmus zu setzen.", - "glp1WeeklyPresetSuggest": "Letzten gewählten Wochentag übernehmen", - "glp1DosesPerUnit": "Dosen pro Pen / Ampulle", - "glp1DosesPerUnitPlaceholder": "z. B. 4 für einen Mounjaro KwikPen", - "glp1DosesPerUnitHelp": "Optional — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy Einmal-Pen = 1. Leer lassen, wenn keine Dosis-pro-Pen-Verfolgung gewünscht ist.", "glp1LastInjection": "{label}", - "glp1LastInjectionWithSite": "{label} · {site}", "glp1NextInjectionDays": "{label} (in {days} Tagen)", "glp1NextInjectionToday": "heute", "glp1NextInjectionTomorrow": "morgen", - "glp1RotationLast": "Letzte Stelle: {site}", "glp1RotationSuggested": "Empfohlen: {site}", "glp1LogSideEffect": "Nebenwirkung loggen", "sideEffects": { @@ -1261,8 +1192,7 @@ "add": "Weiteren Zeitplan hinzufügen", "edit": "Bearbeiten", "remove": "Entfernen", - "removeDisabled": "Mindestens ein Zeitplan ist erforderlich.", - "empty": "Noch kein Zeitplan." + "removeDisabled": "Mindestens ein Zeitplan ist erforderlich." } }, "errors": { @@ -1306,38 +1236,6 @@ "sideEffectTagAppetiteLoss": "Appetitlosigkeit", "sideEffectTagHeartburn": "Sodbrennen", "sideEffectTagHeadache": "Kopfschmerzen", - "newSchedule": "Neues Zeitfenster", - "removeSchedule": "Zeitfenster entfernen", - "advancedEditing": "Erweiterte Bearbeitung", - "advancedEditingHide": "Erweiterte Bearbeitung ausblenden", - "scheduleInterval": "Intervall", - "scheduleEveryWeek": "jede Woche", - "scheduleEveryNWeeks": "alle {n} Wochen", - "scheduleIntervalPrefix": "Intervall:", - "nextSchedulePrefix": "Nächstes Zeitfenster:", - "nextScheduleDaily": "täglich", - "importIntakesAction": "Einnahmen importieren", - "apiEndpointAction": "API-Endpunkt", - "pause": "Pausieren", - "activate": "Aktivieren", - "disableNotifications": "Benachrichtigungen deaktivieren", - "enableNotifications": "Benachrichtigungen aktivieren", - "purgeRecords": "Alle Aufzeichnungen löschen", - "formReset": "Formular zurücksetzen", - "createMedication": "Medikament anlegen", - "deleteConfirmDescription": "Das Medikament und die gesamte Einnahme-Historie werden unwiderruflich gelöscht.", - "purgeConfirmTitle": "Alle Aufzeichnungen löschen?", - "purgeConfirmDescription": "Alle Einnahme-Aufzeichnungen für dieses Medikament werden unwiderruflich gelöscht. Das Medikament selbst bleibt bestehen und startet ohne Verlaufsdaten.", - "saveError": "Fehler beim Speichern", - "deleteError": "Fehler beim Löschen", - "purgeError": "Fehler beim Löschen der Aufzeichnungen", - "invalidTimestamp": "Bitte einen gültigen Zeitpunkt wählen.", - "noIntakesYet": "Noch keine Einnahmen vorhanden", - "actions": "Aktionen", - "pageInfo": "Seite {page} von {total}", - "previousPage": "Vorherige Seite", - "nextPage": "Nächste Seite", - "loginRequiredIntakes": "Bitte anmelden, um Einnahmen zu sehen.", "phaseConfig": "Erinnerungsphasen", "phaseConfigDescription": "Konfiguriere die Zeitpunkte für Erinnerungen.", "phaseGreen": "Grün", @@ -1346,11 +1244,8 @@ "phaseRed": "Rot", "phaseMinutes": "Min", "phasePercent": "%", - "phaseBeforeEnd": "vor Ende", - "phaseAfterEnd": "nach Ende", "phaseResetDefaults": "Auf Defaults zurücksetzen", "phaseSaved": "Erinnerungsphasen gespeichert", - "phaseReset": "Auf Defaults zurückgesetzt", "sourceWeb": "Web", "sourceApi": "iOS-App", "sourceReminder": "Erinnerung", @@ -1370,16 +1265,6 @@ "intakeHistoryPageInfo": "Seite {page} von {total} · {count} Einträge", "intakeHistoryPrev": "Zurück", "intakeHistoryNext": "Weiter", - "unitDrops": "Tropfen", - "unitTablets": "Tablette(n)", - "unitCapsules": "Kapsel(n)", - "unitPieces": "Stück", - "namePlaceholder": "z.B. Ibuprofen", - "dosePlaceholder": "z.B. 400", - "labelPlaceholder": "z.B. Morgens", - "defaultDose": "Standard", - "dayDeactivate": "{day} deaktivieren", - "dayActivate": "{day} aktivieren", "glp1": { "drug": { "tirzepatide": { @@ -1636,8 +1521,6 @@ "historyLabel": "Einnahmeverlauf ansehen" }, "history": { - "back": "Zurück zum Medikament", - "subtitle": "Vollständiger Einnahmeverlauf", "plannedSuffix": "geplant" }, "tabs": { @@ -3609,8 +3492,6 @@ }, "thresholds": { "defaultLabel": "Default", - "autoModeLabel": "Auto", - "overrideModeLabel": "Überschrieben", "overrideToggleLabel": "Eigene Werte", "resetAction": "Auf Default zurücksetzen", "resetAllAction": "Alle auf Default zurücksetzen", @@ -4965,7 +4846,6 @@ "modules": { "title": "Modulverfügbarkeit", "description": "Schalte ein Modul für den gesamten Server ab. Ein hier deaktiviertes Modul ist für jedes Konto aus – unabhängig von den persönlichen Einstellungen. Kerndaten (Gewicht, Blutdruck, Puls, Medikamente) sind immer aktiv und lassen sich nicht abschalten.", - "disabledHint": "Serverweit deaktiviert", "saveError": "Modulverfügbarkeit konnte nicht aktualisiert werden." }, "bugReportRepo": "Repository", @@ -5343,12 +5223,10 @@ "subtitle": "Destruktive systemweite Operationen." }, "about": { - "title": "Über", - "subtitle": "Version, Lizenz, Quellcode und Update-Prüfung." + "title": "Über" } }, "carrier": "Anbieter", - "carrierUnknown": "Unbekannter Anbieter", "carrierUnavailableGeoFallback": "{location} — Anbieter nicht verfügbar" }, "achievements": { @@ -5680,7 +5558,6 @@ "title": "Benachrichtigungen", "breadcrumbInbox": "Benachrichtigungen", "breadcrumbChannels": "Benachrichtigungs-Kanäle", - "breadcrumbSettings": "Einstellungen", "eventColumn": "Ereignis", "subtitle": "Wähle aus, welche Benachrichtigungen du über welchen Kanal erhalten möchtest.", "loadError": "Benachrichtigungseinstellungen konnten nicht geladen werden.", @@ -5797,7 +5674,6 @@ "dotNearRange": "nahe am Bereich", "dotOutOfRange": "außerhalb", "dotNotLogged": "nicht erfasst", - "insufficientData": "Noch zu wenige Daten — bitte weiter erfassen.", "relativeDay": { "today": "heute", "yesterday": "gestern", @@ -5809,7 +5685,6 @@ } }, "edit": { - "openLabel": "Zielbereich für {metric} bearbeiten", "title": "Zielbereich bearbeiten — {metric}", "description": "Passt den Zielbereich an, der in Charts, Insights und im Arztbericht verwendet wird. Werte in {unit}.", "derivedHint": "Diese Karte wird aus anderen Metriken abgeleitet. Bearbeite stattdessen die zugrundeliegenden Ziele (z. B. Blutdruck oder Gewicht).", @@ -5825,13 +5700,6 @@ "saveError": "Zielbereich konnte nicht gespeichert werden", "resetSuccess": "Zielbereich auf Standard zurückgesetzt" }, - "mood": { - "stability": { - "stable": "stabil", - "variable": "schwankend", - "highlyVariable": "sehr schwankend" - } - }, "currentValue": "Aktuell: {value} {unit}", "targetRangeValue": "Zielbereich: {min}–{max} {unit}", "sourceLabel": "Quelle: {source}", @@ -5937,7 +5805,6 @@ }, "lowStockReminders": { "title": "Vorrat niedrig: {medName}", - "body": "Dein Vorrat an {medName} reicht noch etwa {days} Tage ({units} Einheiten übrig).", "bodyToday": "Dein Vorrat an {medName} reicht keinen ganzen Tag mehr ({units} Einheiten übrig).", "bodyReorder": "Dein Vorrat an {medName} ({units} Einheiten) ist um den {runsOutOn} aufgebraucht — bestelle bis zum {reorderBy} nach.", "bodyLastDose": "Dein Vorrat an {medName} ({units} Einheiten) reicht noch etwa für die letzte Dosis. Aufgebraucht um den {runsOutOn}." @@ -6045,7 +5912,6 @@ "description": "Wie sich jeder Messwert zwischen deiner Luteal- und Follikelphase vergleicht – auf deinen eigenen Daten.", "pairLabel": "{metric} · Luteal vs. Follikel", "detail": "Luteal {lutealAvg} {unit} ({lutealDays} Tage) vs. Follikel {follicularAvg} {unit} ({follicularDays} Tage).", - "footer": "Das sind Zusammenhänge in deinen eigenen Daten, keine Ursachen. Nur Muster, die einen Signifikanztest bestehen, werden gezeigt.", "metricRestingHeartRate": "Ruhepuls", "metricHrv": "Herzfrequenzvariabilität", "metricSleepDuration": "Schlafdauer", @@ -6069,10 +5935,6 @@ "confidenceHigh": "Hohe Sicherheit" }, "title": "Zyklus-Erkenntnisse", - "empty": "Phasen-Erkenntnisse erscheinen hier, sobald du genug Zyklen erfasst hast. Sie vergleichen deine Werte über die Zyklusphasen hinweg, mit offen gezeigter Statistik.", - "sampleSize": "n = {n}", - "effectSize": "Effektstärke {value}", - "qValue": "q = {value}", "symptomPatternsTitle": "Symptommuster nach Phase", "symptomPatternsEmpty": "Erfasse Symptome über einen Zyklus, um zu sehen, in welcher Phase sie sich häufen.", "symptomMostlyIn": "Meist in {phase} ({count}/{total} Tage)" @@ -6092,7 +5954,6 @@ "LUTEAL": "Das Progesteron führt durch die zweite Zyklushälfte, und die Basaltemperatur liegt meist etwas höher als zuvor im Zyklus. Manche bemerken im Lauf der Tage Veränderungen bei Schlaf, Appetit, Stimmung oder Energie, während andere durchgehend ausgeglichen bleiben. Das Muster ist persönlich und sieht von Monat zu Monat oft anders aus." }, "commonHere": "Das bemerkst du hier oft", - "trackNudge": "Heute eintragen", "stillLearning": "Lerne deinen Zyklus noch kennen. Trage weiter ein, dann füllt sich das mit Mustern aus deinen eigenen Tagen." }, "insightsSummary": { @@ -6185,10 +6046,7 @@ "prevMonth": "Vorheriger Monat", "nextMonth": "Nächster Monat", "loading": "Kalender wird geladen…", - "empty": "Erfasse Daten, damit sich dein Kalender füllt.", "learning": "Wir lernen deinen Zyklus – erfasse mindestens drei volle Zyklen, dann füllen sich fruchtbares Fenster, Eisprung und Phasen. Bis dahin zeigt der Kalender nur, was du erfasst hast.", - "today": "Heute", - "dayAria": "{date}", "legendSymptom": "Symptome", "legendOvulationConfirmed": "Bestätigter Eisprung", "flowSpotting": "Schmierblutung", @@ -6199,11 +6057,9 @@ "predictions": { "title": "Was als Nächstes kommt", "nextPeriod": "Nächste Periode", - "nextPeriodRange": "Etwa am {date}", "nextPeriodWindow": "{low} – {high}", "fertileWindow": "Fruchtbares Fenster", "ovulation": "Geschätzter Eisprung", - "confidence": "Sicherheit", "confidenceHigh": "Hoch", "confidenceMedium": "Mittel", "confidenceLow": "Niedrig", @@ -6239,7 +6095,6 @@ "sheet": { "title": "Tag erfassen", "description": "Erfasse Stärke, Symptome und Notizen von heute.", - "date": "Datum", "flow": "Stärke", "symptoms": "Symptome", "temperature": "Basaltemperatur", @@ -6259,10 +6114,7 @@ "save": "Speichern", "saving": "Speichern…", "cancel": "Abbrechen", - "saved": "Tag gespeichert", "saveError": "Konnte nicht gespeichert werden. Versuch es erneut.", - "periodStarted": "Periodenbeginn erfasst", - "clear": "Keine", "intermenstrualBleeding": "Schmierblutung zwischen Perioden", "pregnancyTest": "Schwangerschaftstest", "progesteroneTest": "Progesterontest", @@ -6278,8 +6130,6 @@ }, "settings": { "title": "Zyklus-Einstellungen", - "enable": "Zyklus-Tracking", - "enableDescription": "Schalte den Zyklus-Tab für dein Konto ein oder aus.", "typicalCycleLength": "Typische Zykluslänge (Tage)", "typicalPeriodLength": "Typische Periodenlänge (Tage)", "lutealPhaseLength": "Länge der Lutealphase (Tage)", @@ -6298,30 +6148,14 @@ "encryptionDescription": "Verschlüssele absichtsverratende Felder (Schwangerschaftstests, Verhütung, Geschlechtsverkehr) ruhend, zusätzlich zu den stets verschlüsselten Notizen.", "discreet": "Diskrete Benachrichtigungen", "discreetDescription": "Verbirg Zyklusdetails im Benachrichtigungstext auf deinem Sperrbildschirm.", - "dataTitle": "Deine Daten", - "dataDescription": "Deine Zyklusdaten liegen nur auf diesem Server. Exportiere sie jederzeit oder lösche sie endgültig.", - "export": "Meine Zyklusdaten exportieren", - "deleteData": "Meine Zyklusdaten löschen", "saved": "Einstellungen gespeichert", "saveError": "Konnte nicht gespeichert werden. Versuch es erneut.", "save": "Speichern", - "purgeTitle": "Alle Zyklusdaten löschen", - "purgeDescription": "Entfernt dauerhaft jeden erfassten Tag, Zyklus, jede Vorhersage und jeden Erinnerungseintrag. Kann nicht rückgängig gemacht werden.", - "purgeButton": "Alle Zyklusdaten löschen", - "purgeConfirmTitle": "Alle Zyklusdaten löschen?", - "purgeConfirmBody": "Dies löscht dauerhaft jede Periode, jeden Tageseintrag, jedes Symptom und jede Vorhersage. Dies kann nicht rückgängig gemacht werden.", - "purgeConfirm": "Alle Zyklusdaten dauerhaft löschen?", - "purgeCancel": "Abbrechen", - "purgeSuccess": "Alle Zyklusdaten gelöscht.", - "purgeError": "Zyklusdaten konnten nicht gelöscht werden.", "reminders": "Erinnerungen", "remindersDescription": "Perioden-Erinnerungen pro Kanal in den Benachrichtigungseinstellungen aktivieren.", "remindersLink": "Benachrichtigungseinstellungen", "fertileReminder": "Erinnerung an das fruchtbare Fenster", - "fertileReminderDescription": "Erhalte einige Tage vor deinem geschätzten fruchtbaren Fenster einen Hinweis. Standardmäßig aus – aktiviere sie pro Kanal in den Benachrichtigungseinstellungen.", - "purgeData": "Zyklusdaten löschen", - "purgeConfirmAction": "Ja, alles löschen", - "purgeDone": "Zyklusdaten gelöscht." + "fertileReminderDescription": "Erhalte einige Tage vor deinem geschätzten fruchtbaren Fenster einen Hinweis. Standardmäßig aus – aktiviere sie pro Kanal in den Benachrichtigungseinstellungen." }, "testResult": { "POSITIVE": "Positiv", @@ -6502,7 +6336,6 @@ "emptyDescription": "Erfasse Blutwerte wie HbA1c, LDL oder Ferritin, um sie über die Zeit zu verfolgen und mit deiner Ärztin oder deinem Arzt zu teilen.", "referenceLabel": "Referenz", "readingsCount": "{count} Messungen", - "deleteLatest": "Letzten Wert löschen", "deleteConfirmTitle": "Laborwert löschen?", "deleteConfirmDescription": "Dieser Laborwert wird dauerhaft gelöscht.", "deletedToast": "Wert gelöscht", @@ -6514,24 +6347,11 @@ "above": "Über Bereich" }, "form": { - "analyte": "Biomarker", - "analytePlaceholder": "z. B. HbA1c, LDL, Ferritin", "value": "Wert", - "unit": "Einheit", - "unitPlaceholder": "z. B. mg/dl, %, ng/ml", "takenAt": "Probendatum", - "optionalGroup": "Optional", - "panel": "Panel", - "panelPlaceholder": "z. B. Großes Blutbild", - "referenceLow": "Referenz unten", - "referenceHigh": "Referenz oben", - "referenceLowPlaceholder": "Untere Grenze", - "referenceHighPlaceholder": "Obere Grenze", - "referenceHint": "Übernimm den Referenzbereich aus deinem Laborbefund. Beide Grenzen sind optional.", "note": "Notiz", "notePlaceholder": "Optionaler Kontext zu diesem Wert", "requiredError": "Bitte einen Wert eingeben.", - "rangeOrderError": "Die untere Referenz darf nicht über der oberen liegen.", "save": "Speichern", "savedToast": "Wert gespeichert", "saveError": "Wert konnte nicht gespeichert werden", @@ -6824,7 +6644,6 @@ "countOther": "Du hast in diesem Zeitraum {count} Episoden erfasst.", "typicalGap": "Typische Erholungslücke: {days} Tage zwischen Besserung und normalisierten Werten.", "typicalGapLearning": "Noch ein paar abgeschlossene Episoden und hier erscheint eine typische Erholungslücke.", - "byMonth": "Wann du Episoden erfasst", "none": "In diesem Zeitraum keine Episoden erfasst." }, "section": { diff --git a/messages/en.json b/messages/en.json index 0895bb5d8..18cf5182a 100644 --- a/messages/en.json +++ b/messages/en.json @@ -18,7 +18,6 @@ "optional": "Optional", "active": "Active", "inactive": "Inactive", - "enabled": "Enabled", "disabled": "Disabled", "networkError": "Network error", "unknownError": "Unknown error", @@ -74,7 +73,6 @@ "colTaken": "Taken", "colSkipped": "Skipped", "colMissed": "Missed", - "colTotal": "Total", "colExpected": "Expected", "colComplianceRate": "Adherence rate", "moodTitle": "Mood trajectory", @@ -202,14 +200,12 @@ "measurements": "Measurements", "medications": "Medications", "insights": "Insights", - "targets": "Targets", "achievements": "Achievements", "settings": "Settings", "bugreport": "Bug Report", "admin": "Admin Console", "logout": "Sign out", "login": "Sign in", - "about": "About HealthLog", "notifications": "Notifications", "theme": "Appearance", "themeSystem": "System", @@ -219,13 +215,11 @@ "userMenu": "User menu", "accountSettings": "Account settings", "mood": "Mood", - "workouts": "Workouts", "coach": "Coach", "skipToContent": "Skip to content", "sidebar": "Sidebar", "mainNavigation": "Main navigation", "mobileNavigation": "Mobile navigation", - "breadcrumb": "Breadcrumb navigation", "loadingScreen": "Loading…", "more": "More", "moreSheetTitle": "More", @@ -242,7 +236,6 @@ }, "cycle": "Cycle", "labs": "Labs", - "recovery": "Recovery", "vorsorge": "Preventive Care", "illness": "Illness" }, @@ -330,7 +323,6 @@ "sleepShort": "Sleep", "stepsShort": "Steps", "vo2MaxShort": "VO₂ max", - "bpInTargetShort": "BP in Target", "bpInTargetWindow90": "BP in Target · 90d", "bpInTargetWindowDynamic": "BP in Target · {days}d", "bpInTargetCollecting": "collecting data", @@ -384,7 +376,6 @@ "staleHintWeeksOther": "Last reading {count} weeks ago", "staleHintMonthsOne": "Last reading 1 month ago", "staleHintMonthsOther": "Last reading {count} months ago", - "coachCta": "Ask the coach", "recentWorkouts": { "title": "Recent workouts", "viewAll": "View all", @@ -499,7 +490,6 @@ "invalidTimestamp": "Please select a valid time.", "loginRequired": "Please sign in to view measurements.", "allTypes": "All types", - "filterByType": "Filter by type", "measurementCount": "{count} measurements", "emptyTitle": "No measurements yet", "emptyDescription": "Log your weight, blood pressure, pulse, or other vitals to start tracking trends.", @@ -550,7 +540,6 @@ "typeCardioLoad": "Cardio load", "typeSleepScore": "Sleep score", "typeBodyTemperatureDeviation": "Body temperature deviation", - "filterBySource": "Filter by source", "sourceComputed": "Computed", "sourceWhoop": "WHOOP", "sourceFitbit": "Fitbit", @@ -670,7 +659,6 @@ "factorSadness": "sadness", "praise": "praise" }, - "filterBySource": "Filter by source", "sourceManual": "Manual", "sourceWeb": "Web", "sourceTelegram": "Telegram", @@ -741,8 +729,6 @@ "subtitle": "Medications, schedules & intake", "loginRequired": "Please sign in to manage medications.", "addMedication": "Add", - "editMedication": "Edit medication", - "newMedication": "New medication", "firstMedication": "Add first medication", "addChoice": { "logIntake": "Log an intake", @@ -778,16 +764,9 @@ "loadFailed": "Could not load medications", "retryLoad": "Retry", "name": "Name", - "dose": "Dose", - "scheduleFrom": "From", - "scheduleTo": "To", - "scheduleLabel": "Label", - "scheduleDays": "Days", - "scheduleDaily": "Daily", "inactive": "Paused", "intakeHistory": "Intake history", "openDetailPage": "Open medication detail page", - "deleteConfirm": "Delete medication?", "compliance": "Adherence", "importIntakes": "Import intakes", "importDescription": "Paste a JSON array with intake data. Expected format:", @@ -802,19 +781,7 @@ "importInvalidSkipped": "{count} invalid entries skipped", "importFailed": "Import failed", "importInvalidFormat": "Invalid JSON format", - "apiEndpointTitle": "API Endpoint: {name}", - "apiEndpointDescription": "Use this endpoint to record intakes via API (e.g., iPhone Shortcut or cron job).", - "apiEndpointActive": "API endpoint active", - "apiEndpointActivated": "API endpoint activated", - "apiEndpointDeactivated": "API endpoint deactivated", - "apiTokenCount": "Active ({count} tokens)", - "apiToken": "API Token", - "apiTokenActiveHint": "Endpoint is active. Existing tokens remain valid but cannot be shown in plain text again.", - "apiTokenActivateHint": "Activate the endpoint to create a new token.", - "apiTokenOnceHint": "The token is only shown in plain text once at creation.", "requestExample": "Request example", - "statusLoadFailed": "Could not load status", - "changeFailed": "Change failed", "categoryBloodPressure": "Blood Pressure", "categoryVitamin": "Vitamins", "categoryThyroid": "Thyroid", @@ -847,21 +814,15 @@ "lastDoseDaysAgo": "Last dose {count} days ago", "overdue": "Overdue", "veryOverdue": "Very overdue", - "compliance7d": "Adherence (7 days)", - "compliance30d": "Adherence (30 days)", "complianceWindow": "Adherence ({days} days)", "complianceUnavailable": "Adherence could not be loaded", "complianceInfo": "Share of expected doses you logged. Weekly schedules count week by week.", "complianceInfoLabel": "What does adherence mean?", - "complianceDoses": "{count} doses", "lastIntake": "Last intake:", "nextIntake": "Next intake:", "nextIntakeOverdue": "Overdue · {time} — can still be taken", "dayStreak": "day streak", "dayStreakOne": "day streak", - "cycleNextDoseToday": "Next dose today", - "cycleNextDoseTomorrow": "Next dose tomorrow", - "cycleNextDoseInDays": "Next dose in {days} days", "cycleDueToday": "Due today", "cycleOverdue": "Overdue", "cycleNoClosedCycles": "No closed dose cycles yet", @@ -873,40 +834,10 @@ "intakeUndo": "Undo", "intakeUndone": "Entry reverted", "intakeUndoFailed": "Could not undo — open the history to fix it", - "weekdaySunday": "Sunday", - "weekdayMonday": "Monday", - "weekdayTuesday": "Tuesday", - "weekdayWednesday": "Wednesday", - "weekdayThursday": "Thursday", - "weekdayFriday": "Friday", - "weekdaySaturday": "Saturday", - "weekdaySundayPlural": "Sundays", - "weekdayMondayPlural": "Mondays", - "weekdayTuesdayPlural": "Tuesdays", - "weekdayWednesdayPlural": "Wednesdays", - "weekdayThursdayPlural": "Thursdays", - "weekdayFridayPlural": "Fridays", - "weekdaySaturdayPlural": "Saturdays", - "formType": "Type", - "formDose": "Dose", - "formUnit": "Unit", - "formSchedule": "Schedule", - "formTreatmentClass": "Treatment class", - "formTreatmentClassHelp": "Pick \"GLP-1 injection\" for weekly injectables like Mounjaro, Ozempic, Wegovy, Zepbound. Unlocks the body-map picker and the GLP-1 logbook below.", - "treatmentClassGeneric": "Standard medication", - "treatmentClassGlp1": "GLP-1 injection", - "glp1WeeklyPresetTitle": "Once weekly on …", - "glp1WeeklyPresetHelp": "Most GLP-1 receptor agonists are once-weekly. Tap a day to set the cadence.", - "glp1WeeklyPresetSuggest": "Use my last weekday choice", - "glp1DosesPerUnit": "Doses per pen / vial", - "glp1DosesPerUnitPlaceholder": "e.g. 4 for a Mounjaro KwikPen", - "glp1DosesPerUnitHelp": "Optional — Mounjaro KwikPen = 4, Ozempic 0.25/0.5 mg = 4, Wegovy single-dose pen = 1. Leave blank if you don't track per-pen dosing.", "glp1LastInjection": "{label}", - "glp1LastInjectionWithSite": "{label} · {site}", "glp1NextInjectionDays": "{label} (in {days} days)", "glp1NextInjectionToday": "today", "glp1NextInjectionTomorrow": "tomorrow", - "glp1RotationLast": "Last site: {site}", "glp1RotationSuggested": "Recommended next: {site}", "glp1LogSideEffect": "Log side effect", "sideEffects": { @@ -1261,8 +1192,7 @@ "add": "Add another schedule", "edit": "Edit", "remove": "Remove", - "removeDisabled": "At least one schedule is required.", - "empty": "No schedule yet." + "removeDisabled": "At least one schedule is required." } }, "errors": { @@ -1306,38 +1236,6 @@ "sideEffectTagAppetiteLoss": "appetite-loss", "sideEffectTagHeartburn": "heartburn", "sideEffectTagHeadache": "headache", - "newSchedule": "New schedule", - "removeSchedule": "Remove schedule", - "advancedEditing": "Advanced editing", - "advancedEditingHide": "Hide advanced editing", - "scheduleInterval": "Interval", - "scheduleEveryWeek": "every week", - "scheduleEveryNWeeks": "every {n} weeks", - "scheduleIntervalPrefix": "Interval:", - "nextSchedulePrefix": "Next schedule:", - "nextScheduleDaily": "daily", - "importIntakesAction": "Import intakes", - "apiEndpointAction": "API endpoint", - "pause": "Pause", - "activate": "Activate", - "disableNotifications": "Disable notifications", - "enableNotifications": "Enable notifications", - "purgeRecords": "Delete all records", - "formReset": "Reset form", - "createMedication": "Create medication", - "deleteConfirmDescription": "The medication and all intake history will be permanently deleted.", - "purgeConfirmTitle": "Delete all records?", - "purgeConfirmDescription": "All intake records for this medication will be permanently deleted. The medication itself will remain and start without history data.", - "saveError": "Error saving", - "deleteError": "Error deleting", - "purgeError": "Error deleting records", - "invalidTimestamp": "Please select a valid time.", - "noIntakesYet": "No intakes recorded yet", - "actions": "Actions", - "pageInfo": "Page {page} of {total}", - "previousPage": "Previous page", - "nextPage": "Next page", - "loginRequiredIntakes": "Please sign in to view intakes.", "phaseConfig": "Reminder phases", "phaseConfigDescription": "Configure timing for reminders.", "phaseGreen": "Green", @@ -1346,11 +1244,8 @@ "phaseRed": "Red", "phaseMinutes": "Min", "phasePercent": "%", - "phaseBeforeEnd": "before end", - "phaseAfterEnd": "after end", "phaseResetDefaults": "Reset to defaults", "phaseSaved": "Reminder phases saved", - "phaseReset": "Reset to defaults", "sourceWeb": "Web", "sourceApi": "iOS App", "sourceReminder": "Reminder", @@ -1370,16 +1265,6 @@ "intakeHistoryPageInfo": "Page {page} of {total} · {count} entries", "intakeHistoryPrev": "Previous", "intakeHistoryNext": "Next", - "unitDrops": "Drops", - "unitTablets": "Tablet(s)", - "unitCapsules": "Capsule(s)", - "unitPieces": "Piece(s)", - "namePlaceholder": "e.g. Ibuprofen", - "dosePlaceholder": "e.g. 400", - "labelPlaceholder": "e.g. Morning", - "defaultDose": "Default", - "dayDeactivate": "Deactivate {day}", - "dayActivate": "Activate {day}", "glp1": { "drug": { "tirzepatide": { @@ -1636,8 +1521,6 @@ "historyLabel": "View intake history" }, "history": { - "back": "Back to medication", - "subtitle": "Full intake history", "plannedSuffix": "planned" }, "tabs": { @@ -3609,8 +3492,6 @@ }, "thresholds": { "defaultLabel": "Default", - "autoModeLabel": "Auto", - "overrideModeLabel": "Override", "overrideToggleLabel": "Custom range", "resetAction": "Reset to default", "resetAllAction": "Reset all to default", @@ -4965,7 +4846,6 @@ "modules": { "title": "Module availability", "description": "Turn a module off for the whole server. A module disabled here is off for every account regardless of personal preference. Core domains (weight, blood pressure, pulse, medications) are always on and cannot be disabled.", - "disabledHint": "Disabled server-wide", "saveError": "Could not update module availability." }, "bugReportRepo": "Repository", @@ -5343,12 +5223,10 @@ "subtitle": "Destructive system-wide operations." }, "about": { - "title": "About", - "subtitle": "Version, license, source, and update check." + "title": "About" } }, "carrier": "Carrier", - "carrierUnknown": "Unknown carrier", "carrierUnavailableGeoFallback": "{location} — carrier unavailable" }, "achievements": { @@ -5680,7 +5558,6 @@ "title": "Notifications", "breadcrumbInbox": "Notifications", "breadcrumbChannels": "Notification channels", - "breadcrumbSettings": "Settings", "eventColumn": "Event", "subtitle": "Choose which notifications you want to receive through which channel.", "loadError": "Notification preferences could not be loaded.", @@ -5797,7 +5674,6 @@ "dotNearRange": "near range", "dotOutOfRange": "out of range", "dotNotLogged": "not logged", - "insufficientData": "Not enough data yet — keep logging.", "relativeDay": { "today": "today", "yesterday": "yesterday", @@ -5809,7 +5685,6 @@ } }, "edit": { - "openLabel": "Edit target range for {metric}", "title": "Edit target range — {metric}", "description": "Adjust the in-range band used across charts, insights and the doctor report. Values are in {unit}.", "derivedHint": "This card is derived from other metrics. Edit the underlying targets (e.g. blood pressure or weight) instead.", @@ -5825,13 +5700,6 @@ "saveError": "Could not save the target range", "resetSuccess": "Target range reset to default" }, - "mood": { - "stability": { - "stable": "stable", - "variable": "variable", - "highlyVariable": "highly variable" - } - }, "currentValue": "Current: {value} {unit}", "targetRangeValue": "Target: {min}–{max} {unit}", "sourceLabel": "Source: {source}", @@ -5937,7 +5805,6 @@ }, "lowStockReminders": { "title": "Low supply: {medName}", - "body": "{medName}: {units} units left — enough for about {days} more days.", "bodyToday": "{medName}: {units} units left — less than one day of supply.", "bodyReorder": "{medName}: {units} units left. Supply runs out around {runsOutOn} — reorder by {reorderBy}.", "bodyLastDose": "{medName}: {units} units left — about your final dose. Supply runs out around {runsOutOn}." @@ -6045,7 +5912,6 @@ "description": "How each measurement compares between your luteal and follicular phases, on your own data.", "pairLabel": "{metric} · luteal vs follicular", "detail": "Luteal {lutealAvg} {unit} ({lutealDays} days) vs follicular {follicularAvg} {unit} ({follicularDays} days).", - "footer": "These are associations in your own data, not causes. Only patterns that clear a significance check are shown.", "metricRestingHeartRate": "Resting heart rate", "metricHrv": "Heart-rate variability", "metricSleepDuration": "Sleep duration", @@ -6069,10 +5935,6 @@ "confidenceHigh": "High confidence" }, "title": "Cycle insights", - "empty": "Phase insights appear here once you have enough logged cycles. They compare your metrics across cycle phases, with the statistics shown openly.", - "sampleSize": "n = {n}", - "effectSize": "Effect size {value}", - "qValue": "q = {value}", "symptomPatternsTitle": "Symptom patterns by phase", "symptomPatternsEmpty": "Log symptoms across a cycle to see which phase they cluster in.", "symptomMostlyIn": "Mostly in {phase} ({count}/{total} days)" @@ -6092,7 +5954,6 @@ "LUTEAL": "Progesterone leads the second half and basal body temperature usually settles a little higher than earlier in the cycle. Some people notice shifts in sleep, appetite, mood or energy as the days go on, while others feel steady throughout. The pattern is personal, and it often looks different from one month to the next." }, "commonHere": "You often notice this here", - "trackNudge": "Log today", "stillLearning": "Still learning your cycle. Keep logging and this fills in with patterns from your own days." }, "insightsSummary": { @@ -6185,10 +6046,7 @@ "prevMonth": "Previous month", "nextMonth": "Next month", "loading": "Loading your calendar…", - "empty": "Start logging to see your calendar fill in.", "learning": "Learning your cycle — log at least three full cycles and the fertile window, ovulation and phases fill in. Until then the calendar shows only what you've logged.", - "today": "Today", - "dayAria": "{date}", "legendSymptom": "Symptoms", "legendOvulationConfirmed": "Confirmed ovulation", "flowSpotting": "spotting", @@ -6199,11 +6057,9 @@ "predictions": { "title": "What comes next", "nextPeriod": "Next period", - "nextPeriodRange": "Around {date}", "nextPeriodWindow": "{low} – {high}", "fertileWindow": "Fertile window", "ovulation": "Estimated ovulation", - "confidence": "Confidence", "confidenceHigh": "High", "confidenceMedium": "Medium", "confidenceLow": "Low", @@ -6239,7 +6095,6 @@ "sheet": { "title": "Log your day", "description": "Capture today's flow, symptoms, and notes.", - "date": "Date", "flow": "Flow", "symptoms": "Symptoms", "temperature": "Basal body temperature", @@ -6266,10 +6121,7 @@ "save": "Save", "saving": "Saving…", "cancel": "Cancel", - "saved": "Day saved", "saveError": "Could not save. Try again.", - "periodStarted": "Period start logged", - "clear": "None", "temperatureSection": "Temperature & ovulation", "intimacySection": "Intimacy & contraception", "testsSection": "Tests", @@ -6283,8 +6135,6 @@ }, "settings": { "title": "Cycle settings", - "enable": "Cycle tracking", - "enableDescription": "Turn the cycle tab on or off for your account.", "typicalCycleLength": "Typical cycle length (days)", "typicalPeriodLength": "Typical period length (days)", "lutealPhaseLength": "Luteal phase length (days)", @@ -6303,30 +6153,14 @@ "encryptionDescription": "Encrypt intent-revealing fields (pregnancy tests, contraception, intercourse) at rest, on top of the always-encrypted notes.", "discreet": "Discreet notifications", "discreetDescription": "Hide cycle details from notification text on your lock screen.", - "dataTitle": "Your data", - "dataDescription": "Your cycle data lives only on this server. Export it any time, or delete it for good.", - "export": "Export my cycle data", - "deleteData": "Delete my cycle data", "saved": "Settings saved", "saveError": "Could not save. Try again.", "save": "Save", - "purgeTitle": "Delete all cycle data", - "purgeDescription": "Permanently removes every logged day, cycle, prediction, and reminder record. This cannot be undone.", - "purgeButton": "Delete all cycle data", - "purgeConfirmTitle": "Delete all cycle data?", - "purgeConfirmBody": "This permanently deletes every period, day-log, symptom, and prediction. This cannot be undone.", - "purgeConfirm": "Delete all cycle data permanently?", - "purgeCancel": "Cancel", - "purgeSuccess": "All cycle data deleted.", - "purgeError": "Couldn't delete cycle data.", "reminders": "Reminders", "remindersDescription": "Turn period reminders on per channel in notification settings.", "remindersLink": "Notification settings", "fertileReminder": "Fertile-window reminder", - "fertileReminderDescription": "Get a heads-up a few days before your estimated fertile window. Off by default — turn it on per channel in notification settings.", - "purgeData": "Delete cycle data", - "purgeConfirmAction": "Yes, delete everything", - "purgeDone": "Cycle data deleted." + "fertileReminderDescription": "Get a heads-up a few days before your estimated fertile window. Off by default — turn it on per channel in notification settings." }, "contraceptive": { "NONE": "None", @@ -6502,7 +6336,6 @@ "emptyDescription": "Record bloodwork like HbA1c, LDL or ferritin to track it over time and share it with your doctor.", "referenceLabel": "Reference", "readingsCount": "{count} readings", - "deleteLatest": "Delete latest reading", "deleteConfirmTitle": "Delete lab result?", "deleteConfirmDescription": "This lab result will be permanently deleted.", "deletedToast": "Result deleted", @@ -6514,24 +6347,11 @@ "above": "Above range" }, "form": { - "analyte": "Biomarker", - "analytePlaceholder": "e.g. HbA1c, LDL, Ferritin", "value": "Value", - "unit": "Unit", - "unitPlaceholder": "e.g. mg/dL, %, ng/mL", "takenAt": "Sample date", - "optionalGroup": "Optional", - "panel": "Panel", - "panelPlaceholder": "e.g. Complete blood count", - "referenceLow": "Reference low", - "referenceHigh": "Reference high", - "referenceLowPlaceholder": "Lower bound", - "referenceHighPlaceholder": "Upper bound", - "referenceHint": "Copy the reference range from your lab report. Either bound is optional.", "note": "Note", "notePlaceholder": "Optional context for this result", "requiredError": "Enter a value.", - "rangeOrderError": "The reference low must not exceed the reference high.", "save": "Save", "savedToast": "Result saved", "saveError": "Could not save the result", @@ -6824,7 +6644,6 @@ "countOther": "You logged {count} episodes in this period.", "typicalGap": "Typical recovery gap: {days} days between feeling better and your numbers settling.", "typicalGapLearning": "A few more resolved episodes and a typical recovery gap will appear here.", - "byMonth": "When you tend to log episodes", "none": "No episodes logged in this period." }, "section": { diff --git a/messages/es.json b/messages/es.json index ecc64c96c..1b2e2c7a0 100644 --- a/messages/es.json +++ b/messages/es.json @@ -18,7 +18,6 @@ "optional": "Opcional", "active": "Activo", "inactive": "Inactivo", - "enabled": "Activado", "disabled": "Desactivado", "networkError": "Error de red", "unknownError": "Error desconocido", @@ -74,7 +73,6 @@ "colTaken": "Tomada", "colSkipped": "Omitida", "colMissed": "Perdida", - "colTotal": "Total", "colExpected": "Esperadas", "colComplianceRate": "Tasa de cumplimiento", "moodTitle": "Evolución del estado de ánimo", @@ -202,14 +200,12 @@ "measurements": "Mediciones", "medications": "Medicamentos", "insights": "Insights", - "targets": "Objetivos", "achievements": "Logros", "settings": "Ajustes", "bugreport": "Reporte de bug", "admin": "Consola de administración", "logout": "Cerrar sesión", "login": "Iniciar sesión", - "about": "Acerca de HealthLog", "notifications": "Notificaciones", "theme": "Apariencia", "themeSystem": "Sistema", @@ -219,13 +215,11 @@ "userMenu": "Menú de usuario", "accountSettings": "Ajustes de cuenta", "mood": "Estado de ánimo", - "workouts": "Entrenamientos", "coach": "Coach", "skipToContent": "Saltar al contenido", "sidebar": "Barra lateral", "mainNavigation": "Navegación principal", "mobileNavigation": "Navegación móvil", - "breadcrumb": "Ruta de navegación", "loadingScreen": "Cargando…", "more": "Más", "moreSheetTitle": "Más", @@ -242,7 +236,6 @@ }, "cycle": "Ciclo", "labs": "Análisis", - "recovery": "Recuperación", "vorsorge": "Prevención", "illness": "Enfermedad" }, @@ -330,7 +323,6 @@ "sleepShort": "Sueño", "stepsShort": "Pasos", "vo2MaxShort": "VO₂ máx", - "bpInTargetShort": "PA-objetivo", "bpInTargetWindow90": "PA-objetivo · 90 d", "bpInTargetWindowDynamic": "PA-objetivo · {days} d", "bpInTargetCollecting": "recopilando datos", @@ -384,7 +376,6 @@ "staleHintWeeksOther": "Último valor hace {count} semanas", "staleHintMonthsOne": "Último valor hace 1 mes", "staleHintMonthsOther": "Último valor hace {count} meses", - "coachCta": "Pregunta al coach", "recentWorkouts": { "title": "Entrenamientos recientes", "viewAll": "Ver todos", @@ -499,7 +490,6 @@ "invalidTimestamp": "Selecciona una fecha y hora válidas.", "loginRequired": "Inicia sesión para ver las mediciones.", "allTypes": "Todos los tipos", - "filterByType": "Filtrar por tipo", "measurementCount": "{count} mediciones", "emptyTitle": "Aún no hay mediciones", "emptyDescription": "Registra peso, tensión arterial, pulso u otros valores para detectar tendencias.", @@ -550,7 +540,6 @@ "typeCardioLoad": "Carga cardio", "typeSleepScore": "Puntuación de sueño", "typeBodyTemperatureDeviation": "Desviación de temperatura corporal", - "filterBySource": "Filtrar por fuente", "sourceComputed": "Calculado", "sourceWhoop": "WHOOP", "sourceFitbit": "Fitbit", @@ -670,7 +659,6 @@ "factorSadness": "tristeza", "praise": "elogio" }, - "filterBySource": "Filtrar por fuente", "sourceManual": "Manual", "sourceWeb": "Web", "sourceTelegram": "Telegram", @@ -741,8 +729,6 @@ "subtitle": "Medicación, horarios y tomas", "loginRequired": "Inicia sesión para gestionar medicamentos.", "addMedication": "Añadir", - "editMedication": "Editar medicamento", - "newMedication": "Nuevo medicamento", "firstMedication": "Añadir el primer medicamento", "addChoice": { "logIntake": "Registrar una toma", @@ -778,16 +764,9 @@ "loadFailed": "No se han podido cargar los medicamentos", "retryLoad": "Reintentar", "name": "Nombre", - "dose": "Dosis", - "scheduleFrom": "Desde", - "scheduleTo": "Hasta", - "scheduleLabel": "Etiqueta", - "scheduleDays": "Días", - "scheduleDaily": "A diario", "inactive": "En pausa", "intakeHistory": "Historial de tomas", "openDetailPage": "Abrir la página de detalle del medicamento", - "deleteConfirm": "¿Eliminar medicamento?", "compliance": "Cumplimiento", "importIntakes": "Importar tomas", "importDescription": "Pega un array JSON con los datos de tomas. Formato esperado:", @@ -802,19 +781,7 @@ "importInvalidSkipped": "{count} entradas no válidas omitidas", "importFailed": "Falló la importación", "importInvalidFormat": "Formato JSON no válido", - "apiEndpointTitle": "Endpoint de API: {name}", - "apiEndpointDescription": "Usa este endpoint para registrar tomas a través de la API (p. ej., con un Atajo de iPhone o un cron job).", - "apiEndpointActive": "Endpoint de API activo", - "apiEndpointActivated": "Endpoint de API activado", - "apiEndpointDeactivated": "Endpoint de API desactivado", - "apiTokenCount": "Activo ({count} tokens)", - "apiToken": "Token de API", - "apiTokenActiveHint": "El endpoint está activo. Los tokens existentes siguen siendo válidos, pero no se pueden mostrar de nuevo en texto plano.", - "apiTokenActivateHint": "Activa el endpoint para crear un nuevo token.", - "apiTokenOnceHint": "El token solo se muestra en texto plano una vez, al crearlo.", "requestExample": "Ejemplo de solicitud", - "statusLoadFailed": "No se pudo cargar el estado", - "changeFailed": "Falló el cambio", "categoryBloodPressure": "Presión arterial", "categoryVitamin": "Vitaminas", "categoryThyroid": "Tiroides", @@ -847,21 +814,15 @@ "lastDoseDaysAgo": "Última dosis hace {count} días", "overdue": "Vencida", "veryOverdue": "Muy vencida", - "compliance7d": "Cumplimiento 7 días", - "compliance30d": "Cumplimiento 30 días", "complianceWindow": "Cumplimiento {days} días", "complianceUnavailable": "No se pudo cargar el cumplimiento", "complianceInfo": "Proporción de dosis registradas respecto a las esperadas. Las pautas semanales se cuentan semana a semana.", "complianceInfoLabel": "¿Qué significa el cumplimiento?", - "complianceDoses": "{count} dosis", "lastIntake": "Última toma:", "nextIntake": "Próxima toma:", "nextIntakeOverdue": "Atrasada · {time} — aún se puede tomar", "dayStreak": "días de racha", "dayStreakOne": "día de racha", - "cycleNextDoseToday": "Próxima dosis hoy", - "cycleNextDoseTomorrow": "Próxima dosis mañana", - "cycleNextDoseInDays": "Próxima dosis en {days} días", "cycleDueToday": "Pendiente hoy", "cycleOverdue": "Atrasada", "cycleNoClosedCycles": "Aún no hay ciclos de dosis completados", @@ -873,40 +834,10 @@ "intakeUndo": "Deshacer", "intakeUndone": "Entrada revertida", "intakeUndoFailed": "No se pudo deshacer; corrígelo en el historial", - "weekdaySunday": "Domingo", - "weekdayMonday": "Lunes", - "weekdayTuesday": "Martes", - "weekdayWednesday": "Miércoles", - "weekdayThursday": "Jueves", - "weekdayFriday": "Viernes", - "weekdaySaturday": "Sábado", - "weekdaySundayPlural": "Domingos", - "weekdayMondayPlural": "Lunes", - "weekdayTuesdayPlural": "Martes", - "weekdayWednesdayPlural": "Miércoles", - "weekdayThursdayPlural": "Jueves", - "weekdayFridayPlural": "Viernes", - "weekdaySaturdayPlural": "Sábados", - "formType": "Tipo", - "formDose": "Dosis", - "formUnit": "Unidad", - "formSchedule": "Franja horaria", - "formTreatmentClass": "Clase de tratamiento", - "formTreatmentClassHelp": "Selecciona \"Inyección GLP-1\" para inyecciones semanales como Mounjaro, Ozempic, Wegovy, Zepbound. Activa la tarjeta corporal y el registro GLP-1.", - "treatmentClassGeneric": "Medicamento estándar", - "treatmentClassGlp1": "Inyección GLP-1", - "glp1WeeklyPresetTitle": "Una vez por semana, en…", - "glp1WeeklyPresetHelp": "La mayoría de los agonistas del receptor GLP-1 se inyectan una vez por semana. Toca un día para fijar el ritmo.", - "glp1WeeklyPresetSuggest": "Reutilizar el último día elegido", - "glp1DosesPerUnit": "Dosis por pluma / vial", - "glp1DosesPerUnitPlaceholder": "p. ej. 4 para una pluma Mounjaro KwikPen", - "glp1DosesPerUnitHelp": "Opcional — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy pluma de un solo uso = 1. Déjalo vacío si no quieres llevar el conteo de dosis por pluma.", "glp1LastInjection": "{label}", - "glp1LastInjectionWithSite": "{label} · {site}", "glp1NextInjectionDays": "{label} (en {days} días)", "glp1NextInjectionToday": "hoy", "glp1NextInjectionTomorrow": "mañana", - "glp1RotationLast": "Último sitio: {site}", "glp1RotationSuggested": "Sugerido: {site}", "glp1LogSideEffect": "Registrar efecto secundario", "sideEffects": { @@ -1261,8 +1192,7 @@ "add": "Añadir otro horario", "edit": "Editar", "remove": "Quitar", - "removeDisabled": "Se requiere al menos un horario.", - "empty": "Aún no hay horario." + "removeDisabled": "Se requiere al menos un horario." } }, "errors": { @@ -1306,38 +1236,6 @@ "sideEffectTagAppetiteLoss": "Pérdida de apetito", "sideEffectTagHeartburn": "Ardor de estómago", "sideEffectTagHeadache": "Dolor de cabeza", - "newSchedule": "Nueva franja horaria", - "removeSchedule": "Quitar franja horaria", - "advancedEditing": "Edición avanzada", - "advancedEditingHide": "Ocultar edición avanzada", - "scheduleInterval": "Intervalo", - "scheduleEveryWeek": "cada semana", - "scheduleEveryNWeeks": "cada {n} semanas", - "scheduleIntervalPrefix": "Intervalo:", - "nextSchedulePrefix": "Próxima franja:", - "nextScheduleDaily": "a diario", - "importIntakesAction": "Importar tomas", - "apiEndpointAction": "Endpoint de API", - "pause": "Pausar", - "activate": "Activar", - "disableNotifications": "Desactivar notificaciones", - "enableNotifications": "Activar notificaciones", - "purgeRecords": "Eliminar registros", - "formReset": "Restablecer formulario", - "createMedication": "Crear medicamento", - "deleteConfirmDescription": "Este medicamento y todas sus tomas se eliminarán de forma permanente.", - "purgeConfirmTitle": "¿Eliminar todas las tomas?", - "purgeConfirmDescription": "Se eliminarán de forma permanente todas las tomas registradas para este medicamento.", - "saveError": "Error al guardar", - "deleteError": "Error al eliminar", - "purgeError": "Error al limpiar los registros", - "invalidTimestamp": "Selecciona una fecha y hora válidas.", - "noIntakesYet": "Aún no hay tomas registradas.", - "actions": "Acciones", - "pageInfo": "Página {page} de {total}", - "previousPage": "Página anterior", - "nextPage": "Página siguiente", - "loginRequiredIntakes": "Inicia sesión para ver el historial de tomas.", "phaseConfig": "Fases de recordatorio", "phaseConfigDescription": "Configura los momentos de los recordatorios.", "phaseGreen": "Verde", @@ -1346,11 +1244,8 @@ "phaseRed": "Rojo", "phaseMinutes": "Mín", "phasePercent": "%", - "phaseBeforeEnd": "antes del final", - "phaseAfterEnd": "después del final", "phaseResetDefaults": "Restablecer valores por defecto", "phaseSaved": "Fases de recordatorio guardadas", - "phaseReset": "Restablecidas a valores por defecto", "sourceWeb": "Web", "sourceApi": "App de iOS", "sourceReminder": "Recordatorio", @@ -1370,16 +1265,6 @@ "intakeHistoryPageInfo": "Página {page} de {total} · {count} entradas", "intakeHistoryPrev": "Anterior", "intakeHistoryNext": "Siguiente", - "unitDrops": "gotas", - "unitTablets": "comprimidos", - "unitCapsules": "cápsulas", - "unitPieces": "unidades", - "namePlaceholder": "p. ej. Ramipril", - "dosePlaceholder": "p. ej. 5 mg", - "labelPlaceholder": "p. ej. Por la mañana", - "defaultDose": "Dosis estándar", - "dayDeactivate": "Desactivar {day}", - "dayActivate": "Activar {day}", "glp1": { "drug": { "tirzepatide": { @@ -1636,8 +1521,6 @@ "historyLabel": "Ver historial de tomas" }, "history": { - "back": "Volver al medicamento", - "subtitle": "Historial completo de tomas", "plannedSuffix": "planificado" }, "tabs": { @@ -3609,8 +3492,6 @@ }, "thresholds": { "defaultLabel": "Por defecto", - "autoModeLabel": "Auto", - "overrideModeLabel": "Personalizado", "overrideToggleLabel": "Valores propios", "resetAction": "Restablecer valor por defecto", "resetAllAction": "Restablecer todos los valores", @@ -4965,7 +4846,6 @@ "modules": { "title": "Disponibilidad de módulos", "description": "Desactiva un módulo para todo el servidor. Un módulo desactivado aquí queda apagado para todas las cuentas, sin importar la preferencia personal. Los dominios principales (peso, presión arterial, pulso, medicación) están siempre activos y no se pueden desactivar.", - "disabledHint": "Desactivado en todo el servidor", "saveError": "No se pudo actualizar la disponibilidad de módulos." }, "bugReportRepo": "Repositorio", @@ -5343,12 +5223,10 @@ "subtitle": "Operaciones destructivas en todo el sistema." }, "about": { - "title": "Acerca de", - "subtitle": "Versión, licencia, código fuente y comprobación de actualizaciones." + "title": "Acerca de" } }, "carrier": "Operador", - "carrierUnknown": "Operador desconocido", "carrierUnavailableGeoFallback": "{location} — operador no disponible" }, "achievements": { @@ -5680,7 +5558,6 @@ "title": "Notificaciones", "breadcrumbInbox": "Notificaciones", "breadcrumbChannels": "Canales de notificación", - "breadcrumbSettings": "Ajustes", "eventColumn": "Evento", "subtitle": "Elige qué notificaciones recibes y por qué canal.", "loadError": "No se han podido cargar los ajustes de notificación.", @@ -5797,7 +5674,6 @@ "dotNearRange": "cerca del rango", "dotOutOfRange": "fuera", "dotNotLogged": "no registrado", - "insufficientData": "Aún hay pocos datos — sigue registrando.", "relativeDay": { "today": "Hoy", "yesterday": "Ayer", @@ -5809,7 +5685,6 @@ } }, "edit": { - "openLabel": "Editar el rango objetivo de {metric}", "title": "Editar rango objetivo — {metric}", "description": "Ajusta el rango objetivo usado en gráficas, insights y el informe médico. Valores en {unit}.", "derivedHint": "Esta tarjeta se calcula a partir de otras métricas. Edita en su lugar los objetivos subyacentes (p. ej. tensión arterial o peso).", @@ -5825,13 +5700,6 @@ "saveError": "No se ha podido guardar el rango objetivo", "resetSuccess": "Rango objetivo restablecido por defecto" }, - "mood": { - "stability": { - "stable": "estable", - "variable": "variable", - "highlyVariable": "muy variable" - } - }, "currentValue": "Actual: {value} {unit}", "targetRangeValue": "Rango objetivo: {min}–{max} {unit}", "sourceLabel": "Fuente: {source}", @@ -5937,7 +5805,6 @@ }, "lowStockReminders": { "title": "Quedan pocas existencias: {medName}", - "body": "{medName}: quedan {units} unidades — para unos {days} días más.", "bodyToday": "{medName}: quedan {units} unidades — menos de un día de suministro.", "bodyReorder": "{medName}: quedan {units} unidades. Las existencias se agotan hacia el {runsOutOn} — vuelve a pedir antes del {reorderBy}.", "bodyLastDose": "{medName}: quedan {units} unidades — alrededor de tu última dosis. Las existencias se agotan hacia el {runsOutOn}." @@ -6045,7 +5912,6 @@ "description": "Cómo se compara cada medición entre tus fases lútea y folicular, con tus propios datos.", "pairLabel": "{metric} · lútea vs. folicular", "detail": "Lútea {lutealAvg} {unit} ({lutealDays} días) vs. folicular {follicularAvg} {unit} ({follicularDays} días).", - "footer": "Son asociaciones en tus propios datos, no causas. Solo se muestran los patrones que superan una prueba de significación.", "metricRestingHeartRate": "Frecuencia cardíaca en reposo", "metricHrv": "Variabilidad de la frecuencia cardíaca", "metricSleepDuration": "Duración del sueño", @@ -6069,10 +5935,6 @@ "confidenceHigh": "Confianza alta" }, "title": "Análisis del ciclo", - "empty": "Los análisis por fase aparecen aquí cuando tienes suficientes ciclos registrados. Comparan tus métricas entre fases del ciclo, mostrando la estadística abiertamente.", - "sampleSize": "n = {n}", - "effectSize": "Tamaño del efecto {value}", - "qValue": "q = {value}", "symptomPatternsTitle": "Patrones de síntomas por fase", "symptomPatternsEmpty": "Registra síntomas a lo largo de un ciclo para ver en qué fase se concentran.", "symptomMostlyIn": "Sobre todo en {phase} ({count}/{total} días)" @@ -6092,7 +5954,6 @@ "LUTEAL": "La progesterona guía la segunda mitad y la temperatura basal suele asentarse algo más alta que al inicio del ciclo. Algunas personas notan cambios en el sueño, el apetito, el ánimo o la energía a medida que pasan los días, mientras que otras se sienten estables todo el tiempo. El patrón es personal y a menudo se ve distinto de un mes a otro." }, "commonHere": "Esto lo notas a menudo aquí", - "trackNudge": "Registrar hoy", "stillLearning": "Aún estamos conociendo tu ciclo. Sigue registrando y esto se irá completando con patrones de tus propios días." }, "insightsSummary": { @@ -6185,10 +6046,7 @@ "prevMonth": "Mes anterior", "nextMonth": "Mes siguiente", "loading": "Cargando tu calendario…", - "empty": "Empieza a registrar para ver tu calendario.", "learning": "Estamos aprendiendo tu ciclo: registra al menos tres ciclos completos y se completarán la ventana fértil, la ovulación y las fases. Hasta entonces, el calendario solo muestra lo que has registrado.", - "today": "Hoy", - "dayAria": "{date}", "legendSymptom": "Síntomas", "legendOvulationConfirmed": "Ovulación confirmada", "flowSpotting": "manchado", @@ -6199,11 +6057,9 @@ "predictions": { "title": "Qué viene después", "nextPeriod": "Próximo periodo", - "nextPeriodRange": "Alrededor del {date}", "nextPeriodWindow": "{low} – {high}", "fertileWindow": "Ventana fértil", "ovulation": "Ovulación estimada", - "confidence": "Confianza", "confidenceHigh": "Alta", "confidenceMedium": "Media", "confidenceLow": "Baja", @@ -6239,7 +6095,6 @@ "sheet": { "title": "Registrar tu día", "description": "Captura el flujo, los síntomas y las notas de hoy.", - "date": "Fecha", "flow": "Flujo", "symptoms": "Síntomas", "temperature": "Temperatura basal", @@ -6259,10 +6114,7 @@ "save": "Guardar", "saving": "Guardando…", "cancel": "Cancelar", - "saved": "Día guardado", "saveError": "No se pudo guardar. Inténtalo de nuevo.", - "periodStarted": "Inicio del periodo registrado", - "clear": "Ninguno", "intermenstrualBleeding": "Manchado entre periodos", "pregnancyTest": "Prueba de embarazo", "progesteroneTest": "Prueba de progesterona", @@ -6278,8 +6130,6 @@ }, "settings": { "title": "Ajustes del ciclo", - "enable": "Seguimiento del ciclo", - "enableDescription": "Activa o desactiva la pestaña del ciclo en tu cuenta.", "typicalCycleLength": "Duración típica del ciclo (días)", "typicalPeriodLength": "Duración típica del periodo (días)", "lutealPhaseLength": "Duración de la fase lútea (días)", @@ -6298,30 +6148,14 @@ "encryptionDescription": "Cifra en reposo los campos que revelan intención (test de embarazo, anticoncepción, relaciones), además de las notas siempre cifradas.", "discreet": "Notificaciones discretas", "discreetDescription": "Oculta los detalles del ciclo en el texto de las notificaciones de tu pantalla de bloqueo.", - "dataTitle": "Tus datos", - "dataDescription": "Tus datos del ciclo viven solo en este servidor. Expórtalos cuando quieras o elimínalos para siempre.", - "export": "Exportar mis datos del ciclo", - "deleteData": "Eliminar mis datos del ciclo", "saved": "Ajustes guardados", "saveError": "No se pudo guardar. Inténtalo de nuevo.", "save": "Guardar", - "purgeTitle": "Eliminar todos los datos del ciclo", - "purgeDescription": "Elimina de forma permanente cada día registrado, ciclo, predicción y registro de recordatorio. No se puede deshacer.", - "purgeButton": "Eliminar todos los datos del ciclo", - "purgeConfirmTitle": "¿Eliminar todos los datos del ciclo?", - "purgeConfirmBody": "Esto elimina de forma permanente todos los periodos, registros diarios, síntomas y predicciones. No se puede deshacer.", - "purgeConfirm": "¿Eliminar permanentemente todos los datos del ciclo?", - "purgeCancel": "Cancelar", - "purgeSuccess": "Todos los datos del ciclo eliminados.", - "purgeError": "No se pudieron eliminar los datos del ciclo.", "reminders": "Recordatorios", "remindersDescription": "Activa los recordatorios de período por canal en los ajustes de notificaciones.", "remindersLink": "Ajustes de notificaciones", "fertileReminder": "Recordatorio de ventana fértil", - "fertileReminderDescription": "Recibe un aviso unos días antes de tu ventana fértil estimada. Desactivado por defecto: actívalo por canal en los ajustes de notificaciones.", - "purgeData": "Eliminar datos del ciclo", - "purgeConfirmAction": "Sí, eliminar todo", - "purgeDone": "Datos del ciclo eliminados." + "fertileReminderDescription": "Recibe un aviso unos días antes de tu ventana fértil estimada. Desactivado por defecto: actívalo por canal en los ajustes de notificaciones." }, "testResult": { "POSITIVE": "Positivo", @@ -6502,7 +6336,6 @@ "emptyDescription": "Registra analíticas como HbA1c, LDL o ferritina para seguirlas a lo largo del tiempo y compartirlas con tu médico.", "referenceLabel": "Referencia", "readingsCount": "{count} mediciones", - "deleteLatest": "Eliminar el último valor", "deleteConfirmTitle": "¿Eliminar resultado de laboratorio?", "deleteConfirmDescription": "Este resultado de laboratorio se eliminará de forma permanente.", "deletedToast": "Resultado eliminado", @@ -6514,24 +6347,11 @@ "above": "Por encima" }, "form": { - "analyte": "Biomarcador", - "analytePlaceholder": "p. ej. HbA1c, LDL, Ferritina", "value": "Valor", - "unit": "Unidad", - "unitPlaceholder": "p. ej. mg/dL, %, ng/mL", "takenAt": "Fecha de la muestra", - "optionalGroup": "Opcional", - "panel": "Panel", - "panelPlaceholder": "p. ej. Hemograma completo", - "referenceLow": "Referencia mínima", - "referenceHigh": "Referencia máxima", - "referenceLowPlaceholder": "Límite inferior", - "referenceHighPlaceholder": "Límite superior", - "referenceHint": "Copia el rango de referencia de tu informe de laboratorio. Cualquiera de los límites es opcional.", "note": "Nota", "notePlaceholder": "Contexto opcional para este resultado", "requiredError": "Introduce un valor.", - "rangeOrderError": "La referencia mínima no puede superar la máxima.", "save": "Guardar", "savedToast": "Resultado guardado", "saveError": "No se pudo guardar el resultado", @@ -6824,7 +6644,6 @@ "countOther": "Registraste {count} episodios en este período.", "typicalGap": "Brecha de recuperación típica: {days} días entre sentirte mejor y la estabilización de tus valores.", "typicalGapLearning": "Con unos pocos episodios resueltos más aparecerá aquí una brecha de recuperación típica.", - "byMonth": "Cuándo sueles registrar episodios", "none": "Sin episodios registrados en este período." }, "section": { diff --git a/messages/fr.json b/messages/fr.json index ea1705a4a..e278cc028 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -18,7 +18,6 @@ "optional": "Facultatif", "active": "Actif", "inactive": "Inactif", - "enabled": "Activé", "disabled": "Désactivé", "networkError": "Erreur réseau", "unknownError": "Erreur inconnue", @@ -74,7 +73,6 @@ "colTaken": "Pris", "colSkipped": "Sauté", "colMissed": "Manqué", - "colTotal": "Total", "colExpected": "Attendues", "colComplianceRate": "Taux d'observance", "moodTitle": "Évolution de l’humeur", @@ -202,14 +200,12 @@ "measurements": "Mesures", "medications": "Médicaments", "insights": "Insights", - "targets": "Objectifs", "achievements": "Succès", "settings": "Paramètres", "bugreport": "Rapport de bug", "admin": "Console d’administration", "logout": "Se déconnecter", "login": "Se connecter", - "about": "À propos de HealthLog", "notifications": "Notifications", "theme": "Apparence", "themeSystem": "Système", @@ -219,13 +215,11 @@ "userMenu": "Menu utilisateur", "accountSettings": "Paramètres du compte", "mood": "Humeur", - "workouts": "Entraînements", "coach": "Coach", "skipToContent": "Aller au contenu", "sidebar": "Barre latérale", "mainNavigation": "Navigation principale", "mobileNavigation": "Navigation mobile", - "breadcrumb": "Fil d'Ariane", "loadingScreen": "Chargement…", "more": "Plus", "moreSheetTitle": "Plus", @@ -242,7 +236,6 @@ }, "cycle": "Cycle", "labs": "Analyses", - "recovery": "Récupération", "vorsorge": "Prévention", "illness": "Maladie" }, @@ -330,7 +323,6 @@ "sleepShort": "Sommeil", "stepsShort": "Pas", "vo2MaxShort": "VO₂ max", - "bpInTargetShort": "TA-cible", "bpInTargetWindow90": "TA-cible · 90 j", "bpInTargetWindowDynamic": "TA-cible · {days} j", "bpInTargetCollecting": "collecte de données", @@ -384,7 +376,6 @@ "staleHintWeeksOther": "Dernière valeur il y a {count} semaines", "staleHintMonthsOne": "Dernière valeur il y a 1 mois", "staleHintMonthsOther": "Dernière valeur il y a {count} mois", - "coachCta": "Demande au coach", "recentWorkouts": { "title": "Entraînements récents", "viewAll": "Tout voir", @@ -499,7 +490,6 @@ "invalidTimestamp": "Choisis une date et une heure valides.", "loginRequired": "Connecte-toi pour voir tes mesures.", "allTypes": "Tous les types", - "filterByType": "Filtrer par type", "measurementCount": "{count} mesures", "emptyTitle": "Aucune mesure pour l’instant", "emptyDescription": "Saisis du poids, de la tension, du pouls ou d’autres valeurs pour repérer les tendances.", @@ -550,7 +540,6 @@ "typeCardioLoad": "Charge cardio", "typeSleepScore": "Score de sommeil", "typeBodyTemperatureDeviation": "Écart de température corporelle", - "filterBySource": "Filtrer par source", "sourceComputed": "Calculé", "sourceWhoop": "WHOOP", "sourceFitbit": "Fitbit", @@ -670,7 +659,6 @@ "factorSadness": "tristesse", "praise": "compliment" }, - "filterBySource": "Filtrer par source", "sourceManual": "Manuel", "sourceWeb": "Web", "sourceTelegram": "Telegram", @@ -741,8 +729,6 @@ "subtitle": "Médication, horaires et prises", "loginRequired": "Connecte-toi pour gérer tes médicaments.", "addMedication": "Ajouter", - "editMedication": "Modifier le médicament", - "newMedication": "Nouveau médicament", "firstMedication": "Ajouter le premier médicament", "addChoice": { "logIntake": "Enregistrer une prise", @@ -778,16 +764,9 @@ "loadFailed": "Impossible de charger les médicaments", "retryLoad": "Réessayer", "name": "Nom", - "dose": "Dose", - "scheduleFrom": "De", - "scheduleTo": "À", - "scheduleLabel": "Libellé", - "scheduleDays": "Jours", - "scheduleDaily": "Quotidien", "inactive": "En pause", "intakeHistory": "Historique des prises", "openDetailPage": "Ouvrir la page de détail du médicament", - "deleteConfirm": "Supprimer le médicament ?", "compliance": "Observance", "importIntakes": "Importer les prises", "importDescription": "Collez un tableau JSON contenant les données de prises. Format attendu :", @@ -802,19 +781,7 @@ "importInvalidSkipped": "{count} entrées non valides ignorées", "importFailed": "Échec de l’importation", "importInvalidFormat": "Format JSON non valide", - "apiEndpointTitle": "Point de terminaison API : {name}", - "apiEndpointDescription": "Utilisez ce point de terminaison pour enregistrer des prises via l’API (par exemple un Raccourci iPhone ou une tâche cron).", - "apiEndpointActive": "Point de terminaison API actif", - "apiEndpointActivated": "Point de terminaison API activé", - "apiEndpointDeactivated": "Point de terminaison API désactivé", - "apiTokenCount": "Actif ({count} jetons)", - "apiToken": "Jeton API", - "apiTokenActiveHint": "Le point de terminaison est actif. Les jetons existants restent valides mais ne peuvent plus être affichés en texte clair.", - "apiTokenActivateHint": "Activez le point de terminaison pour créer un nouveau jeton.", - "apiTokenOnceHint": "Le jeton n’est affiché en texte clair qu’une seule fois, lors de sa création.", "requestExample": "Exemple de requête", - "statusLoadFailed": "Impossible de charger le statut", - "changeFailed": "Échec de la modification", "categoryBloodPressure": "Tension artérielle", "categoryVitamin": "Vitamines", "categoryThyroid": "Thyroïde", @@ -847,21 +814,15 @@ "lastDoseDaysAgo": "Dernière dose il y a {count} jours", "overdue": "En retard", "veryOverdue": "Très en retard", - "compliance7d": "Observance 7 jours", - "compliance30d": "Observance 30 jours", "complianceWindow": "Observance {days} jours", "complianceUnavailable": "Impossible de charger l'observance", "complianceInfo": "Part des doses attendues que vous avez enregistrées. Les plans hebdomadaires comptent semaine par semaine.", "complianceInfoLabel": "Que signifie l'observance ?", - "complianceDoses": "{count} doses", "lastIntake": "Dernière prise :", "nextIntake": "Prochaine prise :", "nextIntakeOverdue": "En retard · {time} — encore rattrapable", "dayStreak": "jours de série", "dayStreakOne": "jour de série", - "cycleNextDoseToday": "Prochaine dose aujourd'hui", - "cycleNextDoseTomorrow": "Prochaine dose demain", - "cycleNextDoseInDays": "Prochaine dose dans {days} jours", "cycleDueToday": "À prendre aujourd'hui", "cycleOverdue": "En retard", "cycleNoClosedCycles": "Aucun cycle de dose terminé pour l'instant", @@ -873,40 +834,10 @@ "intakeUndo": "Annuler", "intakeUndone": "Entrée annulée", "intakeUndoFailed": "Annulation impossible — corrigez dans l'historique", - "weekdaySunday": "Dimanche", - "weekdayMonday": "Lundi", - "weekdayTuesday": "Mardi", - "weekdayWednesday": "Mercredi", - "weekdayThursday": "Jeudi", - "weekdayFriday": "Vendredi", - "weekdaySaturday": "Samedi", - "weekdaySundayPlural": "Dimanches", - "weekdayMondayPlural": "Lundis", - "weekdayTuesdayPlural": "Mardis", - "weekdayWednesdayPlural": "Mercredis", - "weekdayThursdayPlural": "Jeudis", - "weekdayFridayPlural": "Vendredis", - "weekdaySaturdayPlural": "Samedis", - "formType": "Type", - "formDose": "Dose", - "formUnit": "Unité", - "formSchedule": "Fenêtre horaire", - "formTreatmentClass": "Classe de traitement", - "formTreatmentClassHelp": "Choisis « Injection GLP-1 » pour les injections hebdomadaires comme Mounjaro, Ozempic, Wegovy, Zepbound. Active la carte corps et le journal GLP-1.", - "treatmentClassGeneric": "Médicament standard", - "treatmentClassGlp1": "Injection GLP-1", - "glp1WeeklyPresetTitle": "Une fois par semaine, le…", - "glp1WeeklyPresetHelp": "La plupart des agonistes du récepteur GLP-1 sont injectés une fois par semaine. Touche un jour pour fixer le rythme.", - "glp1WeeklyPresetSuggest": "Reprendre le dernier jour choisi", - "glp1DosesPerUnit": "Doses par stylo / flacon", - "glp1DosesPerUnitPlaceholder": "p. ex. 4 pour un stylo Mounjaro KwikPen", - "glp1DosesPerUnitHelp": "Optionnel — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy stylo à usage unique = 1. Laisse vide si tu ne veux pas suivre la dose par stylo.", "glp1LastInjection": "{label}", - "glp1LastInjectionWithSite": "{label} · {site}", "glp1NextInjectionDays": "{label} (dans {days} jours)", "glp1NextInjectionToday": "aujourd’hui", "glp1NextInjectionTomorrow": "demain", - "glp1RotationLast": "Dernier site : {site}", "glp1RotationSuggested": "Conseillé : {site}", "glp1LogSideEffect": "Consigner un effet secondaire", "sideEffects": { @@ -1261,8 +1192,7 @@ "add": "Ajouter un autre horaire", "edit": "Modifier", "remove": "Retirer", - "removeDisabled": "Au moins un horaire est requis.", - "empty": "Pas encore d’horaire." + "removeDisabled": "Au moins un horaire est requis." } }, "errors": { @@ -1306,38 +1236,6 @@ "sideEffectTagAppetiteLoss": "Perte d’appétit", "sideEffectTagHeartburn": "Brûlures d’estomac", "sideEffectTagHeadache": "Maux de tête", - "newSchedule": "Nouvelle fenêtre horaire", - "removeSchedule": "Supprimer la fenêtre", - "advancedEditing": "Édition avancée", - "advancedEditingHide": "Masquer l’édition avancée", - "scheduleInterval": "Intervalle", - "scheduleEveryWeek": "chaque semaine", - "scheduleEveryNWeeks": "toutes les {n} semaines", - "scheduleIntervalPrefix": "Intervalle :", - "nextSchedulePrefix": "Prochaine fenêtre :", - "nextScheduleDaily": "quotidien", - "importIntakesAction": "Importer des prises", - "apiEndpointAction": "Endpoint API", - "pause": "Mettre en pause", - "activate": "Activer", - "disableNotifications": "Désactiver les notifications", - "enableNotifications": "Activer les notifications", - "purgeRecords": "Purger les enregistrements", - "formReset": "Réinitialiser le formulaire", - "createMedication": "Créer le médicament", - "deleteConfirmDescription": "Ce médicament et toutes ses prises seront supprimés définitivement.", - "purgeConfirmTitle": "Supprimer toutes les prises ?", - "purgeConfirmDescription": "Toutes les prises enregistrées pour ce médicament seront supprimées définitivement.", - "saveError": "Erreur lors de l’enregistrement", - "deleteError": "Erreur lors de la suppression", - "purgeError": "Erreur lors de la purge", - "invalidTimestamp": "Choisis une date et une heure valides.", - "noIntakesYet": "Aucune prise enregistrée pour l’instant.", - "actions": "Actions", - "pageInfo": "Page {page} sur {total}", - "previousPage": "Page précédente", - "nextPage": "Page suivante", - "loginRequiredIntakes": "Connecte-toi pour voir l’historique des prises.", "phaseConfig": "Phases de rappel", "phaseConfigDescription": "Configure les moments des rappels.", "phaseGreen": "Vert", @@ -1346,11 +1244,8 @@ "phaseRed": "Rouge", "phaseMinutes": "Min", "phasePercent": "%", - "phaseBeforeEnd": "avant la fin", - "phaseAfterEnd": "après la fin", "phaseResetDefaults": "Rétablir les valeurs par défaut", "phaseSaved": "Phases de rappel enregistrées", - "phaseReset": "Réinitialisées par défaut", "sourceWeb": "Web", "sourceApi": "App iOS", "sourceReminder": "Rappel", @@ -1370,16 +1265,6 @@ "intakeHistoryPageInfo": "Page {page} sur {total} · {count} entrées", "intakeHistoryPrev": "Précédent", "intakeHistoryNext": "Suivant", - "unitDrops": "gouttes", - "unitTablets": "comprimés", - "unitCapsules": "gélules", - "unitPieces": "pièces", - "namePlaceholder": "p. ex. Ramipril", - "dosePlaceholder": "p. ex. 5 mg", - "labelPlaceholder": "p. ex. Le matin", - "defaultDose": "Dose standard", - "dayDeactivate": "Désactiver {day}", - "dayActivate": "Activer {day}", "glp1": { "drug": { "tirzepatide": { @@ -1636,8 +1521,6 @@ "historyLabel": "Voir l'historique des prises" }, "history": { - "back": "Retour au médicament", - "subtitle": "Historique complet des prises", "plannedSuffix": "prévu" }, "tabs": { @@ -3609,8 +3492,6 @@ }, "thresholds": { "defaultLabel": "Par défaut", - "autoModeLabel": "Auto", - "overrideModeLabel": "Personnalisé", "overrideToggleLabel": "Valeurs personnelles", "resetAction": "Restaurer la valeur par défaut", "resetAllAction": "Tout restaurer aux valeurs par défaut", @@ -4965,7 +4846,6 @@ "modules": { "title": "Disponibilité des modules", "description": "Désactivez un module pour tout le serveur. Un module désactivé ici est coupé pour chaque compte, quelle que soit la préférence personnelle. Les domaines essentiels (poids, tension, pouls, médicaments) restent toujours actifs et ne peuvent pas être désactivés.", - "disabledHint": "Désactivé sur tout le serveur", "saveError": "Impossible de mettre à jour la disponibilité des modules." }, "bugReportRepo": "Dépôt", @@ -5343,12 +5223,10 @@ "subtitle": "Opérations destructrices à l'échelle du système." }, "about": { - "title": "À propos", - "subtitle": "Version, licence, code source et vérification des mises à jour." + "title": "À propos" } }, "carrier": "Opérateur", - "carrierUnknown": "Opérateur inconnu", "carrierUnavailableGeoFallback": "{location} — opérateur indisponible" }, "achievements": { @@ -5680,7 +5558,6 @@ "title": "Notifications", "breadcrumbInbox": "Notifications", "breadcrumbChannels": "Canaux de notification", - "breadcrumbSettings": "Paramètres", "eventColumn": "Événement", "subtitle": "Choisis quelles notifications tu reçois et par quel canal.", "loadError": "Impossible de charger les paramètres de notification.", @@ -5797,7 +5674,6 @@ "dotNearRange": "proche de la plage", "dotOutOfRange": "hors plage", "dotNotLogged": "non saisi", - "insufficientData": "Pas encore assez de données — continue à saisir.", "relativeDay": { "today": "Aujourd'hui", "yesterday": "Hier", @@ -5809,7 +5685,6 @@ } }, "edit": { - "openLabel": "Modifier la plage cible de {metric}", "title": "Modifier la plage cible — {metric}", "description": "Ajuste la plage cible utilisée dans les graphiques, les insights et le rapport médical. Valeurs en {unit}.", "derivedHint": "Cette carte est dérivée d’autres métriques. Modifie plutôt les objectifs sous-jacents (p. ex. tension ou poids).", @@ -5825,13 +5700,6 @@ "saveError": "Impossible d’enregistrer la plage cible", "resetSuccess": "Plage cible réinitialisée" }, - "mood": { - "stability": { - "stable": "stable", - "variable": "variable", - "highlyVariable": "très variable" - } - }, "currentValue": "Actuel : {value} {unit}", "targetRangeValue": "Plage cible : {min}–{max} {unit}", "sourceLabel": "Source : {source}", @@ -5937,7 +5805,6 @@ }, "lowStockReminders": { "title": "Stock faible : {medName}", - "body": "{medName} : {units} unités restantes — environ {days} jours de réserve.", "bodyToday": "{medName} : {units} unités restantes — moins d’un jour de réserve.", "bodyReorder": "{medName} : {units} unités restantes. Le stock sera épuisé vers le {runsOutOn} — recommandez avant le {reorderBy}.", "bodyLastDose": "{medName} : {units} unités restantes — environ votre dernière dose. Le stock sera épuisé vers le {runsOutOn}." @@ -6045,7 +5912,6 @@ "description": "Comment chaque mesure se compare entre tes phases lutéale et folliculaire, sur tes propres données.", "pairLabel": "{metric} · lutéale vs folliculaire", "detail": "Lutéale {lutealAvg} {unit} ({lutealDays} jours) vs folliculaire {follicularAvg} {unit} ({follicularDays} jours).", - "footer": "Ce sont des associations dans tes propres données, pas des causes. Seuls les schémas qui passent un test de significativité sont affichés.", "metricRestingHeartRate": "Fréquence cardiaque au repos", "metricHrv": "Variabilité de la fréquence cardiaque", "metricSleepDuration": "Durée du sommeil", @@ -6069,10 +5935,6 @@ "confidenceHigh": "Confiance élevée" }, "title": "Analyses du cycle", - "empty": "Les analyses par phase apparaissent ici une fois assez de cycles enregistrés. Elles comparent tes mesures entre les phases du cycle, avec les statistiques affichées ouvertement.", - "sampleSize": "n = {n}", - "effectSize": "Taille d'effet {value}", - "qValue": "q = {value}", "symptomPatternsTitle": "Tendances des symptômes par phase", "symptomPatternsEmpty": "Notez vos symptômes sur un cycle pour voir dans quelle phase ils se regroupent.", "symptomMostlyIn": "Surtout en {phase} ({count}/{total} jours)" @@ -6092,7 +5954,6 @@ "LUTEAL": "La progestérone mène la seconde moitié et la température basale se stabilise en général un peu plus haut qu'au début du cycle. Certaines personnes remarquent des variations du sommeil, de l'appétit, de l'humeur ou de l'énergie au fil des jours, tandis que d'autres se sentent stables tout du long. Le schéma est personnel, et il se présente souvent différemment d'un mois à l'autre." }, "commonHere": "Tu le remarques souvent ici", - "trackNudge": "Noter aujourd'hui", "stillLearning": "On apprend encore ton cycle. Continue à noter et cela se remplira avec les tendances de tes propres journées." }, "insightsSummary": { @@ -6185,10 +6046,7 @@ "prevMonth": "Mois précédent", "nextMonth": "Mois suivant", "loading": "Chargement de ton calendrier…", - "empty": "Commence à enregistrer pour remplir ton calendrier.", "learning": "Nous apprenons ton cycle — enregistre au moins trois cycles complets et la fenêtre fertile, l'ovulation et les phases se compléteront. D'ici là, le calendrier n'affiche que ce que tu as enregistré.", - "today": "Aujourd'hui", - "dayAria": "{date}", "legendSymptom": "Symptômes", "legendOvulationConfirmed": "Ovulation confirmée", "flowSpotting": "spotting", @@ -6199,11 +6057,9 @@ "predictions": { "title": "Ce qui arrive ensuite", "nextPeriod": "Prochaines règles", - "nextPeriodRange": "Vers le {date}", "nextPeriodWindow": "{low} – {high}", "fertileWindow": "Fenêtre fertile", "ovulation": "Ovulation estimée", - "confidence": "Confiance", "confidenceHigh": "Élevée", "confidenceMedium": "Moyenne", "confidenceLow": "Faible", @@ -6239,7 +6095,6 @@ "sheet": { "title": "Enregistrer ta journée", "description": "Saisis le flux, les symptômes et les notes du jour.", - "date": "Date", "flow": "Flux", "symptoms": "Symptômes", "temperature": "Température basale", @@ -6259,10 +6114,7 @@ "save": "Enregistrer", "saving": "Enregistrement…", "cancel": "Annuler", - "saved": "Journée enregistrée", "saveError": "Enregistrement impossible. Réessaie.", - "periodStarted": "Début des règles enregistré", - "clear": "Aucun", "intermenstrualBleeding": "Saignements entre les règles", "pregnancyTest": "Test de grossesse", "progesteroneTest": "Test de progestérone", @@ -6278,8 +6130,6 @@ }, "settings": { "title": "Réglages du cycle", - "enable": "Suivi du cycle", - "enableDescription": "Active ou désactive l'onglet cycle pour ton compte.", "typicalCycleLength": "Durée typique du cycle (jours)", "typicalPeriodLength": "Durée typique des règles (jours)", "lutealPhaseLength": "Durée de la phase lutéale (jours)", @@ -6298,30 +6148,14 @@ "encryptionDescription": "Chiffre au repos les champs révélant l'intention (tests de grossesse, contraception, rapports), en plus des notes toujours chiffrées.", "discreet": "Notifications discrètes", "discreetDescription": "Masque les détails du cycle dans le texte des notifications sur ton écran verrouillé.", - "dataTitle": "Tes données", - "dataDescription": "Tes données de cycle ne vivent que sur ce serveur. Exporte-les quand tu veux, ou supprime-les définitivement.", - "export": "Exporter mes données de cycle", - "deleteData": "Supprimer mes données de cycle", "saved": "Réglages enregistrés", "saveError": "Enregistrement impossible. Réessaie.", "save": "Enregistrer", - "purgeTitle": "Supprimer toutes les données de cycle", - "purgeDescription": "Supprime définitivement chaque jour enregistré, cycle, prédiction et rappel. Action irréversible.", - "purgeButton": "Supprimer toutes les données de cycle", - "purgeConfirmTitle": "Supprimer toutes les données de cycle ?", - "purgeConfirmBody": "Cela supprime définitivement chaque règle, journal quotidien, symptôme et prédiction. Cette action est irréversible.", - "purgeConfirm": "Supprimer définitivement toutes les données de cycle ?", - "purgeCancel": "Annuler", - "purgeSuccess": "Toutes les données de cycle ont été supprimées.", - "purgeError": "Impossible de supprimer les données de cycle.", "reminders": "Rappels", "remindersDescription": "Activez les rappels de règles par canal dans les paramètres de notification.", "remindersLink": "Paramètres de notification", "fertileReminder": "Rappel de fenêtre fertile", - "fertileReminderDescription": "Recevez un avertissement quelques jours avant votre fenêtre fertile estimée. Désactivé par défaut : activez-le par canal dans les paramètres de notification.", - "purgeData": "Supprimer les données de cycle", - "purgeConfirmAction": "Oui, tout supprimer", - "purgeDone": "Données de cycle supprimées." + "fertileReminderDescription": "Recevez un avertissement quelques jours avant votre fenêtre fertile estimée. Désactivé par défaut : activez-le par canal dans les paramètres de notification." }, "testResult": { "POSITIVE": "Positif", @@ -6502,7 +6336,6 @@ "emptyDescription": "Enregistrez des analyses comme l'HbA1c, le LDL ou la ferritine pour les suivre dans le temps et les partager avec votre médecin.", "referenceLabel": "Référence", "readingsCount": "{count} mesures", - "deleteLatest": "Supprimer la dernière valeur", "deleteConfirmTitle": "Supprimer le résultat d'analyse ?", "deleteConfirmDescription": "Ce résultat d'analyse sera définitivement supprimé.", "deletedToast": "Résultat supprimé", @@ -6514,24 +6347,11 @@ "above": "Au-dessus de la norme" }, "form": { - "analyte": "Biomarqueur", - "analytePlaceholder": "ex. HbA1c, LDL, Ferritine", "value": "Valeur", - "unit": "Unité", - "unitPlaceholder": "ex. mg/dL, %, ng/mL", "takenAt": "Date du prélèvement", - "optionalGroup": "Facultatif", - "panel": "Panel", - "panelPlaceholder": "ex. Numération formule sanguine", - "referenceLow": "Référence basse", - "referenceHigh": "Référence haute", - "referenceLowPlaceholder": "Borne inférieure", - "referenceHighPlaceholder": "Borne supérieure", - "referenceHint": "Reprenez l'intervalle de référence de votre compte rendu. Chaque borne est facultative.", "note": "Note", "notePlaceholder": "Contexte facultatif pour ce résultat", "requiredError": "Saisissez une valeur.", - "rangeOrderError": "La référence basse ne doit pas dépasser la référence haute.", "save": "Enregistrer", "savedToast": "Résultat enregistré", "saveError": "Impossible d'enregistrer le résultat", @@ -6824,7 +6644,6 @@ "countOther": "Tu as enregistré {count} épisodes sur cette période.", "typicalGap": "Écart de récupération typique : {days} jours entre le mieux-être et la stabilisation de tes valeurs.", "typicalGapLearning": "Encore quelques épisodes résolus et un écart de récupération typique apparaîtra ici.", - "byMonth": "Quand tu enregistres des épisodes", "none": "Aucun épisode enregistré sur cette période." }, "section": { diff --git a/messages/it.json b/messages/it.json index 3aef973cb..e5fb79eb1 100644 --- a/messages/it.json +++ b/messages/it.json @@ -18,7 +18,6 @@ "optional": "Opzionale", "active": "Attivo", "inactive": "Inattivo", - "enabled": "Abilitato", "disabled": "Disabilitato", "networkError": "Errore di rete", "unknownError": "Errore sconosciuto", @@ -74,7 +73,6 @@ "colTaken": "Assunta", "colSkipped": "Saltata", "colMissed": "Persa", - "colTotal": "Totale", "colExpected": "Attese", "colComplianceRate": "Tasso di aderenza", "moodTitle": "Andamento dell’umore", @@ -202,14 +200,12 @@ "measurements": "Misurazioni", "medications": "Farmaci", "insights": "Insights", - "targets": "Obiettivi", "achievements": "Traguardi", "settings": "Impostazioni", "bugreport": "Segnalazione bug", "admin": "Console di amministrazione", "logout": "Esci", "login": "Accedi", - "about": "Informazioni su HealthLog", "notifications": "Notifiche", "theme": "Aspetto", "themeSystem": "Sistema", @@ -219,13 +215,11 @@ "userMenu": "Menu utente", "accountSettings": "Impostazioni account", "mood": "Umore", - "workouts": "Allenamenti", "coach": "Coach", "skipToContent": "Vai al contenuto", "sidebar": "Barra laterale", "mainNavigation": "Navigazione principale", "mobileNavigation": "Navigazione mobile", - "breadcrumb": "Navigazione breadcrumb", "loadingScreen": "Caricamento…", "more": "Altro", "moreSheetTitle": "Altro", @@ -242,7 +236,6 @@ }, "cycle": "Ciclo", "labs": "Esami", - "recovery": "Recupero", "vorsorge": "Prevenzione", "illness": "Malattia" }, @@ -330,7 +323,6 @@ "sleepShort": "Sonno", "stepsShort": "Passi", "vo2MaxShort": "VO₂ max", - "bpInTargetShort": "PA-target", "bpInTargetWindow90": "PA-target · 90 gg", "bpInTargetWindowDynamic": "PA-target · {days} gg", "bpInTargetCollecting": "raccolta dati in corso", @@ -384,7 +376,6 @@ "staleHintWeeksOther": "Ultimo valore {count} settimane fa", "staleHintMonthsOne": "Ultimo valore 1 mese fa", "staleHintMonthsOther": "Ultimo valore {count} mesi fa", - "coachCta": "Chiedi al coach", "recentWorkouts": { "title": "Allenamenti recenti", "viewAll": "Vedi tutti", @@ -499,7 +490,6 @@ "invalidTimestamp": "Scegli una data e un’ora valide.", "loginRequired": "Accedi per vedere le misurazioni.", "allTypes": "Tutti i tipi", - "filterByType": "Filtra per tipo", "measurementCount": "{count} misurazioni", "emptyTitle": "Ancora nessuna misurazione", "emptyDescription": "Registra peso, pressione, pulsazioni o altri valori per individuare i trend.", @@ -550,7 +540,6 @@ "typeCardioLoad": "Carico cardio", "typeSleepScore": "Punteggio del sonno", "typeBodyTemperatureDeviation": "Deviazione della temperatura corporea", - "filterBySource": "Filtra per fonte", "sourceComputed": "Calcolato", "sourceWhoop": "WHOOP", "sourceFitbit": "Fitbit", @@ -670,7 +659,6 @@ "factorSadness": "tristezza", "praise": "elogio" }, - "filterBySource": "Filtra per fonte", "sourceManual": "Manuale", "sourceWeb": "Web", "sourceTelegram": "Telegram", @@ -741,8 +729,6 @@ "subtitle": "Farmaci, orari e assunzioni", "loginRequired": "Accedi per gestire i farmaci.", "addMedication": "Aggiungi", - "editMedication": "Modifica farmaco", - "newMedication": "Nuovo farmaco", "firstMedication": "Aggiungi il primo farmaco", "addChoice": { "logIntake": "Registra un'assunzione", @@ -778,16 +764,9 @@ "loadFailed": "Impossibile caricare i farmaci", "retryLoad": "Riprova", "name": "Nome", - "dose": "Dose", - "scheduleFrom": "Da", - "scheduleTo": "A", - "scheduleLabel": "Etichetta", - "scheduleDays": "Giorni", - "scheduleDaily": "Quotidiano", "inactive": "In pausa", "intakeHistory": "Cronologia assunzioni", "openDetailPage": "Apri la pagina di dettaglio del farmaco", - "deleteConfirm": "Eliminare il farmaco?", "compliance": "Aderenza", "importIntakes": "Importa assunzioni", "importDescription": "Incolla un array JSON con i dati delle assunzioni. Formato previsto:", @@ -802,19 +781,7 @@ "importInvalidSkipped": "{count} voci non valide ignorate", "importFailed": "Importazione non riuscita", "importInvalidFormat": "Formato JSON non valido", - "apiEndpointTitle": "Endpoint API: {name}", - "apiEndpointDescription": "Usa questo endpoint per registrare assunzioni tramite API (ad es. con un Comando rapido iPhone o un cron job).", - "apiEndpointActive": "Endpoint API attivo", - "apiEndpointActivated": "Endpoint API attivato", - "apiEndpointDeactivated": "Endpoint API disattivato", - "apiTokenCount": "Attivo ({count} token)", - "apiToken": "Token API", - "apiTokenActiveHint": "L’endpoint è attivo. I token esistenti restano validi ma non possono essere mostrati di nuovo in chiaro.", - "apiTokenActivateHint": "Attiva l’endpoint per creare un nuovo token.", - "apiTokenOnceHint": "Il token viene mostrato in chiaro solo una volta, alla creazione.", "requestExample": "Esempio di richiesta", - "statusLoadFailed": "Impossibile caricare lo stato", - "changeFailed": "Modifica non riuscita", "categoryBloodPressure": "Pressione arteriosa", "categoryVitamin": "Vitamine", "categoryThyroid": "Tiroide", @@ -847,21 +814,15 @@ "lastDoseDaysAgo": "Ultima dose {count} giorni fa", "overdue": "In ritardo", "veryOverdue": "Molto in ritardo", - "compliance7d": "Aderenza 7 giorni", - "compliance30d": "Aderenza 30 giorni", "complianceWindow": "Aderenza {days} giorni", "complianceUnavailable": "Impossibile caricare l'aderenza", "complianceInfo": "Quota delle dosi attese che hai registrato. I piani settimanali contano settimana per settimana.", "complianceInfoLabel": "Cosa significa aderenza?", - "complianceDoses": "{count} dosi", "lastIntake": "Ultima assunzione:", "nextIntake": "Prossima assunzione:", "nextIntakeOverdue": "In ritardo · {time} — ancora recuperabile", "dayStreak": "giorni di serie", "dayStreakOne": "giorno di serie", - "cycleNextDoseToday": "Prossima dose oggi", - "cycleNextDoseTomorrow": "Prossima dose domani", - "cycleNextDoseInDays": "Prossima dose tra {days} giorni", "cycleDueToday": "In scadenza oggi", "cycleOverdue": "In ritardo", "cycleNoClosedCycles": "Ancora nessun ciclo di dose completato", @@ -873,40 +834,10 @@ "intakeUndo": "Annulla", "intakeUndone": "Voce annullata", "intakeUndoFailed": "Impossibile annullare; correggi nella cronologia", - "weekdaySunday": "Domenica", - "weekdayMonday": "Lunedì", - "weekdayTuesday": "Martedì", - "weekdayWednesday": "Mercoledì", - "weekdayThursday": "Giovedì", - "weekdayFriday": "Venerdì", - "weekdaySaturday": "Sabato", - "weekdaySundayPlural": "Domeniche", - "weekdayMondayPlural": "Lunedì", - "weekdayTuesdayPlural": "Martedì", - "weekdayWednesdayPlural": "Mercoledì", - "weekdayThursdayPlural": "Giovedì", - "weekdayFridayPlural": "Venerdì", - "weekdaySaturdayPlural": "Sabati", - "formType": "Tipo", - "formDose": "Dose", - "formUnit": "Unità", - "formSchedule": "Fascia oraria", - "formTreatmentClass": "Classe di trattamento", - "formTreatmentClassHelp": "Scegli \"Iniezione GLP-1\" per iniezioni settimanali come Mounjaro, Ozempic, Wegovy, Zepbound. Attiva la card del corpo e il diario GLP-1.", - "treatmentClassGeneric": "Farmaco standard", - "treatmentClassGlp1": "Iniezione GLP-1", - "glp1WeeklyPresetTitle": "Una volta a settimana, di…", - "glp1WeeklyPresetHelp": "La maggior parte degli agonisti del recettore GLP-1 viene iniettata una volta a settimana. Tocca un giorno per impostare il ritmo.", - "glp1WeeklyPresetSuggest": "Riprendi l’ultimo giorno scelto", - "glp1DosesPerUnit": "Dosi per penna / fiala", - "glp1DosesPerUnitPlaceholder": "es. 4 per una penna Mounjaro KwikPen", - "glp1DosesPerUnitHelp": "Opzionale — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy penna monouso = 1. Lascia vuoto se non vuoi monitorare le dosi per penna.", "glp1LastInjection": "{label}", - "glp1LastInjectionWithSite": "{label} · {site}", "glp1NextInjectionDays": "{label} (tra {days} giorni)", "glp1NextInjectionToday": "oggi", "glp1NextInjectionTomorrow": "domani", - "glp1RotationLast": "Ultima sede: {site}", "glp1RotationSuggested": "Suggerita: {site}", "glp1LogSideEffect": "Registra effetto collaterale", "sideEffects": { @@ -1261,8 +1192,7 @@ "add": "Aggiungi un altro programma", "edit": "Modifica", "remove": "Rimuovi", - "removeDisabled": "È richiesto almeno un programma.", - "empty": "Ancora nessun programma." + "removeDisabled": "È richiesto almeno un programma." } }, "errors": { @@ -1306,38 +1236,6 @@ "sideEffectTagAppetiteLoss": "Perdita di appetito", "sideEffectTagHeartburn": "Bruciore di stomaco", "sideEffectTagHeadache": "Mal di testa", - "newSchedule": "Nuova fascia oraria", - "removeSchedule": "Rimuovi fascia oraria", - "advancedEditing": "Modifica avanzata", - "advancedEditingHide": "Nascondi modifica avanzata", - "scheduleInterval": "Intervallo", - "scheduleEveryWeek": "ogni settimana", - "scheduleEveryNWeeks": "ogni {n} settimane", - "scheduleIntervalPrefix": "Intervallo:", - "nextSchedulePrefix": "Prossima fascia:", - "nextScheduleDaily": "quotidiano", - "importIntakesAction": "Importa assunzioni", - "apiEndpointAction": "Endpoint API", - "pause": "Metti in pausa", - "activate": "Attiva", - "disableNotifications": "Disattiva le notifiche", - "enableNotifications": "Attiva le notifiche", - "purgeRecords": "Elimina i record", - "formReset": "Reimposta modulo", - "createMedication": "Crea farmaco", - "deleteConfirmDescription": "Questo farmaco e tutte le sue assunzioni saranno eliminati in modo definitivo.", - "purgeConfirmTitle": "Eliminare tutte le assunzioni?", - "purgeConfirmDescription": "Tutte le assunzioni registrate per questo farmaco saranno eliminate in modo definitivo.", - "saveError": "Errore durante il salvataggio", - "deleteError": "Errore durante l’eliminazione", - "purgeError": "Errore durante l’eliminazione dei record", - "invalidTimestamp": "Scegli una data e un’ora valide.", - "noIntakesYet": "Ancora nessuna assunzione registrata.", - "actions": "Azioni", - "pageInfo": "Pagina {page} di {total}", - "previousPage": "Pagina precedente", - "nextPage": "Pagina successiva", - "loginRequiredIntakes": "Accedi per vedere la cronologia delle assunzioni.", "phaseConfig": "Fasi di promemoria", "phaseConfigDescription": "Configura i momenti dei promemoria.", "phaseGreen": "Verde", @@ -1346,11 +1244,8 @@ "phaseRed": "Rosso", "phaseMinutes": "Min", "phasePercent": "%", - "phaseBeforeEnd": "prima della fine", - "phaseAfterEnd": "dopo la fine", "phaseResetDefaults": "Ripristina predefiniti", "phaseSaved": "Fasi di promemoria salvate", - "phaseReset": "Ripristinate ai valori predefiniti", "sourceWeb": "Web", "sourceApi": "App iOS", "sourceReminder": "Promemoria", @@ -1370,16 +1265,6 @@ "intakeHistoryPageInfo": "Pagina {page} di {total} · {count} voci", "intakeHistoryPrev": "Precedente", "intakeHistoryNext": "Successiva", - "unitDrops": "gocce", - "unitTablets": "compresse", - "unitCapsules": "capsule", - "unitPieces": "pezzi", - "namePlaceholder": "es. Ramipril", - "dosePlaceholder": "es. 5 mg", - "labelPlaceholder": "es. Al mattino", - "defaultDose": "Dose standard", - "dayDeactivate": "Disattiva {day}", - "dayActivate": "Attiva {day}", "glp1": { "drug": { "tirzepatide": { @@ -1636,8 +1521,6 @@ "historyLabel": "Visualizza cronologia assunzioni" }, "history": { - "back": "Torna al farmaco", - "subtitle": "Cronologia completa delle assunzioni", "plannedSuffix": "pianificato" }, "tabs": { @@ -3609,8 +3492,6 @@ }, "thresholds": { "defaultLabel": "Predefinito", - "autoModeLabel": "Auto", - "overrideModeLabel": "Personalizzato", "overrideToggleLabel": "Valori personali", "resetAction": "Ripristina predefinito", "resetAllAction": "Ripristina tutti ai predefiniti", @@ -4965,7 +4846,6 @@ "modules": { "title": "Disponibilità dei moduli", "description": "Disattiva un modulo per l'intero server. Un modulo disattivato qui è spento per ogni account, indipendentemente dalle preferenze personali. I domini principali (peso, pressione, polso, farmaci) sono sempre attivi e non possono essere disattivati.", - "disabledHint": "Disattivato a livello di server", "saveError": "Impossibile aggiornare la disponibilità dei moduli." }, "bugReportRepo": "Repository", @@ -5343,12 +5223,10 @@ "subtitle": "Operazioni distruttive a livello di sistema." }, "about": { - "title": "Informazioni", - "subtitle": "Versione, licenza, codice sorgente e verifica degli aggiornamenti." + "title": "Informazioni" } }, "carrier": "Operatore", - "carrierUnknown": "Operatore sconosciuto", "carrierUnavailableGeoFallback": "{location} — operatore non disponibile" }, "achievements": { @@ -5680,7 +5558,6 @@ "title": "Notifiche", "breadcrumbInbox": "Notifiche", "breadcrumbChannels": "Canali di notifica", - "breadcrumbSettings": "Impostazioni", "eventColumn": "Evento", "subtitle": "Scegli quali notifiche ricevere e su quale canale.", "loadError": "Impossibile caricare le impostazioni di notifica.", @@ -5797,7 +5674,6 @@ "dotNearRange": "vicino al range", "dotOutOfRange": "fuori range", "dotNotLogged": "non registrato", - "insufficientData": "Ancora pochi dati — continua a registrare.", "relativeDay": { "today": "Oggi", "yesterday": "Ieri", @@ -5809,7 +5685,6 @@ } }, "edit": { - "openLabel": "Modifica il range obiettivo per {metric}", "title": "Modifica range obiettivo — {metric}", "description": "Regola il range obiettivo usato in grafici, insights e referto medico. Valori in {unit}.", "derivedHint": "Questa card è derivata da altre metriche. Modifica gli obiettivi sottostanti (es. pressione o peso).", @@ -5825,13 +5700,6 @@ "saveError": "Impossibile salvare il range obiettivo", "resetSuccess": "Range obiettivo ripristinato" }, - "mood": { - "stability": { - "stable": "stabile", - "variable": "variabile", - "highlyVariable": "molto variabile" - } - }, "currentValue": "Attuale: {value} {unit}", "targetRangeValue": "Range obiettivo: {min}–{max} {unit}", "sourceLabel": "Fonte: {source}", @@ -5937,7 +5805,6 @@ }, "lowStockReminders": { "title": "Scorte in esaurimento: {medName}", - "body": "{medName}: {units} unità rimaste — bastano per circa {days} giorni.", "bodyToday": "{medName}: {units} unità rimaste — meno di un giorno di scorta.", "bodyReorder": "{medName}: {units} unità rimaste. Le scorte finiscono intorno al {runsOutOn} — riordina entro il {reorderBy}.", "bodyLastDose": "{medName}: {units} unità rimaste — circa la tua ultima dose. Le scorte finiscono intorno al {runsOutOn}." @@ -6045,7 +5912,6 @@ "description": "Come si confronta ogni misurazione tra la fase luteale e quella follicolare, sui tuoi dati.", "pairLabel": "{metric} · luteale vs follicolare", "detail": "Luteale {lutealAvg} {unit} ({lutealDays} giorni) vs follicolare {follicularAvg} {unit} ({follicularDays} giorni).", - "footer": "Sono associazioni nei tuoi dati, non cause. Vengono mostrati solo gli schemi che superano un test di significatività.", "metricRestingHeartRate": "Frequenza cardiaca a riposo", "metricHrv": "Variabilità della frequenza cardiaca", "metricSleepDuration": "Durata del sonno", @@ -6069,10 +5935,6 @@ "confidenceHigh": "Affidabilità alta" }, "title": "Analisi del ciclo", - "empty": "Le analisi per fase compaiono qui quando hai registrato abbastanza cicli. Confrontano le tue misure tra le fasi del ciclo, con la statistica mostrata apertamente.", - "sampleSize": "n = {n}", - "effectSize": "Dimensione dell'effetto {value}", - "qValue": "q = {value}", "symptomPatternsTitle": "Pattern dei sintomi per fase", "symptomPatternsEmpty": "Registra i sintomi durante un ciclo per vedere in quale fase si concentrano.", "symptomMostlyIn": "Soprattutto in {phase} ({count}/{total} giorni)" @@ -6092,7 +5954,6 @@ "LUTEAL": "Il progesterone guida la seconda metà e la temperatura basale di solito si assesta un po' più in alto rispetto all'inizio del ciclo. Alcune persone notano cambiamenti nel sonno, nell'appetito, nell'umore o nell'energia con il passare dei giorni, mentre altre si sentono stabili per tutto il tempo. Lo schema è personale e spesso appare diverso da un mese all'altro." }, "commonHere": "Questo lo noti spesso qui", - "trackNudge": "Registra oggi", "stillLearning": "Stiamo ancora imparando il tuo ciclo. Continua a registrare e questo si completerà con gli schemi delle tue giornate." }, "insightsSummary": { @@ -6185,10 +6046,7 @@ "prevMonth": "Mese precedente", "nextMonth": "Mese successivo", "loading": "Caricamento del calendario…", - "empty": "Inizia a registrare per riempire il calendario.", "learning": "Stiamo imparando il tuo ciclo: registra almeno tre cicli completi e si completeranno la finestra fertile, l'ovulazione e le fasi. Fino ad allora il calendario mostra solo ciò che hai registrato.", - "today": "Oggi", - "dayAria": "{date}", "legendSymptom": "Sintomi", "legendOvulationConfirmed": "Ovulazione confermata", "flowSpotting": "spotting", @@ -6199,11 +6057,9 @@ "predictions": { "title": "Cosa arriva dopo", "nextPeriod": "Prossimo ciclo", - "nextPeriodRange": "Intorno al {date}", "nextPeriodWindow": "{low} – {high}", "fertileWindow": "Finestra fertile", "ovulation": "Ovulazione stimata", - "confidence": "Affidabilità", "confidenceHigh": "Alta", "confidenceMedium": "Media", "confidenceLow": "Bassa", @@ -6239,7 +6095,6 @@ "sheet": { "title": "Registra la tua giornata", "description": "Annota flusso, sintomi e note di oggi.", - "date": "Data", "flow": "Flusso", "symptoms": "Sintomi", "temperature": "Temperatura basale", @@ -6259,10 +6114,7 @@ "save": "Salva", "saving": "Salvataggio…", "cancel": "Annulla", - "saved": "Giornata salvata", "saveError": "Impossibile salvare. Riprova.", - "periodStarted": "Inizio del ciclo registrato", - "clear": "Nessuno", "intermenstrualBleeding": "Spotting tra i cicli", "pregnancyTest": "Test di gravidanza", "progesteroneTest": "Test del progesterone", @@ -6278,8 +6130,6 @@ }, "settings": { "title": "Impostazioni del ciclo", - "enable": "Monitoraggio del ciclo", - "enableDescription": "Attiva o disattiva la scheda ciclo per il tuo account.", "typicalCycleLength": "Durata tipica del ciclo (giorni)", "typicalPeriodLength": "Durata tipica delle mestruazioni (giorni)", "lutealPhaseLength": "Durata della fase luteale (giorni)", @@ -6298,30 +6148,14 @@ "encryptionDescription": "Cifra a riposo i campi che rivelano l'intenzione (test di gravidanza, contraccezione, rapporti), oltre alle note sempre cifrate.", "discreet": "Notifiche discrete", "discreetDescription": "Nascondi i dettagli del ciclo nel testo delle notifiche sulla schermata di blocco.", - "dataTitle": "I tuoi dati", - "dataDescription": "I tuoi dati del ciclo vivono solo su questo server. Esportali quando vuoi, o eliminali per sempre.", - "export": "Esporta i miei dati del ciclo", - "deleteData": "Elimina i miei dati del ciclo", "saved": "Impostazioni salvate", "saveError": "Impossibile salvare. Riprova.", "save": "Salva", - "purgeTitle": "Elimina tutti i dati del ciclo", - "purgeDescription": "Rimuove definitivamente ogni giorno registrato, ciclo, previsione e promemoria. Operazione irreversibile.", - "purgeButton": "Elimina tutti i dati del ciclo", - "purgeConfirmTitle": "Eliminare tutti i dati del ciclo?", - "purgeConfirmBody": "Questo elimina definitivamente ogni mestruazione, registro giornaliero, sintomo e previsione. L'operazione è irreversibile.", - "purgeConfirm": "Eliminare definitivamente tutti i dati del ciclo?", - "purgeCancel": "Annulla", - "purgeSuccess": "Tutti i dati del ciclo eliminati.", - "purgeError": "Impossibile eliminare i dati del ciclo.", "reminders": "Promemoria", "remindersDescription": "Attiva i promemoria del ciclo per canale nelle impostazioni di notifica.", "remindersLink": "Impostazioni di notifica", "fertileReminder": "Promemoria finestra fertile", - "fertileReminderDescription": "Ricevi un avviso alcuni giorni prima della tua finestra fertile stimata. Disattivato per impostazione predefinita: attivalo per canale nelle impostazioni di notifica.", - "purgeData": "Elimina i dati del ciclo", - "purgeConfirmAction": "Sì, elimina tutto", - "purgeDone": "Dati del ciclo eliminati." + "fertileReminderDescription": "Ricevi un avviso alcuni giorni prima della tua finestra fertile stimata. Disattivato per impostazione predefinita: attivalo per canale nelle impostazioni di notifica." }, "testResult": { "POSITIVE": "Positivo", @@ -6502,7 +6336,6 @@ "emptyDescription": "Registra esami come HbA1c, LDL o ferritina per seguirli nel tempo e condividerli con il tuo medico.", "referenceLabel": "Riferimento", "readingsCount": "{count} misurazioni", - "deleteLatest": "Elimina l'ultimo valore", "deleteConfirmTitle": "Eliminare il risultato di laboratorio?", "deleteConfirmDescription": "Questo risultato di laboratorio verrà eliminato definitivamente.", "deletedToast": "Risultato eliminato", @@ -6514,24 +6347,11 @@ "above": "Sopra la norma" }, "form": { - "analyte": "Biomarcatore", - "analytePlaceholder": "es. HbA1c, LDL, Ferritina", "value": "Valore", - "unit": "Unità", - "unitPlaceholder": "es. mg/dL, %, ng/mL", "takenAt": "Data del prelievo", - "optionalGroup": "Facoltativo", - "panel": "Pannello", - "panelPlaceholder": "es. Emocromo completo", - "referenceLow": "Riferimento minimo", - "referenceHigh": "Riferimento massimo", - "referenceLowPlaceholder": "Limite inferiore", - "referenceHighPlaceholder": "Limite superiore", - "referenceHint": "Copia l'intervallo di riferimento dal referto. Ciascun limite è facoltativo.", "note": "Nota", "notePlaceholder": "Contesto facoltativo per questo risultato", "requiredError": "Inserisci un valore.", - "rangeOrderError": "Il riferimento minimo non può superare quello massimo.", "save": "Salva", "savedToast": "Risultato salvato", "saveError": "Impossibile salvare il risultato", @@ -6824,7 +6644,6 @@ "countOther": "Hai registrato {count} episodi in questo periodo.", "typicalGap": "Divario di recupero tipico: {days} giorni tra il sentirti meglio e la stabilizzazione dei valori.", "typicalGapLearning": "Ancora qualche episodio risolto e qui apparirà un divario di recupero tipico.", - "byMonth": "Quando tendi a registrare episodi", "none": "Nessun episodio registrato in questo periodo." }, "section": { diff --git a/messages/pl.json b/messages/pl.json index d91c6f7bd..f09755820 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -18,7 +18,6 @@ "optional": "Opcjonalne", "active": "Aktywne", "inactive": "Nieaktywne", - "enabled": "Włączone", "disabled": "Wyłączone", "networkError": "Błąd sieci", "unknownError": "Nieznany błąd", @@ -74,7 +73,6 @@ "colTaken": "Przyjęte", "colSkipped": "Pominięte", "colMissed": "Pominięte", - "colTotal": "Razem", "colExpected": "Oczekiwane", "colComplianceRate": "Wskaźnik przestrzegania", "moodTitle": "Przebieg nastroju", @@ -202,14 +200,12 @@ "measurements": "Pomiary", "medications": "Leki", "insights": "Insights", - "targets": "Cele", "achievements": "Osiągnięcia", "settings": "Ustawienia", "bugreport": "Zgłoszenie błędu", "admin": "Konsola administratora", "logout": "Wyloguj", "login": "Zaloguj", - "about": "O HealthLog", "notifications": "Powiadomienia", "theme": "Wygląd", "themeSystem": "Systemowy", @@ -219,13 +215,11 @@ "userMenu": "Menu użytkownika", "accountSettings": "Ustawienia konta", "mood": "Nastrój", - "workouts": "Treningi", "coach": "Coach", "skipToContent": "Przejdź do treści", "sidebar": "Pasek boczny", "mainNavigation": "Nawigacja główna", "mobileNavigation": "Nawigacja mobilna", - "breadcrumb": "Nawigacja okruszkami", "loadingScreen": "Ładowanie…", "more": "Więcej", "moreSheetTitle": "Więcej", @@ -242,7 +236,6 @@ }, "cycle": "Cykl", "labs": "Wyniki badań", - "recovery": "Regeneracja", "vorsorge": "Profilaktyka", "illness": "Choroba" }, @@ -330,7 +323,6 @@ "sleepShort": "Sen", "stepsShort": "Kroki", "vo2MaxShort": "VO₂ max", - "bpInTargetShort": "RR-cel", "bpInTargetWindow90": "RR-cel · 90 d", "bpInTargetWindowDynamic": "RR-cel · {days} d", "bpInTargetCollecting": "zbieranie danych", @@ -384,7 +376,6 @@ "staleHintWeeksOther": "Ostatni odczyt {count} tygodni temu", "staleHintMonthsOne": "Ostatni odczyt 1 miesiąc temu", "staleHintMonthsOther": "Ostatni odczyt {count} miesięcy temu", - "coachCta": "Zapytaj coacha", "recentWorkouts": { "title": "Ostatnie treningi", "viewAll": "Zobacz wszystkie", @@ -499,7 +490,6 @@ "invalidTimestamp": "Wybierz poprawną datę i godzinę.", "loginRequired": "Zaloguj się, aby zobaczyć pomiary.", "allTypes": "Wszystkie typy", - "filterByType": "Filtruj według typu", "measurementCount": "{count} pomiarów", "emptyTitle": "Brak pomiarów", "emptyDescription": "Zarejestruj wagę, ciśnienie, tętno lub inne wartości, aby zauważyć trendy.", @@ -550,7 +540,6 @@ "typeCardioLoad": "Obciążenie kardio", "typeSleepScore": "Wynik snu", "typeBodyTemperatureDeviation": "Odchylenie temperatury ciała", - "filterBySource": "Filtruj według źródła", "sourceComputed": "Obliczone", "sourceWhoop": "WHOOP", "sourceFitbit": "Fitbit", @@ -670,7 +659,6 @@ "factorSadness": "smutek", "praise": "pochwała" }, - "filterBySource": "Filtruj według źródła", "sourceManual": "Ręcznie", "sourceWeb": "Web", "sourceTelegram": "Telegram", @@ -741,8 +729,6 @@ "subtitle": "Leki, harmonogramy i przyjęcia", "loginRequired": "Zaloguj się, aby zarządzać lekami.", "addMedication": "Dodaj", - "editMedication": "Edytuj lek", - "newMedication": "Nowy lek", "firstMedication": "Dodaj pierwszy lek", "addChoice": { "logIntake": "Zarejestruj przyjęcie", @@ -778,16 +764,9 @@ "loadFailed": "Nie udało się załadować leków", "retryLoad": "Spróbuj ponownie", "name": "Nazwa", - "dose": "Dawka", - "scheduleFrom": "Od", - "scheduleTo": "Do", - "scheduleLabel": "Etykieta", - "scheduleDays": "Dni", - "scheduleDaily": "Codziennie", "inactive": "Wstrzymany", "intakeHistory": "Historia przyjęć", "openDetailPage": "Otwórz stronę szczegółów leku", - "deleteConfirm": "Usunąć lek?", "compliance": "Przestrzeganie zaleceń", "importIntakes": "Importuj przyjęcia", "importDescription": "Wklej tablicę JSON z danymi przyjęć. Oczekiwany format:", @@ -802,19 +781,7 @@ "importInvalidSkipped": "{count} nieprawidłowych wpisów pominięto", "importFailed": "Import nie powiódł się", "importInvalidFormat": "Nieprawidłowy format JSON", - "apiEndpointTitle": "Punkt końcowy API: {name}", - "apiEndpointDescription": "Użyj tego punktu końcowego do rejestrowania przyjęć przez API (np. Skrót iPhone lub zadanie cron).", - "apiEndpointActive": "Punkt końcowy API aktywny", - "apiEndpointActivated": "Punkt końcowy API aktywowany", - "apiEndpointDeactivated": "Punkt końcowy API dezaktywowany", - "apiTokenCount": "Aktywny ({count} tokenów)", - "apiToken": "Token API", - "apiTokenActiveHint": "Punkt końcowy jest aktywny. Istniejące tokeny pozostają ważne, ale nie można ich ponownie pokazać jako zwykły tekst.", - "apiTokenActivateHint": "Aktywuj punkt końcowy, aby utworzyć nowy token.", - "apiTokenOnceHint": "Token jest pokazywany jako zwykły tekst tylko raz, przy tworzeniu.", "requestExample": "Przykład żądania", - "statusLoadFailed": "Nie udało się wczytać statusu", - "changeFailed": "Zmiana nie powiodła się", "categoryBloodPressure": "Ciśnienie krwi", "categoryVitamin": "Witaminy", "categoryThyroid": "Tarczyca", @@ -847,21 +814,15 @@ "lastDoseDaysAgo": "Ostatnia dawka {count} dni temu", "overdue": "Po terminie", "veryOverdue": "Mocno po terminie", - "compliance7d": "Przestrzeganie 7 dni", - "compliance30d": "Przestrzeganie 30 dni", "complianceWindow": "Przestrzeganie {days} dni", "complianceUnavailable": "Nie udało się wczytać danych o przestrzeganiu", "complianceInfo": "Udział zarejestrowanych dawek względem oczekiwanych. Plany tygodniowe liczone są tydzień po tygodniu.", "complianceInfoLabel": "Co oznacza przestrzeganie zaleceń?", - "complianceDoses": "Dawki: {count}", "lastIntake": "Ostatnie przyjęcie:", "nextIntake": "Następne przyjęcie:", "nextIntakeOverdue": "Zaległa · {time} — wciąż można przyjąć", "dayStreak": "dni serii", "dayStreakOne": "dzień serii", - "cycleNextDoseToday": "Następna dawka dzisiaj", - "cycleNextDoseTomorrow": "Następna dawka jutro", - "cycleNextDoseInDays": "Następna dawka za {days} dni", "cycleDueToday": "Termin dzisiaj", "cycleOverdue": "Zaległa", "cycleNoClosedCycles": "Brak zakończonych cykli dawkowania", @@ -873,40 +834,10 @@ "intakeUndo": "Cofnij", "intakeUndone": "Wpis cofnięty", "intakeUndoFailed": "Nie udało się cofnąć — popraw w historii", - "weekdaySunday": "Niedziela", - "weekdayMonday": "Poniedziałek", - "weekdayTuesday": "Wtorek", - "weekdayWednesday": "Środa", - "weekdayThursday": "Czwartek", - "weekdayFriday": "Piątek", - "weekdaySaturday": "Sobota", - "weekdaySundayPlural": "Niedziele", - "weekdayMondayPlural": "Poniedziałki", - "weekdayTuesdayPlural": "Wtorki", - "weekdayWednesdayPlural": "Środy", - "weekdayThursdayPlural": "Czwartki", - "weekdayFridayPlural": "Piątki", - "weekdaySaturdayPlural": "Soboty", - "formType": "Typ", - "formDose": "Dawka", - "formUnit": "Jednostka", - "formSchedule": "Okno czasowe", - "formTreatmentClass": "Klasa terapii", - "formTreatmentClassHelp": "Wybierz „Iniekcja GLP-1” dla cotygodniowych iniekcji jak Mounjaro, Ozempic, Wegovy, Zepbound. Odblokowuje kartę ciała i dziennik GLP-1.", - "treatmentClassGeneric": "Lek standardowy", - "treatmentClassGlp1": "Iniekcja GLP-1", - "glp1WeeklyPresetTitle": "Raz w tygodniu, w…", - "glp1WeeklyPresetHelp": "Większość agonistów receptora GLP-1 podawana jest raz w tygodniu. Stuknij dzień, aby ustawić rytm.", - "glp1WeeklyPresetSuggest": "Przejmij ostatnio wybrany dzień", - "glp1DosesPerUnit": "Dawki na pen / fiolkę", - "glp1DosesPerUnitPlaceholder": "np. 4 dla pena Mounjaro KwikPen", - "glp1DosesPerUnitHelp": "Opcjonalne — Mounjaro KwikPen = 4, Ozempic 0,25/0,5 mg = 4, Wegovy pen jednorazowy = 1. Zostaw puste, jeśli nie chcesz śledzić dawek na pen.", "glp1LastInjection": "{label}", - "glp1LastInjectionWithSite": "{label} · {site}", "glp1NextInjectionDays": "{label} (za {days} dni)", "glp1NextInjectionToday": "dziś", "glp1NextInjectionTomorrow": "jutro", - "glp1RotationLast": "Ostatnie miejsce: {site}", "glp1RotationSuggested": "Sugerowane: {site}", "glp1LogSideEffect": "Zapisz działanie niepożądane", "sideEffects": { @@ -1261,8 +1192,7 @@ "add": "Dodaj kolejny harmonogram", "edit": "Edytuj", "remove": "Usuń", - "removeDisabled": "Wymagany jest co najmniej jeden harmonogram.", - "empty": "Brak harmonogramu." + "removeDisabled": "Wymagany jest co najmniej jeden harmonogram." } }, "errors": { @@ -1306,38 +1236,6 @@ "sideEffectTagAppetiteLoss": "Utrata apetytu", "sideEffectTagHeartburn": "Zgaga", "sideEffectTagHeadache": "Ból głowy", - "newSchedule": "Nowe okno czasowe", - "removeSchedule": "Usuń okno czasowe", - "advancedEditing": "Edycja zaawansowana", - "advancedEditingHide": "Ukryj edycję zaawansowaną", - "scheduleInterval": "Interwał", - "scheduleEveryWeek": "co tydzień", - "scheduleEveryNWeeks": "co {n} tygodni", - "scheduleIntervalPrefix": "Interwał:", - "nextSchedulePrefix": "Następne okno:", - "nextScheduleDaily": "codziennie", - "importIntakesAction": "Importuj przyjęcia", - "apiEndpointAction": "Endpoint API", - "pause": "Wstrzymaj", - "activate": "Aktywuj", - "disableNotifications": "Wyłącz powiadomienia", - "enableNotifications": "Włącz powiadomienia", - "purgeRecords": "Usuń zapisy", - "formReset": "Resetuj formularz", - "createMedication": "Utwórz lek", - "deleteConfirmDescription": "Ten lek i wszystkie jego przyjęcia zostaną nieodwracalnie usunięte.", - "purgeConfirmTitle": "Usunąć wszystkie przyjęcia?", - "purgeConfirmDescription": "Wszystkie zarejestrowane przyjęcia tego leku zostaną nieodwracalnie usunięte.", - "saveError": "Błąd zapisu", - "deleteError": "Błąd usuwania", - "purgeError": "Błąd czyszczenia rekordów", - "invalidTimestamp": "Wybierz poprawną datę i godzinę.", - "noIntakesYet": "Brak zarejestrowanych przyjęć.", - "actions": "Akcje", - "pageInfo": "Strona {page} z {total}", - "previousPage": "Poprzednia strona", - "nextPage": "Następna strona", - "loginRequiredIntakes": "Zaloguj się, aby zobaczyć historię przyjęć.", "phaseConfig": "Fazy przypomnień", "phaseConfigDescription": "Skonfiguruj momenty przypomnień.", "phaseGreen": "Zielony", @@ -1346,11 +1244,8 @@ "phaseRed": "Czerwony", "phaseMinutes": "Min", "phasePercent": "%", - "phaseBeforeEnd": "przed końcem", - "phaseAfterEnd": "po końcu", "phaseResetDefaults": "Przywróć wartości domyślne", "phaseSaved": "Fazy przypomnień zapisane", - "phaseReset": "Przywrócono wartości domyślne", "sourceWeb": "Web", "sourceApi": "Aplikacja iOS", "sourceReminder": "Przypomnienie", @@ -1370,16 +1265,6 @@ "intakeHistoryPageInfo": "Strona {page} z {total} · {count} wpisów", "intakeHistoryPrev": "Poprzednia", "intakeHistoryNext": "Następna", - "unitDrops": "kropli", - "unitTablets": "tabletek", - "unitCapsules": "kapsułek", - "unitPieces": "sztuk", - "namePlaceholder": "np. Ramipril", - "dosePlaceholder": "np. 5 mg", - "labelPlaceholder": "np. Rano", - "defaultDose": "Dawka standardowa", - "dayDeactivate": "Wyłącz {day}", - "dayActivate": "Włącz {day}", "glp1": { "drug": { "tirzepatide": { @@ -1636,8 +1521,6 @@ "historyLabel": "Zobacz historię przyjęć" }, "history": { - "back": "Powrót do leku", - "subtitle": "Pełna historia przyjęć", "plannedSuffix": "zaplanowane" }, "tabs": { @@ -3609,8 +3492,6 @@ }, "thresholds": { "defaultLabel": "Domyślne", - "autoModeLabel": "Auto", - "overrideModeLabel": "Niestandardowe", "overrideToggleLabel": "Własne wartości", "resetAction": "Przywróć wartość domyślną", "resetAllAction": "Przywróć wszystkie wartości domyślne", @@ -4965,7 +4846,6 @@ "modules": { "title": "Dostępność modułów", "description": "Wyłącz moduł dla całego serwera. Moduł wyłączony tutaj jest nieaktywny dla każdego konta, niezależnie od preferencji użytkownika. Domeny podstawowe (waga, ciśnienie, tętno, leki) są zawsze włączone i nie można ich wyłączyć.", - "disabledHint": "Wyłączone na całym serwerze", "saveError": "Nie udało się zaktualizować dostępności modułów." }, "bugReportRepo": "Repozytorium", @@ -5343,12 +5223,10 @@ "subtitle": "Destrukcyjne operacje obejmujące cały system." }, "about": { - "title": "O programie", - "subtitle": "Wersja, licencja, kod źródłowy i sprawdzanie aktualizacji." + "title": "O programie" } }, "carrier": "Operator", - "carrierUnknown": "Nieznany operator", "carrierUnavailableGeoFallback": "{location} — operator niedostępny" }, "achievements": { @@ -5680,7 +5558,6 @@ "title": "Powiadomienia", "breadcrumbInbox": "Powiadomienia", "breadcrumbChannels": "Kanały powiadomień", - "breadcrumbSettings": "Ustawienia", "eventColumn": "Zdarzenie", "subtitle": "Wybierz, które powiadomienia chcesz otrzymywać i którym kanałem.", "loadError": "Nie udało się załadować ustawień powiadomień.", @@ -5797,7 +5674,6 @@ "dotNearRange": "blisko zakresu", "dotOutOfRange": "poza zakresem", "dotNotLogged": "nie zarejestrowano", - "insufficientData": "Za mało danych — rejestruj dalej.", "relativeDay": { "today": "Dzisiaj", "yesterday": "Wczoraj", @@ -5809,7 +5685,6 @@ } }, "edit": { - "openLabel": "Edytuj zakres docelowy dla {metric}", "title": "Edytuj zakres docelowy — {metric}", "description": "Dostosuj zakres docelowy używany w wykresach, insights i raporcie medycznym. Wartości w {unit}.", "derivedHint": "Ta karta jest wyprowadzona z innych metryk. Edytuj cele bazowe (np. ciśnienie lub waga).", @@ -5825,13 +5700,6 @@ "saveError": "Nie udało się zapisać zakresu docelowego", "resetSuccess": "Zakres docelowy przywrócono do domyślnego" }, - "mood": { - "stability": { - "stable": "stabilny", - "variable": "zmienny", - "highlyVariable": "bardzo zmienny" - } - }, "currentValue": "Aktualnie: {value} {unit}", "targetRangeValue": "Zakres docelowy: {min}–{max} {unit}", "sourceLabel": "Źródło: {source}", @@ -5937,7 +5805,6 @@ }, "lowStockReminders": { "title": "Niski zapas: {medName}", - "body": "{medName}: pozostało {units} jednostek — wystarczy na około {days} dni.", "bodyToday": "{medName}: pozostało {units} jednostek — mniej niż jeden dzień zapasu.", "bodyReorder": "{medName}: pozostało {units} jednostek. Zapas skończy się około {runsOutOn} — zamów ponownie do {reorderBy}.", "bodyLastDose": "{medName}: pozostało {units} jednostek — to mniej więcej Twoja ostatnia dawka. Zapas skończy się około {runsOutOn}." @@ -6045,7 +5912,6 @@ "description": "Jak każdy pomiar wypada między fazą lutealną a folikularną, na Twoich danych.", "pairLabel": "{metric} · lutealna vs folikularna", "detail": "Lutealna {lutealAvg} {unit} ({lutealDays} dni) vs folikularna {follicularAvg} {unit} ({follicularDays} dni).", - "footer": "To powiązania w Twoich danych, nie przyczyny. Pokazywane są tylko wzorce, które przechodzą test istotności.", "metricRestingHeartRate": "Tętno spoczynkowe", "metricHrv": "Zmienność rytmu serca", "metricSleepDuration": "Czas snu", @@ -6069,10 +5935,6 @@ "confidenceHigh": "Wysoka pewność" }, "title": "Analizy cyklu", - "empty": "Analizy faz pojawią się tutaj, gdy zapiszesz wystarczająco wiele cykli. Porównują twoje wskaźniki między fazami cyklu, z otwarcie pokazaną statystyką.", - "sampleSize": "n = {n}", - "effectSize": "Wielkość efektu {value}", - "qValue": "q = {value}", "symptomPatternsTitle": "Wzorce objawów wg fazy", "symptomPatternsEmpty": "Zapisuj objawy przez cały cykl, aby zobaczyć, w której fazie się grupują.", "symptomMostlyIn": "Głównie w fazie {phase} ({count}/{total} dni)" @@ -6092,7 +5954,6 @@ "LUTEAL": "Progesteron prowadzi przez drugą połowę cyklu, a podstawowa temperatura ciała zwykle ustala się nieco wyżej niż wcześniej. Niektóre osoby zauważają z dnia na dzień zmiany w śnie, apetycie, nastroju czy energii, podczas gdy inne czują się stabilnie przez cały czas. Ten wzorzec jest indywidualny i często wygląda inaczej z miesiąca na miesiąc." }, "commonHere": "To często zauważasz tutaj", - "trackNudge": "Zapisz dziś", "stillLearning": "Wciąż poznajemy Twój cykl. Zapisuj dalej, a to wypełni się wzorcami z Twoich własnych dni." }, "insightsSummary": { @@ -6185,10 +6046,7 @@ "prevMonth": "Poprzedni miesiąc", "nextMonth": "Następny miesiąc", "loading": "Ładowanie kalendarza…", - "empty": "Zacznij zapisywać, aby wypełnić kalendarz.", "learning": "Uczymy się Twojego cyklu — zapisz co najmniej trzy pełne cykle, a okno płodne, owulacja i fazy się uzupełnią. Do tego czasu kalendarz pokazuje tylko to, co zapisałaś.", - "today": "Dziś", - "dayAria": "{date}", "legendSymptom": "Objawy", "legendOvulationConfirmed": "Potwierdzona owulacja", "flowSpotting": "plamienie", @@ -6199,11 +6057,9 @@ "predictions": { "title": "Co dalej", "nextPeriod": "Następna miesiączka", - "nextPeriodRange": "Około {date}", "nextPeriodWindow": "{low} – {high}", "fertileWindow": "Okno płodne", "ovulation": "Szacowana owulacja", - "confidence": "Pewność", "confidenceHigh": "Wysoka", "confidenceMedium": "Średnia", "confidenceLow": "Niska", @@ -6239,7 +6095,6 @@ "sheet": { "title": "Zapisz swój dzień", "description": "Zapisz dzisiejsze krwawienie, objawy i notatki.", - "date": "Data", "flow": "Krwawienie", "symptoms": "Objawy", "temperature": "Podstawowa temperatura ciała", @@ -6259,10 +6114,7 @@ "save": "Zapisz", "saving": "Zapisywanie…", "cancel": "Anuluj", - "saved": "Dzień zapisany", "saveError": "Nie udało się zapisać. Spróbuj ponownie.", - "periodStarted": "Zapisano początek miesiączki", - "clear": "Brak", "intermenstrualBleeding": "Plamienie między okresami", "pregnancyTest": "Test ciążowy", "progesteroneTest": "Test progesteronu", @@ -6278,8 +6130,6 @@ }, "settings": { "title": "Ustawienia cyklu", - "enable": "Śledzenie cyklu", - "enableDescription": "Włącz lub wyłącz zakładkę cyklu dla swojego konta.", "typicalCycleLength": "Typowa długość cyklu (dni)", "typicalPeriodLength": "Typowa długość miesiączki (dni)", "lutealPhaseLength": "Długość fazy lutealnej (dni)", @@ -6298,30 +6148,14 @@ "encryptionDescription": "Szyfruj w spoczynku pola ujawniające intencje (testy ciążowe, antykoncepcja, współżycie), obok zawsze szyfrowanych notatek.", "discreet": "Dyskretne powiadomienia", "discreetDescription": "Ukryj szczegóły cyklu w treści powiadomień na ekranie blokady.", - "dataTitle": "Twoje dane", - "dataDescription": "Twoje dane cyklu istnieją tylko na tym serwerze. Eksportuj je w każdej chwili lub usuń na zawsze.", - "export": "Eksportuj moje dane cyklu", - "deleteData": "Usuń moje dane cyklu", "saved": "Ustawienia zapisane", "saveError": "Nie udało się zapisać. Spróbuj ponownie.", "save": "Zapisz", - "purgeTitle": "Usuń wszystkie dane cyklu", - "purgeDescription": "Trwale usuwa każdy zapisany dzień, cykl, prognozę i przypomnienie. Tej operacji nie można cofnąć.", - "purgeButton": "Usuń wszystkie dane cyklu", - "purgeConfirmTitle": "Usunąć wszystkie dane cyklu?", - "purgeConfirmBody": "Spowoduje to trwałe usunięcie każdej miesiączki, wpisu dziennego, objawu i prognozy. Tej operacji nie można cofnąć.", - "purgeConfirm": "Trwale usunąć wszystkie dane cyklu?", - "purgeCancel": "Anuluj", - "purgeSuccess": "Usunięto wszystkie dane cyklu.", - "purgeError": "Nie udało się usunąć danych cyklu.", "reminders": "Przypomnienia", "remindersDescription": "Włącz przypomnienia o okresie dla każdego kanału w ustawieniach powiadomień.", "remindersLink": "Ustawienia powiadomień", "fertileReminder": "Przypomnienie o oknie płodności", - "fertileReminderDescription": "Otrzymaj powiadomienie kilka dni przed szacowanym oknem płodności. Domyślnie wyłączone – włącz je dla każdego kanału w ustawieniach powiadomień.", - "purgeData": "Usuń dane cyklu", - "purgeConfirmAction": "Tak, usuń wszystko", - "purgeDone": "Dane cyklu usunięte." + "fertileReminderDescription": "Otrzymaj powiadomienie kilka dni przed szacowanym oknem płodności. Domyślnie wyłączone – włącz je dla każdego kanału w ustawieniach powiadomień." }, "testResult": { "POSITIVE": "Pozytywny", @@ -6502,7 +6336,6 @@ "emptyDescription": "Zapisuj badania takie jak HbA1c, LDL czy ferrytyna, aby śledzić je w czasie i udostępniać lekarzowi.", "referenceLabel": "Norma", "readingsCount": "{count} pomiarów", - "deleteLatest": "Usuń ostatni wynik", "deleteConfirmTitle": "Usunąć wynik laboratoryjny?", "deleteConfirmDescription": "Ten wynik laboratoryjny zostanie trwale usunięty.", "deletedToast": "Wynik usunięty", @@ -6514,24 +6347,11 @@ "above": "Powyżej normy" }, "form": { - "analyte": "Biomarker", - "analytePlaceholder": "np. HbA1c, LDL, ferrytyna", "value": "Wartość", - "unit": "Jednostka", - "unitPlaceholder": "np. mg/dl, %, ng/ml", "takenAt": "Data pobrania", - "optionalGroup": "Opcjonalne", - "panel": "Panel", - "panelPlaceholder": "np. Morfologia krwi", - "referenceLow": "Norma dolna", - "referenceHigh": "Norma górna", - "referenceLowPlaceholder": "Dolna granica", - "referenceHighPlaceholder": "Górna granica", - "referenceHint": "Przepisz zakres referencyjny z wyniku laboratoryjnego. Każda z granic jest opcjonalna.", "note": "Notatka", "notePlaceholder": "Opcjonalny kontekst tego wyniku", "requiredError": "Podaj wartość.", - "rangeOrderError": "Norma dolna nie może przekraczać górnej.", "save": "Zapisz", "savedToast": "Wynik zapisany", "saveError": "Nie udało się zapisać wyniku", @@ -6824,7 +6644,6 @@ "countOther": "W tym okresie zapisałeś {count} epizodów.", "typicalGap": "Typowa luka rekonwalescencji: {days} dni między poprawą a ustabilizowaniem wartości.", "typicalGapLearning": "Jeszcze kilka zakończonych epizodów i pojawi się tu typowa luka rekonwalescencji.", - "byMonth": "Kiedy zwykle zapisujesz epizody", "none": "Brak epizodów zapisanych w tym okresie." }, "section": { diff --git a/src/__tests__/i18n-drift-guard.test.ts b/src/__tests__/i18n-drift-guard.test.ts index 74a9cccdd..4910dc39b 100644 --- a/src/__tests__/i18n-drift-guard.test.ts +++ b/src/__tests__/i18n-drift-guard.test.ts @@ -68,7 +68,7 @@ const REQUIRED_KEY_SETS: Array<{ }> = [ { label: "admin.carrier (B3 — login carrier chip)", - required: ["admin.carrier", "admin.carrierUnknown"], + required: ["admin.carrier"], }, { label: "insights.emptyState.* (B4 — per-metric empty states)", diff --git a/src/__tests__/i18n-reverse-coverage.test.ts b/src/__tests__/i18n-reverse-coverage.test.ts new file mode 100644 index 000000000..be205b095 --- /dev/null +++ b/src/__tests__/i18n-reverse-coverage.test.ts @@ -0,0 +1,232 @@ +/** + * v1.18.6 — reverse i18n coverage guard. + * + * The forward `i18n-call-site-coverage.test.ts` asserts every `t("ns.key")` + * call site resolves to a leaf in `messages/en.json`. This test asserts the + * REVERSE: every leaf in `messages/en.json` is reachable from at least one + * call site, so orphan keys can't accumulate in the bundle unnoticed. + * + * "Reachable" recognises the key-construction patterns the codebase actually + * uses: + * - a literal `t("a.b.c")` (hyphens allowed — admin section slugs use them); + * - a `t("a.b")` that returns a subtree, covering every descendant leaf; + * - a dynamic key built inside a `t(`…`)` template, e.g. the per-metric + * `${i18nPrefix}.title` insight pages, `cycle.calendar.flow${LEVEL}`, or + * the `medications.site${Suffix}` label keys — captured by the static + * leading-literal prefix and/or trailing-literal suffix of the template; + * - a key string assembled outside the call (`return `medications.site${s}`` + * in `describeInjectionSite`) and passed to `t()`, recognised when the + * template's leading literal is rooted at a real top-level namespace; + * - an explicit allowlist for keys resolved through a DB column. + * + * Dynamic detection is scoped to `t(`…`)` and to namespace-rooted key + * templates only — NOT to every backtick string — so a cache key or + * wide-event action name that happens to start with a namespace word doesn't + * mask a genuinely dead key. + * + * If this fails after adding a key, either wire a call site, or — for a key + * resolved through a runtime value the static scan can't see — add its prefix + * to `DYNAMIC_ALLOWLIST_PREFIXES` with a one-line note on why. + */ +import { describe, it, expect } from "vitest"; +import { readFileSync, readdirSync, statSync } from "node:fs"; +import { join } from "node:path"; + +const ROOT = join(__dirname, "../.."); +const SRC = join(ROOT, "src"); +const EN_BUNDLE_PATH = join(ROOT, "messages/en.json"); + +const SKIP_DIRS = new Set(["__tests__", "node_modules", ".next", "generated"]); + +/** + * Keys resolved through a runtime value no static scan can see. Each entry is + * a leaf or a namespace prefix that is always live. + * - `mood.tag` / `mood.tagCategory`: the catalogue is DB-driven; the label key + * is built from a `MoodTag.messageKey` / `MoodTagCategory.messageKey` column, + * so the leaf never appears as a string literal in the tree. + */ +const DYNAMIC_ALLOWLIST_PREFIXES = ["mood.tag", "mood.tagCategory"] as const; + +function walk(dir: string, out: string[] = []): string[] { + for (const name of readdirSync(dir)) { + if (SKIP_DIRS.has(name)) continue; + const p = join(dir, name); + const stat = statSync(p); + if (stat.isDirectory()) { + walk(p, out); + } else if (name.endsWith(".ts") || name.endsWith(".tsx")) { + out.push(p); + } + } + return out; +} + +function leafPaths(obj: unknown, prefix: string, out: string[]): void { + if (!obj || typeof obj !== "object") return; + for (const [k, v] of Object.entries(obj as Record)) { + const path = prefix ? `${prefix}.${k}` : k; + if (v && typeof v === "object" && !Array.isArray(v)) { + leafPaths(v, path, out); + } else { + out.push(path); + } + } +} + +function nodePaths(obj: unknown, prefix: string, out: Set): void { + if (!obj || typeof obj !== "object") return; + for (const [k, v] of Object.entries(obj as Record)) { + const path = prefix ? `${prefix}.${k}` : k; + out.add(path); + if (v && typeof v === "object" && !Array.isArray(v)) { + nodePaths(v, path, out); + } + } +} + +interface Reference { + /** Literal `t("…")` keys. */ + literalKeys: Set; + /** Dotted bases (`base.${…}` / a full string-literal node path): cover the subtree. */ + dottedBases: Set; + /** Dot-less concat prefixes (`medications.site${…}`): cover any leaf that string-starts with them. */ + concatPrefixes: Set; + /** Trailing static suffixes of a template key (`${…}.title`). */ + dynamicSuffixes: Set; +} + +function collectReferences( + allNodes: Set, + topNamespaces: Set, +): Reference { + const allText = walk(SRC) + .map((f) => readFileSync(f, "utf8")) + .join("\n"); + + const literalKeys = new Set(); + const literalKeyRe = + /(?(); + const concatPrefixes = new Set(); + const dynamicSuffixes = new Set(); + + const ingestTemplate = (content: string) => { + const open = content.indexOf("${"); + if (open > 0) { + const lit = content.slice(0, open); + if (lit.includes(".")) { + if (lit.endsWith(".")) dottedBases.add(lit.slice(0, -1)); + else concatPrefixes.add(lit); + } + } + const close = content.lastIndexOf("}"); + if (close !== -1 && close < content.length - 1) { + const tail = content.slice(close + 1).replace(/^\./, ""); + if (tail) dynamicSuffixes.add(tail); + } + }; + + // Templates passed directly to t(`…`). + const tTemplateRe = /(? leaf === p || leaf.startsWith(`${p}.`), + ); +} + +describe("i18n reverse coverage", () => { + it("every key in messages/en.json has a call site or is allowlisted", () => { + const en = JSON.parse(readFileSync(EN_BUNDLE_PATH, "utf8")); + const leaves: string[] = []; + leafPaths(en, "", leaves); + expect(leaves.length).toBeGreaterThan(1000); + + const allNodes = new Set(); + nodePaths(en, "", allNodes); + const topNamespaces = new Set(Object.keys(en)); + const ref = collectReferences(allNodes, topNamespaces); + // Sanity: the static scan must see the bulk of the bundle. + expect(ref.literalKeys.size).toBeGreaterThan(1000); + + const orphans = leaves.filter( + (leaf) => !isAllowlisted(leaf) && !isReferenced(leaf, ref), + ); + + if (orphans.length > 0) { + const report = orphans.map((k) => ` ❌ ${k}`).join("\n"); + throw new Error( + `Found ${orphans.length} key(s) in messages/en.json with no call site:\n${report}\n\n` + + "Wire a call site, or add a DB-driven prefix to DYNAMIC_ALLOWLIST_PREFIXES.", + ); + } + }); +}); diff --git a/src/components/charts/__tests__/trend-card-baseline-alignment.test.tsx b/src/components/charts/__tests__/trend-card-baseline-alignment.test.tsx index bed73b3f1..21377d57b 100644 --- a/src/components/charts/__tests__/trend-card-baseline-alignment.test.tsx +++ b/src/components/charts/__tests__/trend-card-baseline-alignment.test.tsx @@ -198,7 +198,6 @@ describe("dashboard.*Short keys exist across all six locales", () => { "sleepShort", "stepsShort", "vo2MaxShort", - "bpInTargetShort", ]; // Resolved at test time so the assertion runs against the current