diff --git a/messages/de.json b/messages/de.json index ee6731cd2..20f6455b5 100644 --- a/messages/de.json +++ b/messages/de.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "Vorrat: ≈ {days} Tage", "takeActionFor": "Einnehmen — {name}", "skipActionFor": "Überspringen — {name}", - "reorderTitle": "Reihenfolge anpassen", "reorderDescription": "Bestimme die Reihenfolge deiner Medikamente — sie gilt für die Karten- und die Tabellenansicht.", "reorderSaved": "Reihenfolge gespeichert", "reorderSaveFailed": "Reihenfolge konnte nicht gespeichert werden", @@ -4784,7 +4783,8 @@ "metricBodyWater": "Körperwasser", "metricBoneMass": "Knochenmasse", "metricOxygenSaturation": "Sauerstoffsättigung (SpO₂)", - "unsetExplanation": "Kein eigener Wert — berechneter Default aktiv." + "unsetExplanation": "Kein eigener Wert — berechneter Default aktiv.", + "cardTitle": "Bereiche je Messgröße" }, "onboarding": { "errorGeneric": "Beim Abschluss des Setups ist etwas schiefgelaufen. Bitte versuche es erneut.", @@ -5372,7 +5372,7 @@ "description": "Lege fest, welche Quelle führt, wenn mehrere am selben Tag dieselbe Metrik liefern.", "integrationsHint": "Neue Datenquellen verbindest oder trennst du auf der Integrationen-Seite.", "integrationsHintLink": "Integrationen öffnen", - "cardTitle": "Quellen-Priorität pro Metrik", + "cardTitle": "Rangfolge je Messgröße", "help": "Liefern mehrere Quellen denselben Wert am selben Tag, zählt die oberste Quelle als kanonisch.", "resetDefaults": "Auf Standard zurücksetzen", "resetDefaultsTitle": "Quellen-Reihenfolge zurücksetzen?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "Anamnese", - "subtitle": "Verwalte deine Allergien und deine Familienanamnese.", + "subtitle": "Deine Vorgeschichte, Lebensumstände, Notfalldaten und was die KI lesen darf.", "description": "Strukturierte Datensätze zu Allergien und Familienanamnese." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "Passwort ändern", "changePasswordDescription": "Ersetze dein aktuelles Passwort durch ein neues.", - "passwordReset": "Passwort-Reset", "currentPassword": "Aktuelles Passwort", "newPassword": "Neues Passwort", "confirmNewPassword": "Neues Passwort bestätigen", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "Push-Benachrichtigungen aktiviert!", "webPushUnsubscribed": "Push-Benachrichtigungen deaktiviert.", "webPushSubscribeFailed": "Aktivierung fehlgeschlagen", - "kiInsightsDescription": "Optional: Hinterlege deinen OpenAI-Key für tägliche, automatische Auswertungen in den Insights.", "codexConnected": "ChatGPT erfolgreich verbunden! Insights sind jetzt aktiv.", "codexDisconnected": "ChatGPT-Verbindung getrennt.", "codexConnectionFailed": "ChatGPT-Verbindung fehlgeschlagen. Bitte versuche es erneut.", @@ -6090,7 +6088,7 @@ "admin-openai": "Admin-OpenAI" }, "title": "Fallback-Kette", - "description": "Wenn der primäre Provider ausfällt, läuft HealthLog die Kette der Reihe nach durch. Reihenfolge per Pfeile ändern, Schalter deaktiviert einen Eintrag ohne ihn zu entfernen.", + "description": "Fällt der aktive Anbieter aus, versucht HealthLog den nächsten eingeschalteten in dieser Reihenfolge.", "moveUp": "Nach oben", "moveDown": "Nach unten", "removeFromChain": "Aus Kette entfernen", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "Kette auf Standard zurücksetzen?", "resetConfirmBody": "Die Kette wird auf Codex → OpenAI → Anthropic → Lokal → Admin-OpenAI zurückgesetzt. Gespeicherte Zugangsdaten bleiben erhalten." }, - "providerCardTitle": "KI-Anbieter", "activeProviderHeading": "Aktiver Provider", - "activeProviderBody": "Wähle den Provider, der zuerst genutzt wird. Das Formular darunter konfiguriert ausschließlich den ausgewählten Provider; die Fallback-Kette unten regelt, was passiert, wenn er ausfällt.", "activeProviderLabel": "Primärer Provider", - "providerConfigTitle": "Provider-Konfiguration", "providerSelect": { "codex": "ChatGPT-Account (Codex)", "openai": "OpenAI (eigener API-Key)", @@ -6246,21 +6241,21 @@ "responseTimeoutInvalid": "Gib eine Zahl zwischen 10 und 600 Sekunden ein.", "autoRead": { "title": "Dokumente automatisch mit KI lesen", - "subLabel": "Dokumente werden von deinem konfigurierten KI-Anbieter gelesen und indiziert, ohne dass du jedes Dokument einzeln bestätigen musst.", + "subLabel": "Dein KI-Anbieter liest und indiziert neue Dokumente, ohne dass du jedes einzeln bestätigst.", "honesty": "Wenn aktiviert, wird jedes hochgeladene Dokument an deinen konfigurierten KI-Anbieter gesendet, um gelesen, beschrieben und für die Suche indiziert zu werden — ohne Bestätigung pro Dokument. Das Einschalten wirkt außerdem rückwirkend: Bereits hochgeladene Dokumente ohne Zusammenfassung werden ebenfalls gesendet, bis zu 200 pro Einschaltvorgang. Das geschieht auf dem Server, und der Inhalt des Dokuments verlässt dabei diese Maschine in Richtung dieses Anbieters. Wenn dein konfigurierter Anbieter eine Abo-Verbindung ist (ein angemeldetes KI-Konto statt eines API-Schlüssels), gelten dessen eigene Datenschutzeinstellungen — Abo-Anbieter dürfen den Inhalt zur Verbesserung ihrer Modelle verwenden, und kein Auftragsverarbeitungsvertrag deckt das ab. Dokumente, die von einem selbst gehosteten lokalen Modell gelesen werden, verlassen deinen Server nie. Standardmäßig aus; aktiviere es nur, wenn du diesen Kompromiss für deine Dokumente akzeptierst.", "confirm": "Verstanden — aktivieren", "cancel": "Abbrechen" }, "centralCodex": { "title": "Gemeinsamen KI-Zugang des Servers nutzen", - "subLabel": "Leite KI-Anfragen über die vom Betreiber für diesen Server eingerichtete Verbindung — zusätzlich zu deinen eigenen Anbietern als Rückfallebene.", + "subLabel": "KI-Anfragen laufen über die gemeinsame Verbindung des Servers, deine eigenen Anbieter dienen als Rückfall.", "honesty": "Der gemeinsame Zugang ist ein einzelnes angemeldetes KI-Konto, das der Betreiber für alle auf diesem Server verbunden hat — nicht dein eigener Schlüssel. Anfragen darüber werden vom Anbieter standardmäßig zum Training genutzt und von keiner Auftragsverarbeitungsvereinbarung gedeckt, die Stunden- und Wochenlimits des Kontos teilst du dir mit allen anderen, die zugestimmt haben, und deine eigenen Anbieter werden weiterhin zuerst versucht. Aktiviere es nur, wenn du diesen Kompromiss akzeptierst.", "confirm": "Verstanden — Verbindung nutzen", "cancel": "Abbrechen" }, "consent": { "title": "KI-Einwilligung", - "activeSince": "Erteilt am {date}. Deine Gesundheitsdaten dürfen für die KI-Funktionen an den eingestellten Anbieter gesendet werden.", + "activeSince": "Erteilt am {date}: Deine Gesundheitsdaten dürfen für die KI-Funktionen an den eingestellten Anbieter gehen.", "withdrawn": "Widerrufen. Sofern keine andere Einwilligung sie abdeckt, nutzen Coach und Insights den KI-Zugang dieses Servers nicht mehr, und kein Online-Modell liest deine Dokumente. Mit deinem eigenen Schlüssel oder einem lokalen Modell laufen Coach und Insights weiter.", "withdraw": "Einwilligung widerrufen", "confirmBody": "Sofern keine andere Einwilligung sie noch abdeckt, endet sofort: der Coach und die Insights, wo sie den KI-Zugang dieses Servers nutzen, und das Lesen von Dokumenten mit einem Online-Modell. Mit deinem eigenen Schlüssel oder einem lokalen Modell laufen Coach und Insights weiter. Sofern keine andere Einwilligung die Insights noch abdeckt, werden die Notizen gelöscht, die ein Modell für dich geschrieben hat: Statusnotizen, das tägliche Briefing, von einem Modell geschriebene Zeitraum-Zusammenfassungen, Ankunftszeilen und Trainingsnotizen. Deine Coach-Gespräche, was sich der Coach gemerkt hat, deine Pläne und deine Dokument-Zusammenfassungen bleiben, und du kannst sie selbst lesen oder löschen.", @@ -6271,7 +6266,7 @@ "error": "Der Widerruf konnte nicht gespeichert werden. Bitte versuche es erneut.", "documentReading": { "title": "Einwilligung zum Lesen von Dokumenten", - "activeSince": "Erteilt am {date}. Dokumente, gescannte Laborbefunde und Medikamentenbeschreibungen dürfen zum Lesen an deinen KI-Dienst gesendet werden.", + "activeSince": "Erteilt am {date}: Dokumente, Laborscans und Medikamententexte dürfen zum Lesen an deinen KI-Dienst gehen.", "confirmBody": "Dokumente, gescannte Laborbefunde und Medikamentenbeschreibungen werden nicht mehr zum Lesen gesendet. Nichts, was du bereits hast, wird gelöscht." } }, @@ -6305,7 +6300,9 @@ "high": "Hoch" }, "coachNote": "Im Coach gilt die Denktiefe aus den Coach-Einstellungen." - } + }, + "providerCardDescription": "Der Anbieter, den HealthLog zuerst fragt, mit Schlüssel und Modell.", + "runtimeTitle": "Prüfen und aktualisieren" }, "dashboard": { "units": { @@ -7162,7 +7159,8 @@ "description": "Damit werden deine Gesundheitsdaten weitergegeben oder exportiert. Bestätige, dass du es bist, um fortzufahren.", "signInAgain": "Melde dich neu an und versuche es dann noch einmal. Dein Konto hat kein Passwort und keinen Passkey, den du hier bestätigen könntest.", "failed": "Das hat nicht geklappt. Prüfe deine Eingabe und versuche es noch einmal." - } + }, + "passwordTitle": "Passwort" }, "admin": { "title": "Administration", @@ -7282,9 +7280,9 @@ "defaultLanguage": "Standard-Sprache", "defaultLanguageDescription": "Wird für neue Nutzer und als Fallback verwendet.", "defaultUserTimezone": "Standard-Zeitzone für neue Konten", - "defaultUserTimezoneDescription": "Wird für neue Konten ohne erkannte Browser-Zeitzone verwendet. Bestehende Nutzer sind nicht betroffen.", + "defaultUserTimezoneDescription": "Gilt für neue Konten ohne erkannte Browser-Zeitzone; bestehende Konten behalten ihre.", "defaultUserTimezoneFallback": "Europe/Berlin (Standard)", - "servicesGlobal": "Dienste (global)", + "servicesGlobal": "Kanäle und API", "servicesGlobalDescription": "Deaktivierte Dienste stehen keinem Nutzer zur Verfügung.", "telegramGlobal": "Telegram-Benachrichtigungen erlauben.", "ntfyGlobal": "ntfy-Benachrichtigungen erlauben.", @@ -7295,16 +7293,16 @@ "offlineGeoFallback": "Online ({host}) — GeoLite2-Datenbanken einbinden und GEOLITE2_DIR setzen", "apiGlobal": "API-Endpunkte und API-Tokens erlauben.", "umamiTitle": "Umami", - "umamiDescription": "Web-Analyse mit Umami", + "umamiDescription": "Web-Analyse mit Umami.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "Fehler-Tracking mit GlitchTip", + "glitchtipDescription": "Fehler-Tracking mit GlitchTip.", "webPushVapidTitle": "Web Push VAPID", - "umamiEnabled": "Umami-Tracking aktivieren.", + "umamiEnabled": "Umami-Tracking aktivieren", "umamiScriptUrl": "Umami Script-URL", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "Umami Website-ID", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "GlitchTip Fehler-Tracking aktivieren.", + "glitchtipEnabled": "GlitchTip-Fehler-Tracking aktivieren", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "GlitchTip Environment", @@ -7366,8 +7364,8 @@ "title": "Modulverfügbarkeit", "description": "Schalte ein Modul für den gesamten Server ab.", "saveError": "Modulverfügbarkeit konnte nicht aktualisiert werden.", - "detail": "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.", - "coachFollowsSwitch": "Folgt dem Coach-Schalter unter Assistenz." + "detail": "Gewicht, Blutdruck und Puls sind Kerndaten und bleiben immer aktiv.", + "coachFollowsSwitch": "Folgt dem Coach-Schalter im Bereich Coach." }, "invites": { "title": "Einladungen", @@ -7452,7 +7450,6 @@ "tokenNeverUsed": "Nie", "tokensEmptyTitle": "Noch keine API-Tokens", "tokensEmptyDescription": "Tokens werden bei der Anmeldung nativer Clients oder über Einstellungen → Account ausgestellt.", - "loginOverview": "Anmeldeübersicht", "loginOverviewDescription": "Anmelde- und Auth-Ereignisse aller Konten, filterbar und als CSV exportierbar.", "allAuthEvents": "Alle Auth-Ereignisse", "failedOnly": "Nur fehlgeschlagene", @@ -7560,7 +7557,7 @@ }, "services": { "title": "Dienste", - "subtitle": "Benachrichtigungskanäle und Integrationen systemweit aktivieren oder deaktivieren." + "subtitle": "Benachrichtigungskanäle und die API für den ganzen Server ein- oder ausschalten." }, "integrations": { "title": "Integrationen", @@ -7646,7 +7643,8 @@ "refresh": "Aktualisieren", "eventDetails": "Event-Details", "closeDetails": "Details schließen", - "processDetail": "Der Puffer ist flüchtig und auf 500 Einträge begrenzt." + "processDetail": "Der Puffer ist flüchtig und auf 500 Einträge begrenzt.", + "cardTitle": "Letzte Ereignisse" }, "backups": { "title": "Backups", @@ -7830,7 +7828,6 @@ "encryption": { "title": "Verschlüsselung", "subtitle": "Verschlüsselungsabdeckung und Schlüsselrotations-Status für ruhende Daten.", - "loading": "Verschlüsselungsstatus wird geladen…", "loadError": "Verschlüsselungsstatus konnte nicht geladen werden.", "coverageTitle": "Abdeckung", "coverageDescription": "Wie viele verschlüsselte Zeilen unter welcher Schlüssel-ID liegen.", @@ -7908,7 +7905,7 @@ }, "carrier": "Netzbetreiber", "mfaRequired": "Zweiten Faktor verlangen", - "mfaRequiredDescription": "Jedes Konto ohne aktiven zweiten Faktor wird nach der Anmeldung zur Einrichtung geleitet. Das fordert Web-Nutzer zur Einrichtung auf — es blockiert jedoch keinen direkten API- oder nativen (Bearer-)Zugriff für noch nicht eingerichtete Konten.", + "mfaRequiredDescription": "Konten ohne zweiten Faktor werden nach der Web-Anmeldung zur Einrichtung geleitet; API- und nativer (Bearer-)Zugriff bleiben offen.", "mfaEnforcedOn": "MFA an", "mfaEnforcedOff": "MFA aus", "mfaEnforcedOnHint": "Für diesen Nutzer ist ein zweiter Faktor erforderlich. Klicken, um die Anforderung aufzuheben.", @@ -8006,7 +8003,9 @@ "restartNote": "Starte HealthLog nach der Änderung neu.", "lastResort": "Letzter Ausweg, nur wenn du sicher bist, dass der Schlüssel stimmt, und keiner der drei Wege passt: setze {setting} und starte neu. HealthLog liefert dann trotzdem aus und schreibt den Befund nur ins Log. Damit ist eine Sicherheitsprüfung abgeschaltet: Mit einem falschen Schlüssel scheitert jeder verschlüsselte Wert, und neue Daten werden unter diesem Schlüssel geschrieben.", "codes": "Für den Betrieb: API-Anfragen antworten mit 503 und dem Fehlercode {code}, /api/health meldet den Grund {reason}." - } + }, + "loginOverviewCardTitle": "Anmeldeereignisse", + "userColumn": "Nutzer" }, "achievements": { "title": "Erfolge", diff --git a/messages/en.json b/messages/en.json index 06a2e9b36..2123418c6 100644 --- a/messages/en.json +++ b/messages/en.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "Supply: ≈ {days} days", "takeActionFor": "Take – {name}", "skipActionFor": "Skip – {name}", - "reorderTitle": "Adjust order", "reorderDescription": "Set the order of your medications – it applies to both the card and the table view.", "reorderSaved": "Order saved", "reorderSaveFailed": "Order could not be saved", @@ -4784,7 +4783,8 @@ "metricBodyWater": "Body water", "metricBoneMass": "Bone mass", "metricOxygenSaturation": "Oxygen saturation (SpO₂)", - "unsetExplanation": "No override — using computed default." + "unsetExplanation": "No override — using computed default.", + "cardTitle": "Ranges per metric" }, "onboarding": { "errorGeneric": "Something went wrong while finishing setup. Please try again.", @@ -5356,7 +5356,7 @@ }, "documents": { "title": "Documents", - "description": "View and how the months are arranged." + "description": "View and month arrangement." } }, "dashboard": { @@ -5372,7 +5372,7 @@ "description": "Pick which ingest source wins when more than one records the same metric for the same day.", "integrationsHint": "Connect or disconnect data sources on the Integrations page.", "integrationsHintLink": "Open integrations", - "cardTitle": "Source priority by metric", + "cardTitle": "Ranking per metric", "help": "When several sources deliver the same value on the same day, the top source counts as canonical.", "resetDefaults": "Reset to defaults", "resetDefaultsTitle": "Reset the source order?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "Medical history", - "subtitle": "Manage your allergies and family history.", + "subtitle": "Your medical background, lifestyle, emergency details and what the AI may read.", "description": "Structured allergies and family history records." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "Change password", "changePasswordDescription": "Replace your current password with a new one.", - "passwordReset": "Password reset", "currentPassword": "Current password", "newPassword": "New password", "confirmNewPassword": "Confirm new password", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "Push notifications enabled!", "webPushUnsubscribed": "Push notifications disabled.", "webPushSubscribeFailed": "Activation failed", - "kiInsightsDescription": "Optional: Save your OpenAI key for daily, automatic evaluations in Insights.", "codexConnected": "ChatGPT connected successfully! Insights are now active.", "codexDisconnected": "ChatGPT connection removed.", "codexConnectionFailed": "ChatGPT connection failed. Please try again.", @@ -6090,7 +6088,7 @@ "admin-openai": "Admin OpenAI" }, "title": "Fallback chain", - "description": "If the primary provider fails, HealthLog walks the chain in order. Drag the rows to reorder, toggle the switch to disable a provider without removing it.", + "description": "If the active provider fails, HealthLog tries the next enabled one in this order.", "moveUp": "Move up", "moveDown": "Move down", "removeFromChain": "Remove from chain", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "Reset chain to defaults?", "resetConfirmBody": "The chain reverts to Codex → OpenAI → Anthropic → Local → Admin OpenAI. Your saved credentials are not touched." }, - "providerCardTitle": "AI provider", "activeProviderHeading": "Active provider", - "activeProviderBody": "Pick the provider you want to use first. The form below configures only the selected provider; the fallback chain at the bottom decides what happens if it fails.", "activeProviderLabel": "Primary provider", - "providerConfigTitle": "Provider configuration", "providerSelect": { "codex": "ChatGPT account (Codex)", "openai": "OpenAI (your API key)", @@ -6246,21 +6241,21 @@ "responseTimeoutInvalid": "Enter a number between 10 and 600 seconds.", "autoRead": { "title": "Read documents automatically with AI", - "subLabel": "Documents are read and indexed by your configured AI provider without a per-document tap.", + "subLabel": "Your AI provider reads and indexes each new document without a tap per document.", "honesty": "When on, each document you upload is sent to your configured AI provider to be read, described, and indexed for search — with no per-document confirmation. Turning it on also reaches backwards: documents you have already uploaded that carry no summary yet are sent too, up to 200 each time you switch it on. This happens on the server and the document's contents leave this machine to that provider. If your configured provider is a subscription connection (a signed-in AI account rather than an API key), that provider's own data settings apply — subscription providers may use the content to improve their models, and no data-processing agreement covers it. Documents read by a self-hosted local model never leave your server. Off by default; turn it on only if you accept this trade for your documents.", "confirm": "I understand — turn on", "cancel": "Cancel" }, "centralCodex": { "title": "Use the server's shared AI access", - "subLabel": "Route AI requests through the connection the operator set up for this server, alongside your own providers as a fallback.", + "subLabel": "Send AI requests through the server's shared connection, with your own providers as the fallback.", "honesty": "The shared access is a single signed-in AI account the operator connected for everyone on this server — not your own key. Requests you make on it are trained on by the provider by default and no data-processing agreement covers them, the account's hourly and weekly limits are shared with every other user who opted in, and your own configured providers are still tried first. Turn it on only if you accept this trade.", "confirm": "I understand — use connection", "cancel": "Cancel" }, "consent": { "title": "AI consent", - "activeSince": "Given on {date}. Your health data may be sent to the configured provider for the AI features.", + "activeSince": "Given on {date}: your health data may be sent to the configured provider for the AI features.", "withdrawn": "Withdrawn. Unless another consent covers them, the Coach and Insights no longer use the AI access this server provides, and no online model reads your documents. On your own key or a local model, the Coach and Insights keep working.", "withdraw": "Withdraw consent", "confirmBody": "Unless another consent you gave still covers them, these stop straight away: the Coach and Insights where they use the AI access this server provides, and reading documents with an online model. On your own key or a local model, the Coach and Insights keep working. Unless another consent still covers Insights, the notes a model wrote for you are deleted: status notes, the daily briefing, model-written period summaries, arrival lines and workout notes. Your Coach conversations, what the Coach remembered, your plans and your document summaries stay, and you can read or delete them yourself.", @@ -6271,7 +6266,7 @@ "error": "The withdrawal could not be saved. Please try again.", "documentReading": { "title": "Consent to reading documents", - "activeSince": "Given on {date}. Documents, lab report scans and medication descriptions may be sent to your AI service for reading.", + "activeSince": "Given on {date}: documents, lab scans and medication text may go to your AI service for reading.", "confirmBody": "Documents, lab report scans and medication descriptions are no longer sent for reading. Nothing you already have is deleted." } }, @@ -6305,7 +6300,9 @@ "high": "High" }, "coachNote": "In the Coach, the thinking depth from the Coach settings applies." - } + }, + "providerCardDescription": "The provider HealthLog asks first, and its key and model.", + "runtimeTitle": "Check and refresh" }, "dashboard": { "units": { @@ -6587,7 +6584,7 @@ "apiEndpointPath": "Path", "apiEndpointAuth": "Authentication", "apiEndpointExample": "Body example", - "dangerZone": "Delete All Data", + "dangerZone": "Delete all data", "dangerZoneDescription": "Erases your whole health record and every integration connection.", "dangerZoneConfirm": "Delete all data?", "dangerZoneConfirmDescription": "This permanently deletes everything in your record: measurements, medications, mood entries, lab results, cycle entries, documents, AI conversations and every integration connection, together with everything derived from them and anything you deleted earlier. Share links you gave to a doctor stop working immediately. Your account stays, along with the credentials you sign in with and display settings such as language, timezone and units. This cannot be undone.", @@ -7162,7 +7159,8 @@ "description": "This shares or exports your health data. Confirm it's you to continue.", "signInAgain": "Sign in again, then try once more. Your account has no password or passkey to confirm here.", "failed": "That did not work. Check what you entered and try again." - } + }, + "passwordTitle": "Password" }, "admin": { "title": "Administration", @@ -7274,7 +7272,7 @@ "workerRunning": "Running", "workerStopped": "Stopped", "lastReminderCheck": "Last Reminder Check", - "appSettings": "Application Settings", + "appSettings": "Application settings", "appSettingsDescription": "Global defaults for registration, language, and the timezone of new accounts.", "registrationEnabled": "Allow registration", "registrationEnabledDescription": "When disabled, new users cannot register.", @@ -7282,9 +7280,9 @@ "defaultLanguage": "Default language", "defaultLanguageDescription": "Used for new users and as fallback.", "defaultUserTimezone": "Default timezone for new accounts", - "defaultUserTimezoneDescription": "Used for new accounts that don't carry a browser-detected zone. Does not affect existing users.", + "defaultUserTimezoneDescription": "Used for new accounts without a browser-detected zone; existing accounts keep theirs.", "defaultUserTimezoneFallback": "Europe/Berlin (default)", - "servicesGlobal": "Services (global)", + "servicesGlobal": "Channels and API", "servicesGlobalDescription": "Disabled services are not available to any user.", "telegramGlobal": "Allow Telegram notifications.", "ntfyGlobal": "Allow ntfy notifications.", @@ -7295,16 +7293,16 @@ "offlineGeoFallback": "Online ({host}) — mount GeoLite2 databases and set GEOLITE2_DIR", "apiGlobal": "Allow API endpoints and API tokens.", "umamiTitle": "Umami", - "umamiDescription": "Web analytics with Umami", + "umamiDescription": "Web analytics with Umami.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "Error tracking with GlitchTip", + "glitchtipDescription": "Error tracking with GlitchTip.", "webPushVapidTitle": "Web Push VAPID", - "umamiEnabled": "Enable Umami tracking.", + "umamiEnabled": "Enable Umami tracking", "umamiScriptUrl": "Umami script URL", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "Umami website ID", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "Enable GlitchTip error tracking.", + "glitchtipEnabled": "Enable GlitchTip error tracking", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "GlitchTip environment", @@ -7366,8 +7364,8 @@ "title": "Module availability", "description": "Turn a module off for the whole server.", "saveError": "Could not update module availability.", - "detail": "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.", - "coachFollowsSwitch": "Follows the Coach switch under Assistant." + "detail": "Weight, blood pressure and pulse are core readings and always stay on.", + "coachFollowsSwitch": "Follows the Coach switch in the Coach section." }, "invites": { "title": "Invites", @@ -7452,7 +7450,6 @@ "tokenNeverUsed": "Never", "tokensEmptyTitle": "No API tokens yet", "tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.", - "loginOverview": "Login Overview", "loginOverviewDescription": "Sign-in and auth events across all accounts, filterable and exportable as CSV.", "allAuthEvents": "All auth events", "failedOnly": "Failed only", @@ -7496,7 +7493,7 @@ "authTokenAutoissueNative": "Native client token issued", "authTokenRefresh": "Token refreshed", "authTokenRevoke": "Token revoked", - "medicationReminders": "Medication Reminders", + "medicationReminders": "Medication reminders", "medicationRemindersDescription": "Thresholds for reminder badge color transitions on medication cards.", "notificationHealth": { "title": "Notification health", @@ -7560,7 +7557,7 @@ }, "services": { "title": "Services", - "subtitle": "Enable or disable notification channels and integrations system-wide." + "subtitle": "Turn notification channels and the API on or off for the whole server." }, "integrations": { "title": "Integrations", @@ -7601,7 +7598,7 @@ "subtitle": "Active bearer tokens issued to native clients and integrations." }, "login-overview": { - "title": "Login Overview", + "title": "Login overview", "subtitle": "Audit trail of authentication and admin events." }, "auditLog": { @@ -7622,7 +7619,7 @@ "empty": "No audit entries match the current filters." }, "app-logs": { - "title": "App Logs", + "title": "App logs", "subtitle": "Tail the most recent structured wide-events emitted by this process.", "processNote": "Showing app-process logs only — worker-process logs go to Loki when that integration is configured.", "filterTraceId": "Trace ID", @@ -7646,7 +7643,8 @@ "refresh": "Refresh", "eventDetails": "Event details", "closeDetails": "Close details", - "processDetail": "Buffer is volatile and capped at 500 entries." + "processDetail": "Buffer is volatile and capped at 500 entries.", + "cardTitle": "Recent events" }, "backups": { "title": "Backups", @@ -7830,7 +7828,6 @@ "encryption": { "title": "Encryption", "subtitle": "Encryption coverage and key-rotation status for data at rest.", - "loading": "Loading encryption status…", "loadError": "Failed to load encryption status.", "coverageTitle": "Coverage", "coverageDescription": "How many encrypted rows sit under each key id.", @@ -7908,7 +7905,7 @@ }, "carrier": "Carrier", "mfaRequired": "Require a second factor", - "mfaRequiredDescription": "Every account without an active second factor is sent to enrollment after sign-in. This prompts web users to enroll — it does not block direct API or native (Bearer) access for accounts not yet enrolled.", + "mfaRequiredDescription": "Accounts without a second factor are sent to set one up after a web sign-in; API and native (Bearer) access stays open.", "mfaEnforcedOn": "MFA on", "mfaEnforcedOff": "MFA off", "mfaEnforcedOnHint": "A second factor is required for this user. Click to stop requiring it.", @@ -8006,7 +8003,9 @@ "restartNote": "Restart HealthLog after the change.", "lastResort": "Last resort, only if you are certain the key is right and none of the three applies: set {setting} and restart. HealthLog then serves anyway and only logs the finding. This disables a safety check: with a wrong key every encrypted value fails and new data is written under that key.", "codes": "For the operator: API requests answer 503 with error code {code}, and /api/health reports reason {reason}." - } + }, + "loginOverviewCardTitle": "Sign-in events", + "userColumn": "User" }, "achievements": { "title": "Achievements", @@ -10697,7 +10696,7 @@ "UNKNOWN": "Not stated" }, "contactsPlaceholder": "Name and phone number of who to call", - "implantsPlaceholder": "e.g. pacemaker, insulin pump, metal implant", + "implantsPlaceholder": "E.g. pacemaker, insulin pump, metal implant", "notePlaceholder": "Anything a clinician should know in an emergency", "reportHint": "This appears on the first page of your doctor report.", "save": "Save", diff --git a/messages/es.json b/messages/es.json index ddf55c374..64a8af5ae 100644 --- a/messages/es.json +++ b/messages/es.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "Reserva: ≈ {days} días", "takeActionFor": "Tomar – {name}", "skipActionFor": "Omitir – {name}", - "reorderTitle": "Ajustar orden", "reorderDescription": "Define el orden de tus medicamentos: se aplica a la vista de tarjetas y a la de tabla.", "reorderSaved": "Orden guardado", "reorderSaveFailed": "No se pudo guardar el orden", @@ -4784,7 +4783,8 @@ "metricBodyWater": "Agua corporal", "metricBoneMass": "Masa ósea", "metricOxygenSaturation": "Saturación de oxígeno (SpO₂)", - "unsetExplanation": "Sin valor propio — se aplica el valor por defecto calculado." + "unsetExplanation": "Sin valor propio — se aplica el valor por defecto calculado.", + "cardTitle": "Rangos por métrica" }, "onboarding": { "errorGeneric": "Algo ha salido mal al finalizar la configuración. Inténtalo de nuevo.", @@ -5372,7 +5372,7 @@ "description": "Elige qué fuente prevalece cuando varias registran la misma métrica el mismo día.", "integrationsHint": "Conecta o desconecta fuentes de datos en la página de integraciones.", "integrationsHintLink": "Abrir integraciones", - "cardTitle": "Prioridad de fuentes por métrica", + "cardTitle": "Orden por métrica", "help": "Si varias fuentes entregan el mismo valor el mismo día, la fuente superior cuenta como canónica.", "resetDefaults": "Restablecer valores predeterminados", "resetDefaultsTitle": "¿Restablecer el orden de fuentes?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "Antecedentes médicos", - "subtitle": "Gestiona tus alergias y tus antecedentes familiares.", + "subtitle": "Tus antecedentes, tu estilo de vida, tus datos de emergencia y lo que la IA puede leer.", "description": "Registros estructurados de alergias y antecedentes familiares." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "Cambiar contraseña", "changePasswordDescription": "Sustituye tu contraseña actual por una nueva.", - "passwordReset": "Restablecer contraseña", "currentPassword": "Contraseña actual", "newPassword": "Nueva contraseña", "confirmNewPassword": "Confirmar nueva contraseña", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "¡Notificaciones push activadas!", "webPushUnsubscribed": "Notificaciones push desactivadas.", "webPushSubscribeFailed": "Falló la activación", - "kiInsightsDescription": "Opcional: guarda tu clave de OpenAI para análisis diarios y automáticos en Insights.", "codexConnected": "¡ChatGPT conectado correctamente! Insights ya está activo.", "codexDisconnected": "Conexión con ChatGPT eliminada.", "codexConnectionFailed": "Falló la conexión con ChatGPT. Inténtalo de nuevo.", @@ -6090,7 +6088,7 @@ "admin-openai": "OpenAI de administrador" }, "title": "Cadena de respaldo", - "description": "Si el proveedor principal falla, HealthLog recorre la cadena en orden. Arrastra las filas para reordenarlas; usa el interruptor para desactivar un proveedor sin eliminarlo.", + "description": "Si el proveedor activo falla, HealthLog prueba el siguiente activado en este orden.", "moveUp": "Subir", "moveDown": "Bajar", "removeFromChain": "Quitar de la cadena", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "¿Restablecer la cadena a los valores predeterminados?", "resetConfirmBody": "La cadena vuelve a Codex → OpenAI → Anthropic → Local → OpenAI de administrador. Tus credenciales guardadas no se modifican." }, - "providerCardTitle": "Proveedor de IA", "activeProviderHeading": "Proveedor activo", - "activeProviderBody": "Elige el proveedor que quieres usar primero. El formulario de abajo configura únicamente el proveedor seleccionado; la cadena de respaldo del final decide qué ocurre si falla.", "activeProviderLabel": "Proveedor principal", - "providerConfigTitle": "Configuración del proveedor", "providerSelect": { "codex": "Cuenta de ChatGPT (Codex)", "openai": "OpenAI (tu clave de API)", @@ -6253,14 +6248,14 @@ }, "centralCodex": { "title": "Usar el acceso de IA compartido del servidor", - "subLabel": "Enruta las solicitudes de IA a través de la conexión que el operador configuró para este servidor, junto a tus propios proveedores como alternativa.", + "subLabel": "Las solicitudes de IA pasan por la conexión compartida del servidor, con tus propios proveedores como respaldo.", "honesty": "El acceso compartido es una única cuenta de IA con sesión iniciada que el operador conectó para todos en este servidor, no tu propia clave. Las solicitudes que hagas se usan de forma predeterminada para entrenar los modelos del proveedor y ningún acuerdo de tratamiento de datos las cubre, los límites por hora y semanales de la cuenta se comparten con todos los demás que se han unido, y tus propios proveedores se prueban primero. Actívalo solo si aceptas este compromiso.", "confirm": "Entendido: usar la conexión", "cancel": "Cancelar" }, "consent": { "title": "Consentimiento de IA", - "activeSince": "Otorgado el {date}. Tus datos de salud pueden enviarse al proveedor configurado para las funciones de IA.", + "activeSince": "Otorgado el {date}: tus datos de salud pueden enviarse al proveedor configurado para las funciones de IA.", "withdrawn": "Retirado. Salvo que otro consentimiento lo cubra, el Coach e Insights ya no usan el acceso de IA de este servidor y ningún modelo en línea lee tus documentos. Con tu propia clave o un modelo local, el Coach e Insights siguen funcionando.", "withdraw": "Retirar el consentimiento", "confirmBody": "Salvo que otro consentimiento tuyo los siga cubriendo, se detienen de inmediato: el Coach e Insights cuando usan el acceso de IA de este servidor, y la lectura de documentos con un modelo en línea. Con tu propia clave o un modelo local, el Coach e Insights siguen funcionando. Salvo que otro consentimiento siga cubriendo Insights, se eliminan las notas que un modelo escribió para ti: notas de estado, el resumen diario, los resúmenes de periodo escritos por un modelo, las líneas de llegada y las notas de entrenamiento. Tus conversaciones con el Coach, lo que el Coach recordaba, tus planes y los resúmenes de tus documentos se conservan, y puedes leerlos o eliminarlos tú mismo.", @@ -6271,7 +6266,7 @@ "error": "No se pudo guardar la retirada. Inténtalo de nuevo.", "documentReading": { "title": "Consentimiento para leer documentos", - "activeSince": "Dado el {date}. Los documentos, los informes de laboratorio escaneados y las descripciones de medicamentos pueden enviarse a tu servicio de IA para leerlos.", + "activeSince": "Dado el {date}: documentos, análisis escaneados y textos de medicamentos pueden ir a tu servicio de IA para leerlos.", "confirmBody": "Los documentos, los informes de laboratorio escaneados y las descripciones de medicamentos dejan de enviarse para leerlos. No se elimina nada de lo que ya tienes." } }, @@ -6305,7 +6300,9 @@ "high": "Alto" }, "coachNote": "En el Coach se aplica la profundidad de pensamiento de los ajustes del Coach." - } + }, + "providerCardDescription": "El proveedor al que HealthLog pregunta primero, con su clave y su modelo.", + "runtimeTitle": "Comprobar y actualizar" }, "dashboard": { "units": { @@ -7162,7 +7159,8 @@ "description": "Esto comparte o exporta tus datos de salud. Confirma que eres tú para continuar.", "signInAgain": "Vuelve a iniciar sesión y inténtalo de nuevo. Tu cuenta no tiene contraseña ni llave de acceso que confirmar aquí.", "failed": "No ha funcionado. Revisa lo que has introducido e inténtalo de nuevo." - } + }, + "passwordTitle": "Contraseña" }, "admin": { "title": "Administration", @@ -7282,9 +7280,9 @@ "defaultLanguage": "Idioma predeterminado", "defaultLanguageDescription": "Se usa para los nuevos usuarios y como reserva.", "defaultUserTimezone": "Zona horaria predeterminada para cuentas nuevas", - "defaultUserTimezoneDescription": "Se usa para cuentas nuevas que no tienen una zona detectada por el navegador. No afecta a los usuarios existentes.", + "defaultUserTimezoneDescription": "Se usa en cuentas nuevas sin zona detectada por el navegador; las cuentas existentes conservan la suya.", "defaultUserTimezoneFallback": "Europe/Berlin (predeterminada)", - "servicesGlobal": "Servicios (global)", + "servicesGlobal": "Canales y API", "servicesGlobalDescription": "Los servicios desactivados no están disponibles para ningún usuario.", "telegramGlobal": "Permitir notificaciones de Telegram.", "ntfyGlobal": "Permitir notificaciones de ntfy.", @@ -7295,16 +7293,16 @@ "offlineGeoFallback": "En línea ({host}) — monta las bases GeoLite2 y define GEOLITE2_DIR", "apiGlobal": "Permitir endpoints de API y tokens de API.", "umamiTitle": "Umami", - "umamiDescription": "Analítica web con Umami", + "umamiDescription": "Analítica web con Umami.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "Seguimiento de errores con GlitchTip", + "glitchtipDescription": "Seguimiento de errores con GlitchTip.", "webPushVapidTitle": "Web Push VAPID", - "umamiEnabled": "Activar el seguimiento de Umami.", + "umamiEnabled": "Activar el seguimiento de Umami", "umamiScriptUrl": "URL del script de Umami", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "ID del sitio web de Umami", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "Activar el seguimiento de errores de GlitchTip.", + "glitchtipEnabled": "Activar el seguimiento de errores de GlitchTip", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "Entorno de GlitchTip", @@ -7366,8 +7364,8 @@ "title": "Disponibilidad de módulos", "description": "Desactiva un módulo para todo el servidor.", "saveError": "No se pudo actualizar la disponibilidad de módulos.", - "detail": "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.", - "coachFollowsSwitch": "Sigue el interruptor del Coach en Asistente." + "detail": "El peso, la presión arterial y el pulso son datos básicos y siempre están activos.", + "coachFollowsSwitch": "Sigue el interruptor del Coach en la sección Coach." }, "invites": { "title": "Invitaciones", @@ -7452,7 +7450,6 @@ "tokenNeverUsed": "Nunca", "tokensEmptyTitle": "Aún no hay tokens de API", "tokensEmptyDescription": "Los tokens se emiten cuando un cliente nativo inicia sesión o desde Ajustes → Cuenta.", - "loginOverview": "Resumen de inicios de sesión", "loginOverviewDescription": "Eventos de inicio de sesión y autenticación de todas las cuentas, filtrables y exportables como CSV.", "allAuthEvents": "Todos los eventos de autenticación", "failedOnly": "Solo fallidos", @@ -7560,7 +7557,7 @@ }, "services": { "title": "Servicios", - "subtitle": "Activa o desactiva los canales de notificación y las integraciones en todo el sistema." + "subtitle": "Activa o desactiva los canales de notificación y la API en todo el servidor." }, "integrations": { "title": "Integraciones", @@ -7646,7 +7643,8 @@ "refresh": "Actualizar", "eventDetails": "Detalles del evento", "closeDetails": "Cerrar detalles", - "processDetail": "El búfer es volátil y está limitado a 500 entradas." + "processDetail": "El búfer es volátil y está limitado a 500 entradas.", + "cardTitle": "Eventos recientes" }, "backups": { "title": "Copias de seguridad", @@ -7830,7 +7828,6 @@ "encryption": { "title": "Cifrado", "subtitle": "Cobertura de cifrado y estado de rotación de claves para los datos en reposo.", - "loading": "Cargando el estado de cifrado...", "loadError": "No se pudo cargar el estado de cifrado.", "coverageTitle": "Cobertura", "coverageDescription": "Cuántas filas cifradas hay bajo cada id de clave.", @@ -7908,7 +7905,7 @@ }, "carrier": "Operador", "mfaRequired": "Exigir un segundo factor", - "mfaRequiredDescription": "Cada cuenta sin un segundo factor activo se dirige a la configuración tras iniciar sesión. Esto pide a los usuarios web que lo configuren, pero no bloquea el acceso directo por API o nativo (Bearer) de las cuentas que aún no lo tienen.", + "mfaRequiredDescription": "Las cuentas sin segundo factor van a configurarlo tras iniciar sesión en la web; el acceso por API o nativo (Bearer) sigue abierto.", "mfaEnforcedOn": "MFA activado", "mfaEnforcedOff": "MFA desactivado", "mfaEnforcedOnHint": "Este usuario debe usar un segundo factor. Haz clic para dejar de exigirlo.", @@ -8006,7 +8003,9 @@ "restartNote": "Reinicia HealthLog después del cambio.", "lastResort": "Último recurso, solo si estás seguro de que la clave es correcta y ninguna de las tres opciones sirve: define {setting} y reinicia. HealthLog sirve igualmente y solo registra el hallazgo. Esto desactiva una comprobación de seguridad: con una clave incorrecta falla cada valor cifrado y los datos nuevos se escriben con esa clave.", "codes": "Para el administrador: las peticiones a la API responden 503 con el código de error {code}, y /api/health indica el motivo {reason}." - } + }, + "loginOverviewCardTitle": "Eventos de inicio de sesión", + "userColumn": "Usuario" }, "achievements": { "title": "Logros", diff --git a/messages/fr.json b/messages/fr.json index c1ff33246..6566f9959 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "Réserve : ≈ {days} jours", "takeActionFor": "Prendre – {name}", "skipActionFor": "Passer – {name}", - "reorderTitle": "Modifier l'ordre", "reorderDescription": "Définis l'ordre de tes médicaments – il s'applique à la vue cartes et à la vue tableau.", "reorderSaved": "Ordre enregistré", "reorderSaveFailed": "L'ordre n'a pas pu être enregistré", @@ -4784,7 +4783,8 @@ "metricBodyWater": "Eau corporelle", "metricBoneMass": "Masse osseuse", "metricOxygenSaturation": "Saturation en oxygène (SpO₂)", - "unsetExplanation": "Pas de valeur personnelle — la valeur par défaut calculée s’applique." + "unsetExplanation": "Pas de valeur personnelle — la valeur par défaut calculée s’applique.", + "cardTitle": "Plages par métrique" }, "onboarding": { "errorGeneric": "Une erreur est survenue à la fin de la configuration. Réessaie.", @@ -5372,7 +5372,7 @@ "description": "Choisissez quelle source prévaut quand plusieurs enregistrent la même métrique le même jour.", "integrationsHint": "Connectez ou déconnectez des sources de données sur la page Intégrations.", "integrationsHintLink": "Ouvrir les intégrations", - "cardTitle": "Priorité des sources par métrique", + "cardTitle": "Classement par métrique", "help": "Si plusieurs sources fournissent la même valeur le même jour, la source en tête compte comme canonique.", "resetDefaults": "Rétablir les valeurs par défaut", "resetDefaultsTitle": "Réinitialiser l’ordre des sources ?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "Antécédents médicaux", - "subtitle": "Gérez vos allergies et vos antécédents familiaux.", + "subtitle": "Vos antécédents, votre mode de vie, vos informations d’urgence et ce que l’IA peut lire.", "description": "Dossiers structurés des allergies et des antécédents familiaux." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "Changer le mot de passe", "changePasswordDescription": "Remplacez votre mot de passe actuel par un nouveau.", - "passwordReset": "Réinitialisation du mot de passe", "currentPassword": "Mot de passe actuel", "newPassword": "Nouveau mot de passe", "confirmNewPassword": "Confirmer le nouveau mot de passe", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "Notifications push activées !", "webPushUnsubscribed": "Notifications push désactivées.", "webPushSubscribeFailed": "Échec de l’activation", - "kiInsightsDescription": "Facultatif : enregistrez votre clé OpenAI pour des analyses quotidiennes et automatiques dans Insights.", "codexConnected": "ChatGPT connecté ! Insights est maintenant actif.", "codexDisconnected": "Connexion à ChatGPT supprimée.", "codexConnectionFailed": "Échec de la connexion à ChatGPT. Veuillez réessayer.", @@ -6090,7 +6088,7 @@ "admin-openai": "OpenAI administrateur" }, "title": "Chaîne de secours", - "description": "Si le fournisseur principal échoue, HealthLog parcourt la chaîne dans l’ordre. Faites glisser les lignes pour les réorganiser ; utilisez l’interrupteur pour désactiver un fournisseur sans le supprimer.", + "description": "Si le fournisseur actif échoue, HealthLog essaie le suivant activé, dans cet ordre.", "moveUp": "Monter", "moveDown": "Descendre", "removeFromChain": "Retirer de la chaîne", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "Réinitialiser la chaîne aux valeurs par défaut ?", "resetConfirmBody": "La chaîne revient à Codex → OpenAI → Anthropic → Local → OpenAI administrateur. Vos identifiants enregistrés ne sont pas affectés." }, - "providerCardTitle": "Fournisseur d'IA", "activeProviderHeading": "Fournisseur actif", - "activeProviderBody": "Choisissez le fournisseur à utiliser en premier. Le formulaire ci-dessous configure uniquement le fournisseur sélectionné ; la chaîne de secours en bas détermine ce qui se passe en cas d’échec.", "activeProviderLabel": "Fournisseur principal", - "providerConfigTitle": "Configuration du fournisseur", "providerSelect": { "codex": "Compte ChatGPT (Codex)", "openai": "OpenAI (votre clé API)", @@ -6253,14 +6248,14 @@ }, "centralCodex": { "title": "Utiliser l'accès IA partagé du serveur", - "subLabel": "Acheminez les requêtes IA via la connexion que l'opérateur a configurée pour ce serveur, en complément de vos propres fournisseurs comme solution de repli.", + "subLabel": "Les requêtes IA passent par la connexion partagée du serveur, vos propres fournisseurs servant de repli.", "honesty": "L'accès partagé est un unique compte IA connecté que l'opérateur a relié pour tout le monde sur ce serveur, et non votre propre clé. Les requêtes que vous y faites servent par défaut à entraîner les modèles du fournisseur et aucun accord de traitement des données ne les couvre, les limites horaires et hebdomadaires du compte sont partagées avec tous les autres qui ont accepté, et vos propres fournisseurs sont essayés en premier. Ne l'activez que si vous acceptez ce compromis.", "confirm": "Compris — utiliser la connexion", "cancel": "Annuler" }, "consent": { "title": "Consentement IA", - "activeSince": "Donné le {date}. Tes données de santé peuvent être transmises au fournisseur configuré pour les fonctions IA.", + "activeSince": "Donné le {date} : vos données de santé peuvent être transmises au fournisseur configuré pour les fonctions IA.", "withdrawn": "Retiré. Sauf si un autre consentement le couvre, le Coach et Insights n'utilisent plus l'accès IA fourni par ce serveur, et aucun modèle en ligne ne lit vos documents. Avec votre propre clé ou un modèle local, le Coach et Insights continuent de fonctionner.", "withdraw": "Retirer le consentement", "confirmBody": "Sauf si un autre consentement les couvre encore, ceci s'arrête immédiatement : le Coach et Insights lorsqu'ils utilisent l'accès IA fourni par ce serveur, et la lecture de documents par un modèle en ligne. Avec votre propre clé ou un modèle local, le Coach et Insights continuent de fonctionner. Sauf si un autre consentement couvre encore Insights, les notes qu'un modèle a écrites pour vous sont supprimées : notes d'état, briefing quotidien, résumés de période écrits par un modèle, lignes d'arrivée et notes d'entraînement. Vos conversations avec le Coach, ce que le Coach a retenu, vos plans et les résumés de vos documents sont conservés, et vous pouvez les lire ou les supprimer vous-même.", @@ -6271,7 +6266,7 @@ "error": "Le retrait n'a pas pu être enregistré. Réessaie.", "documentReading": { "title": "Consentement à la lecture de documents", - "activeSince": "Donné le {date}. Les documents, les comptes rendus d'analyses numérisés et les descriptions de médicaments peuvent être envoyés à votre service d'IA pour lecture.", + "activeSince": "Donné le {date} : documents, analyses numérisées et textes de médicaments peuvent être lus par votre service d'IA.", "confirmBody": "Les documents, les comptes rendus d'analyses numérisés et les descriptions de médicaments ne sont plus envoyés pour lecture. Rien de ce que vous avez déjà n'est supprimé." } }, @@ -6305,7 +6300,9 @@ "high": "Élevé" }, "coachNote": "Dans le Coach, c'est la profondeur de réflexion des réglages du Coach qui s'applique." - } + }, + "providerCardDescription": "Le fournisseur que HealthLog sollicite en premier, avec sa clé et son modèle.", + "runtimeTitle": "Vérifier et actualiser" }, "dashboard": { "units": { @@ -7162,7 +7159,8 @@ "description": "Cette action partage ou exporte vos données de santé. Confirmez qu'il s'agit bien de vous pour continuer.", "signInAgain": "Reconnectez-vous, puis réessayez. Votre compte n'a ni mot de passe ni clé d'accès à confirmer ici.", "failed": "Cela n'a pas fonctionné. Vérifiez votre saisie et réessayez." - } + }, + "passwordTitle": "Mot de passe" }, "admin": { "title": "Administration", @@ -7282,9 +7280,9 @@ "defaultLanguage": "Langue par défaut", "defaultLanguageDescription": "Utilisé pour les nouveaux utilisateurs et comme solution de repli.", "defaultUserTimezone": "Fuseau horaire par défaut pour les nouveaux comptes", - "defaultUserTimezoneDescription": "Utilisé pour les nouveaux comptes sans fuseau détecté par le navigateur. N'affecte pas les utilisateurs existants.", + "defaultUserTimezoneDescription": "Utilisé pour les nouveaux comptes sans fuseau détecté par le navigateur ; les comptes existants gardent le leur.", "defaultUserTimezoneFallback": "Europe/Berlin (par défaut)", - "servicesGlobal": "Services (global)", + "servicesGlobal": "Canaux et API", "servicesGlobalDescription": "Les services désactivés ne sont disponibles pour aucun utilisateur.", "telegramGlobal": "Autoriser les notifications Telegram.", "ntfyGlobal": "Autoriser les notifications ntfy.", @@ -7295,16 +7293,16 @@ "offlineGeoFallback": "En ligne ({host}) — montez les bases GeoLite2 et définissez GEOLITE2_DIR", "apiGlobal": "Autoriser les points de terminaison d'API et les jetons d'API.", "umamiTitle": "Umami", - "umamiDescription": "Analyse web avec Umami", + "umamiDescription": "Analyse web avec Umami.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "Suivi des erreurs avec GlitchTip", + "glitchtipDescription": "Suivi des erreurs avec GlitchTip.", "webPushVapidTitle": "Web Push VAPID", - "umamiEnabled": "Activer le suivi Umami.", + "umamiEnabled": "Activer le suivi Umami", "umamiScriptUrl": "URL du script Umami", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "ID du site web Umami", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "Activer le suivi des erreurs GlitchTip.", + "glitchtipEnabled": "Activer le suivi des erreurs GlitchTip", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "Environnement GlitchTip", @@ -7366,8 +7364,8 @@ "title": "Disponibilité des modules", "description": "Désactivez un module pour tout le serveur.", "saveError": "Impossible de mettre à jour la disponibilité des modules.", - "detail": "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.", - "coachFollowsSwitch": "Suit l'interrupteur Coach dans Assistant." + "detail": "Le poids, la tension et le pouls sont des mesures essentielles et restent toujours actifs.", + "coachFollowsSwitch": "Suit l'interrupteur Coach de la section Coach." }, "invites": { "title": "Invitations", @@ -7452,7 +7450,6 @@ "tokenNeverUsed": "Jamais", "tokensEmptyTitle": "Aucun jeton d'API pour l'instant", "tokensEmptyDescription": "Les jetons sont émis lorsqu'un client natif se connecte ou via Paramètres → Compte.", - "loginOverview": "Aperçu des connexions", "loginOverviewDescription": "Événements de connexion et d’authentification de tous les comptes, filtrables et exportables en CSV.", "allAuthEvents": "Tous les événements d'authentification", "failedOnly": "Échecs uniquement", @@ -7560,7 +7557,7 @@ }, "services": { "title": "Services", - "subtitle": "Activez ou désactivez les canaux de notification et les intégrations à l'échelle du système." + "subtitle": "Activez ou désactivez les canaux de notification et l'API pour tout le serveur." }, "integrations": { "title": "Intégrations", @@ -7646,7 +7643,8 @@ "refresh": "Actualiser", "eventDetails": "Détails de l'événement", "closeDetails": "Fermer les détails", - "processDetail": "Le tampon est volatil et limité à 500 entrées." + "processDetail": "Le tampon est volatil et limité à 500 entrées.", + "cardTitle": "Événements récents" }, "backups": { "title": "Sauvegardes", @@ -7830,7 +7828,6 @@ "encryption": { "title": "Chiffrement", "subtitle": "Couverture du chiffrement et état de la rotation des clés pour les données au repos.", - "loading": "Chargement de l'état du chiffrement...", "loadError": "Échec du chargement de l'état du chiffrement.", "coverageTitle": "Couverture", "coverageDescription": "Combien de lignes chiffrées relèvent de chaque id de clé.", @@ -7908,7 +7905,7 @@ }, "carrier": "Opérateur", "mfaRequired": "Exiger un second facteur", - "mfaRequiredDescription": "Chaque compte sans deuxième facteur actif est dirigé vers la configuration après la connexion. Cela invite les utilisateurs web à l'activer, mais ne bloque pas l'accès direct par API ou natif (Bearer) pour les comptes pas encore configurés.", + "mfaRequiredDescription": "Les comptes sans deuxième facteur sont dirigés vers sa configuration après une connexion web ; l'accès par API ou natif (Bearer) reste ouvert.", "mfaEnforcedOn": "MFA activé", "mfaEnforcedOff": "MFA désactivé", "mfaEnforcedOnHint": "Un second facteur est requis pour cet utilisateur. Cliquez pour ne plus l'exiger.", @@ -8006,7 +8003,9 @@ "restartNote": "Redémarre HealthLog après la modification.", "lastResort": "Dernier recours, seulement si tu es sûr que la clé est la bonne et qu'aucune des trois solutions ne convient : définis {setting} et redémarre. HealthLog sert alors quand même et se contente de journaliser le constat. Cela désactive une vérification de sécurité : avec une mauvaise clé, chaque valeur chiffrée échoue et les nouvelles données sont écrites sous cette clé.", "codes": "Pour l'administrateur : les requêtes API répondent 503 avec le code d'erreur {code}, et /api/health indique la raison {reason}." - } + }, + "loginOverviewCardTitle": "Événements de connexion", + "userColumn": "Utilisateur" }, "achievements": { "title": "Réussites", diff --git a/messages/it.json b/messages/it.json index d6cd9c4f4..9ee25c522 100644 --- a/messages/it.json +++ b/messages/it.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "Scorta: ≈ {days} giorni", "takeActionFor": "Assumi – {name}", "skipActionFor": "Salta – {name}", - "reorderTitle": "Modifica ordine", "reorderDescription": "Imposta l'ordine dei tuoi farmaci: vale per la vista a schede e per la tabella.", "reorderSaved": "Ordine salvato", "reorderSaveFailed": "Impossibile salvare l’ordine", @@ -4784,7 +4783,8 @@ "metricBodyWater": "Acqua corporea", "metricBoneMass": "Massa ossea", "metricOxygenSaturation": "Saturazione di ossigeno (SpO₂)", - "unsetExplanation": "Nessun valore personale — è attivo il predefinito calcolato." + "unsetExplanation": "Nessun valore personale — è attivo il predefinito calcolato.", + "cardTitle": "Intervalli per metrica" }, "onboarding": { "errorGeneric": "Qualcosa è andato storto durante il completamento della configurazione. Riprova.", @@ -5372,7 +5372,7 @@ "description": "Scegli quale fonte prevale quando più di una registra la stessa metrica lo stesso giorno.", "integrationsHint": "Collega o scollega le fonti dati nella pagina Integrazioni.", "integrationsHintLink": "Apri le integrazioni", - "cardTitle": "Priorità delle fonti per metrica", + "cardTitle": "Ordine per metrica", "help": "Se più fonti forniscono lo stesso valore nello stesso giorno, la fonte in cima conta come canonica.", "resetDefaults": "Ripristina i valori predefiniti", "resetDefaultsTitle": "Reimpostare l’ordine delle fonti?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "Anamnesi", - "subtitle": "Gestisci le tue allergie e la tua anamnesi familiare.", + "subtitle": "La tua anamnesi, lo stile di vita, i dati di emergenza e ciò che l’IA può leggere.", "description": "Record strutturati di allergie e anamnesi familiare." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "Cambia password", "changePasswordDescription": "Sostituisci la password attuale con una nuova.", - "passwordReset": "Reimposta password", "currentPassword": "Password attuale", "newPassword": "Nuova password", "confirmNewPassword": "Conferma nuova password", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "Notifiche push attivate!", "webPushUnsubscribed": "Notifiche push disattivate.", "webPushSubscribeFailed": "Attivazione non riuscita", - "kiInsightsDescription": "Facoltativo: salva la tua chiave OpenAI per analisi giornaliere e automatiche in Insights.", "codexConnected": "ChatGPT connesso correttamente! Insights è ora attivo.", "codexDisconnected": "Connessione a ChatGPT rimossa.", "codexConnectionFailed": "Connessione a ChatGPT non riuscita. Riprova.", @@ -6090,7 +6088,7 @@ "admin-openai": "OpenAI amministratore" }, "title": "Catena di fallback", - "description": "Se il provider principale fallisce, HealthLog percorre la catena in ordine. Trascina le righe per riordinarle; usa l’interruttore per disattivare un provider senza rimuoverlo.", + "description": "Se il fornitore attivo non risponde, HealthLog prova il successivo attivo in quest’ordine.", "moveUp": "Sposta su", "moveDown": "Sposta giù", "removeFromChain": "Rimuovi dalla catena", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "Ripristinare la catena ai valori predefiniti?", "resetConfirmBody": "La catena torna a Codex → OpenAI → Anthropic → Locale → OpenAI amministratore. Le credenziali salvate non vengono toccate." }, - "providerCardTitle": "Provider IA", "activeProviderHeading": "Provider attivo", - "activeProviderBody": "Scegli il provider da usare per primo. Il modulo qui sotto configura solo il provider selezionato; la catena di fallback in fondo decide cosa accade se fallisce.", "activeProviderLabel": "Provider principale", - "providerConfigTitle": "Configurazione del provider", "providerSelect": { "codex": "Account ChatGPT (Codex)", "openai": "OpenAI (la tua chiave API)", @@ -6253,14 +6248,14 @@ }, "centralCodex": { "title": "Usa l'accesso IA condiviso del server", - "subLabel": "Instrada le richieste IA attraverso la connessione che l'operatore ha configurato per questo server, insieme ai tuoi provider come ripiego.", + "subLabel": "Le richieste IA passano dalla connessione condivisa del server, con i tuoi provider come ripiego.", "honesty": "L'accesso condiviso è un unico account IA con accesso eseguito che l'operatore ha collegato per tutti su questo server, non la tua chiave. Le richieste che vi effettui vengono usate per impostazione predefinita per addestrare i modelli del provider e nessun accordo sul trattamento dei dati le copre, i limiti orari e settimanali dell'account sono condivisi con tutti gli altri che hanno aderito, e i tuoi provider vengono comunque provati per primi. Attivalo solo se accetti questo compromesso.", "confirm": "Ho capito — usa la connessione", "cancel": "Annulla" }, "consent": { "title": "Consenso IA", - "activeSince": "Concesso il {date}. I tuoi dati sanitari possono essere inviati al provider configurato per le funzioni IA.", + "activeSince": "Concesso il {date}: i tuoi dati sanitari possono essere inviati al provider configurato per le funzioni IA.", "withdrawn": "Revocato. Salvo che un altro consenso lo copra, il Coach e Insights non usano più l'accesso IA fornito da questo server e nessun modello online legge i tuoi documenti. Con la tua chiave o un modello locale, il Coach e Insights continuano a funzionare.", "withdraw": "Revoca il consenso", "confirmBody": "Salvo che un altro consenso li copra ancora, si fermano subito: il Coach e Insights quando usano l'accesso IA fornito da questo server, e la lettura dei documenti con un modello online. Con la tua chiave o un modello locale, il Coach e Insights continuano a funzionare. Salvo che un altro consenso copra ancora Insights, le note che un modello ha scritto per te vengono eliminate: note di stato, il riepilogo giornaliero, i riepiloghi di periodo scritti da un modello, le righe di arrivo e le note sugli allenamenti. Le tue conversazioni con il Coach, ciò che il Coach ricordava, i tuoi piani e i riepiloghi dei tuoi documenti restano, e puoi leggerli o eliminarli tu stesso.", @@ -6271,7 +6266,7 @@ "error": "Non è stato possibile salvare la revoca. Riprova.", "documentReading": { "title": "Consenso alla lettura dei documenti", - "activeSince": "Dato il {date}. Documenti, referti di laboratorio scansionati e descrizioni di farmaci possono essere inviati al tuo servizio di IA per la lettura.", + "activeSince": "Dato il {date}: documenti, referti scansionati e testi dei farmaci possono andare al tuo servizio di IA per la lettura.", "confirmBody": "Documenti, referti di laboratorio scansionati e descrizioni di farmaci non vengono più inviati per la lettura. Nulla di ciò che hai già viene eliminato." } }, @@ -6305,7 +6300,9 @@ "high": "Alto" }, "coachNote": "Nel Coach vale la profondità di ragionamento delle impostazioni del Coach." - } + }, + "providerCardDescription": "Il fornitore che HealthLog interpella per primo, con chiave e modello.", + "runtimeTitle": "Verifica e aggiorna" }, "dashboard": { "units": { @@ -7162,7 +7159,8 @@ "description": "Questa azione condivide o esporta i tuoi dati sanitari. Conferma che sei tu per continuare.", "signInAgain": "Accedi di nuovo, poi riprova. Il tuo account non ha una password o una passkey da confermare qui.", "failed": "Non ha funzionato. Controlla quanto inserito e riprova." - } + }, + "passwordTitle": "Password" }, "admin": { "title": "Administration", @@ -7282,9 +7280,9 @@ "defaultLanguage": "Lingua predefinita", "defaultLanguageDescription": "Usata per i nuovi utenti e come ripiego.", "defaultUserTimezone": "Fuso orario predefinito per i nuovi account", - "defaultUserTimezoneDescription": "Usato per i nuovi account privi di un fuso rilevato dal browser. Non influisce sugli utenti esistenti.", + "defaultUserTimezoneDescription": "Usato per i nuovi account senza fuso rilevato dal browser; gli account esistenti mantengono il proprio.", "defaultUserTimezoneFallback": "Europe/Berlin (predefinito)", - "servicesGlobal": "Servizi (globale)", + "servicesGlobal": "Canali e API", "servicesGlobalDescription": "I servizi disattivati non sono disponibili per alcun utente.", "telegramGlobal": "Consentire le notifiche Telegram.", "ntfyGlobal": "Consentire le notifiche ntfy.", @@ -7295,16 +7293,16 @@ "offlineGeoFallback": "Online ({host}) — monta i database GeoLite2 e imposta GEOLITE2_DIR", "apiGlobal": "Consentire endpoint API e token API.", "umamiTitle": "Umami", - "umamiDescription": "Analisi web con Umami", + "umamiDescription": "Analisi web con Umami.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "Tracciamento degli errori con GlitchTip", + "glitchtipDescription": "Tracciamento degli errori con GlitchTip.", "webPushVapidTitle": "Web Push VAPID", - "umamiEnabled": "Abilitare il tracciamento Umami.", + "umamiEnabled": "Abilita il tracciamento Umami", "umamiScriptUrl": "URL dello script Umami", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "ID del sito web Umami", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "Abilitare il tracciamento degli errori GlitchTip.", + "glitchtipEnabled": "Abilita il tracciamento degli errori GlitchTip", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "Ambiente GlitchTip", @@ -7366,8 +7364,8 @@ "title": "Disponibilità dei moduli", "description": "Disattiva un modulo per l'intero server.", "saveError": "Impossibile aggiornare la disponibilità dei moduli.", - "detail": "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.", - "coachFollowsSwitch": "Segue l'interruttore Coach in Assistente." + "detail": "Peso, pressione e polso sono misure di base e restano sempre attivi.", + "coachFollowsSwitch": "Segue l'interruttore Coach nella sezione Coach." }, "invites": { "title": "Inviti", @@ -7452,7 +7450,6 @@ "tokenNeverUsed": "Mai", "tokensEmptyTitle": "Ancora nessun token API", "tokensEmptyDescription": "I token vengono emessi quando un client nativo accede o tramite Impostazioni → Account.", - "loginOverview": "Panoramica degli accessi", "loginOverviewDescription": "Eventi di accesso e autenticazione di tutti gli account, filtrabili ed esportabili in CSV.", "allAuthEvents": "Tutti gli eventi di autenticazione", "failedOnly": "Solo non riusciti", @@ -7560,7 +7557,7 @@ }, "services": { "title": "Servizi", - "subtitle": "Abilita o disabilita i canali di notifica e le integrazioni a livello di sistema." + "subtitle": "Attiva o disattiva i canali di notifica e l'API per l'intero server." }, "integrations": { "title": "Integrazioni", @@ -7646,7 +7643,8 @@ "refresh": "Aggiorna", "eventDetails": "Dettagli dell'evento", "closeDetails": "Chiudi dettagli", - "processDetail": "Il buffer è volatile e limitato a 500 voci." + "processDetail": "Il buffer è volatile e limitato a 500 voci.", + "cardTitle": "Eventi recenti" }, "backups": { "title": "Backup", @@ -7830,7 +7828,6 @@ "encryption": { "title": "Crittografia", "subtitle": "Copertura della crittografia e stato della rotazione delle chiavi per i dati a riposo.", - "loading": "Caricamento dello stato della crittografia...", "loadError": "Impossibile caricare lo stato della crittografia.", "coverageTitle": "Copertura", "coverageDescription": "Quante righe cifrate stanno sotto ogni id di chiave.", @@ -7908,7 +7905,7 @@ }, "carrier": "Operatore", "mfaRequired": "Richiedi un secondo fattore", - "mfaRequiredDescription": "Ogni account senza un secondo fattore attivo viene indirizzato alla configurazione dopo l'accesso. Questo invita gli utenti web ad attivarlo, ma non blocca l'accesso diretto via API o nativo (Bearer) per gli account non ancora configurati.", + "mfaRequiredDescription": "Gli account senza secondo fattore vengono indirizzati alla configurazione dopo un accesso web; l'accesso via API o nativo (Bearer) resta aperto.", "mfaEnforcedOn": "MFA attivo", "mfaEnforcedOff": "MFA disattivato", "mfaEnforcedOnHint": "Per questo utente è richiesto un secondo fattore. Clicca per non richiederlo più.", @@ -8006,7 +8003,9 @@ "restartNote": "Riavvia HealthLog dopo la modifica.", "lastResort": "Ultima risorsa, solo se sei certo che la chiave sia giusta e nessuna delle tre soluzioni vale: imposta {setting} e riavvia. HealthLog serve comunque e si limita a registrare il problema nel log. Così si disattiva un controllo di sicurezza: con una chiave sbagliata ogni valore cifrato fallisce e i nuovi dati vengono scritti con quella chiave.", "codes": "Per chi gestisce il server: le richieste API rispondono 503 con il codice di errore {code}, e /api/health indica il motivo {reason}." - } + }, + "loginOverviewCardTitle": "Eventi di accesso", + "userColumn": "Utente" }, "achievements": { "title": "Obiettivi", diff --git a/messages/ko.json b/messages/ko.json index 56aec5aa9..0a57e4c7b 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "재고: 약 {days}일", "takeActionFor": "복용 – {name}", "skipActionFor": "건너뛰기 – {name}", - "reorderTitle": "순서 조정", "reorderDescription": "약의 순서를 정하세요 – 카드 보기와 표 보기 모두에 적용돼요.", "reorderSaved": "순서를 저장했어요", "reorderSaveFailed": "순서를 저장하지 못했어요", @@ -4784,7 +4783,8 @@ "metricBodyWater": "체수분", "metricBoneMass": "골량", "metricOxygenSaturation": "산소포화도(SpO₂)", - "unsetExplanation": "사용자 설정 없음 — 계산된 기본값을 써요." + "unsetExplanation": "사용자 설정 없음 — 계산된 기본값을 써요.", + "cardTitle": "지표별 범위" }, "onboarding": { "errorGeneric": "설정을 마치는 중 문제가 생겼어요. 다시 시도해 주세요.", @@ -5372,7 +5372,7 @@ "description": "같은 날 같은 지표를 여러 소스가 기록했을 때 어느 소스를 쓸지 골라요.", "integrationsHint": "데이터 소스 연결과 해제는 연동 페이지에서 해요.", "integrationsHintLink": "연동 열기", - "cardTitle": "지표별 소스 우선순위", + "cardTitle": "지표별 순위", "help": "같은 날 여러 소스가 같은 값을 보내면 맨 위 소스를 대표값으로 써요.", "resetDefaults": "기본값으로 되돌리기", "resetDefaultsTitle": "소스 순서를 되돌릴까요?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "병력", - "subtitle": "알레르기와 가족력을 관리해요.", + "subtitle": "병력, 생활 습관, 응급 정보와 AI가 읽을 수 있는 범위를 관리해요.", "description": "구조화된 알레르기·가족력 기록." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "비밀번호 변경", "changePasswordDescription": "지금 쓰는 비밀번호를 새 비밀번호로 바꿔요.", - "passwordReset": "비밀번호 재설정", "currentPassword": "현재 비밀번호", "newPassword": "새 비밀번호", "confirmNewPassword": "새 비밀번호 확인", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "푸시 알림을 켰어요!", "webPushUnsubscribed": "푸시 알림을 껐어요.", "webPushSubscribeFailed": "켜지 못했어요", - "kiInsightsDescription": "선택 사항: OpenAI 키를 저장하면 인사이트에서 매일 자동으로 분석해요.", "codexConnected": "ChatGPT를 연결했어요! 이제 인사이트를 쓸 수 있어요.", "codexDisconnected": "ChatGPT 연결을 해제했어요.", "codexConnectionFailed": "ChatGPT 연결에 실패했어요. 다시 시도해 주세요.", @@ -6090,7 +6088,7 @@ "admin-openai": "관리자 OpenAI" }, "title": "대체 순서", - "description": "기본 제공자가 실패하면 HealthLog가 순서대로 다음 제공자를 시도해요. 행을 끌어 순서를 바꾸고, 스위치를 끄면 제공자를 지우지 않고 비활성화할 수 있어요.", + "description": "활성 제공자가 실패하면 HealthLog가 이 순서대로 다음 활성 제공자를 시도해요.", "moveUp": "위로", "moveDown": "아래로", "removeFromChain": "순서에서 제거", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "순서를 기본값으로 되돌릴까요?", "resetConfirmBody": "순서가 Codex → OpenAI → Anthropic → 로컬 → 관리자 OpenAI로 돌아가요. 저장한 인증 정보는 그대로예요." }, - "providerCardTitle": "AI 제공자", "activeProviderHeading": "사용 중인 제공자", - "activeProviderBody": "가장 먼저 쓸 제공자를 고르세요. 아래 양식은 선택한 제공자만 설정하고, 실패했을 때 어떻게 할지는 맨 아래 대체 순서가 정해요.", "activeProviderLabel": "기본 제공자", - "providerConfigTitle": "제공자 설정", "providerSelect": { "codex": "ChatGPT 계정 (Codex)", "openai": "OpenAI (내 API 키)", @@ -6253,14 +6248,14 @@ }, "centralCodex": { "title": "서버의 공용 AI 연결 사용", - "subLabel": "운영자가 이 서버에 설정한 연결로 AI 요청을 보내고, 내 제공자는 대체 수단으로 함께 써요.", + "subLabel": "AI 요청을 서버의 공유 연결로 보내고, 내 제공자는 대체 수단으로 써요.", "honesty": "공용 연결은 운영자가 이 서버의 모든 사용자를 위해 연결해 둔 로그인 AI 계정 하나예요 — 내 키가 아니에요. 이 연결로 보낸 요청은 기본적으로 제공자의 학습에 쓰이고 이를 보호하는 데이터 처리 계약도 없으며, 계정의 시간당·주당 한도를 사용을 선택한 다른 모든 사용자와 나눠 써요. 내가 설정한 제공자는 여전히 먼저 시도돼요. 이 조건을 받아들일 때만 켜세요.", "confirm": "이해했어요 — 연결 사용", "cancel": "취소" }, "consent": { "title": "AI 동의", - "activeSince": "{date}에 동의했어요. AI 기능을 위해 건강 데이터가 설정한 제공자에게 전송될 수 있어요.", + "activeSince": "{date}에 동의했어요: AI 기능을 위해 건강 데이터가 설정한 제공자에게 전송될 수 있어요.", "withdrawn": "동의를 철회했어요. 다른 동의가 적용되지 않는 한, 코치와 인사이트는 더 이상 이 서버가 제공하는 AI 연결을 사용하지 않고 온라인 모델도 문서를 읽지 않아요. 자신의 키나 로컬 모델을 사용하는 코치와 인사이트는 계속 작동해요.", "withdraw": "동의 철회", "confirmBody": "다른 동의가 여전히 적용되지 않는 한, 다음이 즉시 중지됩니다: 이 서버가 제공하는 AI 연결을 사용하는 코치와 인사이트, 그리고 온라인 모델을 통한 문서 읽기. 자신의 키나 로컬 모델을 사용하는 코치와 인사이트는 계속 작동합니다. 인사이트에 적용되는 다른 동의가 없으면 모델이 작성한 메모가 삭제됩니다: 상태 메모, 일일 브리핑, 모델이 작성한 기간 요약, 새 측정값 알림 문장, 운동 메모. 코치 대화, 코치가 기억한 내용, 계획, 문서 요약은 그대로 남으며 직접 읽거나 삭제할 수 있습니다.", @@ -6271,7 +6266,7 @@ "error": "철회를 저장하지 못했어요. 다시 시도해 주세요.", "documentReading": { "title": "문서 읽기 동의", - "activeSince": "{date}에 동의함. 문서, 스캔한 검사 결과지, 약 설명이 읽기용으로 AI 서비스에 전송될 수 있습니다.", + "activeSince": "{date}에 동의했어요: 문서, 스캔한 검사지, 약 설명이 읽기용으로 AI 서비스에 전송될 수 있어요.", "confirmBody": "문서, 스캔한 검사 결과지, 약 설명이 더 이상 읽기용으로 전송되지 않습니다. 이미 가지고 있는 것은 삭제되지 않습니다." } }, @@ -6305,7 +6300,9 @@ "high": "높음" }, "coachNote": "코치에서는 코치 설정의 사고 깊이가 적용됩니다." - } + }, + "providerCardDescription": "HealthLog가 가장 먼저 쓰는 제공자와 그 키, 모델이에요.", + "runtimeTitle": "확인 및 새로고침" }, "dashboard": { "units": { @@ -7162,7 +7159,8 @@ "description": "건강 데이터를 공유하거나 내보내는 작업입니다. 계속하려면 본인임을 확인하세요.", "signInAgain": "다시 로그인한 후 한 번 더 시도하세요. 이 계정에는 여기서 확인할 비밀번호나 패스키가 없습니다.", "failed": "확인하지 못했습니다. 입력한 내용을 확인하고 다시 시도하세요." - } + }, + "passwordTitle": "비밀번호" }, "admin": { "title": "관리자", @@ -7258,9 +7256,9 @@ "defaultLanguage": "기본 언어", "defaultLanguageDescription": "새 사용자와 대체값으로 쓰여요.", "defaultUserTimezone": "새 계정의 기본 시간대", - "defaultUserTimezoneDescription": "브라우저에서 시간대를 감지하지 못한 새 계정에 쓰여요. 기존 사용자에게는 영향이 없어요.", + "defaultUserTimezoneDescription": "브라우저에서 시간대를 감지하지 못한 새 계정에 쓰이고, 기존 계정은 그대로예요.", "defaultUserTimezoneFallback": "Europe/Berlin (기본값)", - "servicesGlobal": "서비스 (전역)", + "servicesGlobal": "채널과 API", "servicesGlobalDescription": "끈 서비스는 어떤 사용자도 쓸 수 없어요.", "telegramGlobal": "Telegram 알림을 허용해요.", "ntfyGlobal": "ntfy 알림을 허용해요.", @@ -7271,16 +7269,16 @@ "offlineGeoFallback": "온라인 ({host}) — GeoLite2 데이터베이스를 마운트하고 GEOLITE2_DIR을 설정하세요", "apiGlobal": "API 엔드포인트와 API 토큰을 허용해요.", "umamiTitle": "Umami", - "umamiDescription": "Umami 웹 분석", + "umamiDescription": "Umami 웹 분석이에요.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "GlitchTip 오류 추적", + "glitchtipDescription": "GlitchTip 오류 추적이에요.", "webPushVapidTitle": "웹 푸시 VAPID", - "umamiEnabled": "Umami 추적을 켜요.", + "umamiEnabled": "Umami 추적 켜기", "umamiScriptUrl": "Umami 스크립트 URL", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "Umami 웹사이트 ID", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "GlitchTip 오류 추적을 켜요.", + "glitchtipEnabled": "GlitchTip 오류 추적 켜기", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "GlitchTip 환경", @@ -7342,8 +7340,8 @@ "title": "모듈 사용 여부", "description": "서버 전체에서 모듈을 끌 수 있어요.", "saveError": "모듈 사용 여부를 바꾸지 못했어요.", - "detail": "여기서 끈 모듈은 개인 설정과 관계없이 모든 계정에서 꺼져요. 핵심 영역(체중, 혈압, 맥박, 복약)은 항상 켜져 있고 끌 수 없어요.", - "coachFollowsSwitch": "어시스턴트의 코치 스위치를 따릅니다." + "detail": "체중, 혈압, 맥박은 핵심 측정값이라 항상 켜져 있어요.", + "coachFollowsSwitch": "코치 섹션의 코치 스위치를 따라요." }, "invites": { "title": "초대", @@ -7428,7 +7426,6 @@ "tokenNeverUsed": "없음", "tokensEmptyTitle": "아직 API 토큰이 없어요", "tokensEmptyDescription": "네이티브 클라이언트가 로그인할 때나 설정 → 계정에서 토큰이 발급돼요.", - "loginOverview": "로그인 개요", "loginOverviewDescription": "모든 계정의 로그인·인증 이벤트예요. 필터링하고 CSV로 내보낼 수 있어요.", "allAuthEvents": "전체 인증 이벤트", "failedOnly": "실패만", @@ -7536,7 +7533,7 @@ }, "services": { "title": "서비스", - "subtitle": "알림 채널과 연동을 시스템 전체에서 켜거나 꺼요." + "subtitle": "알림 채널과 API를 서버 전체에서 켜거나 꺼요." }, "integrations": { "title": "연동", @@ -7622,7 +7619,8 @@ "refresh": "새로고침", "eventDetails": "이벤트 상세", "closeDetails": "상세 닫기", - "processDetail": "버퍼는 휘발성이고 최대 500개까지만 담아요." + "processDetail": "버퍼는 휘발성이고 최대 500개까지만 담아요.", + "cardTitle": "최근 이벤트" }, "backups": { "title": "백업", @@ -7806,7 +7804,6 @@ "encryption": { "title": "암호화", "subtitle": "저장 데이터의 암호화 적용 범위와 키 교체 상태예요.", - "loading": "암호화 상태를 불러오는 중…", "loadError": "암호화 상태를 불러오지 못했어요.", "coverageTitle": "적용 범위", "coverageDescription": "키 id별로 암호화된 행이 얼마나 있는지 보여줘요.", @@ -7884,7 +7881,7 @@ }, "carrier": "통신사", "mfaRequired": "2단계 인증 필수", - "mfaRequiredDescription": "2단계 인증이 없는 계정은 로그인 후 등록 화면으로 보내요. 웹 사용자에게 등록을 요구할 뿐, 아직 등록하지 않은 계정의 API나 네이티브(Bearer) 접근을 막지는 않아요.", + "mfaRequiredDescription": "2단계 인증이 없는 계정은 웹 로그인 후 등록 화면으로 보내고, API와 네이티브(Bearer) 접근은 그대로 열려 있어요.", "mfaEnforcedOn": "MFA 켬", "mfaEnforcedOff": "MFA 끔", "mfaEnforcedOnHint": "이 사용자에게 2단계 인증이 필수예요. 누르면 해제돼요.", @@ -8006,7 +8003,9 @@ "restartNote": "변경 후 HealthLog를 다시 시작하세요.", "lastResort": "최후의 수단: 키가 맞다고 확신하고 위 세 가지가 모두 해당하지 않을 때만 {setting}을 설정하고 다시 시작하세요. HealthLog는 그래도 서비스하며 결과를 로그에만 남깁니다. 이 설정은 안전 검사를 끕니다. 키가 틀리면 모든 암호화된 값이 실패하고 새 데이터가 그 키로 기록됩니다.", "codes": "운영자용: API 요청은 오류 코드 {code}와 함께 503으로 응답하고, /api/health는 원인 {reason}을 알려 줍니다." - } + }, + "loginOverviewCardTitle": "로그인 이벤트", + "userColumn": "사용자" }, "achievements": { "title": "업적", diff --git a/messages/pl.json b/messages/pl.json index f0a04ad32..91518841c 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -2240,7 +2240,6 @@ "cardLowStockRunway": "Zapas: ≈ {days} dni", "takeActionFor": "Przyjmij – {name}", "skipActionFor": "Pomiń – {name}", - "reorderTitle": "Zmień kolejność", "reorderDescription": "Ustal kolejność swoich leków – obowiązuje w widoku kart i w tabeli.", "reorderSaved": "Kolejność zapisana", "reorderSaveFailed": "Nie udało się zapisać kolejności", @@ -4784,7 +4783,8 @@ "metricBodyWater": "Woda w organizmie", "metricBoneMass": "Masa kostna", "metricOxygenSaturation": "Saturacja tlenem (SpO₂)", - "unsetExplanation": "Brak własnej wartości — aktywna jest wartość domyślna." + "unsetExplanation": "Brak własnej wartości — aktywna jest wartość domyślna.", + "cardTitle": "Zakresy według metryki" }, "onboarding": { "errorGeneric": "Coś poszło nie tak podczas kończenia konfiguracji. Spróbuj ponownie.", @@ -5372,7 +5372,7 @@ "description": "Wybierz, które źródło wygrywa, gdy kilka rejestruje tę samą metrykę tego samego dnia.", "integrationsHint": "Źródła danych podłączysz lub odłączysz na stronie integracji.", "integrationsHintLink": "Otwórz integracje", - "cardTitle": "Priorytet źródeł według metryki", + "cardTitle": "Kolejność według metryki", "help": "Gdy kilka źródeł dostarcza tę samą wartość tego samego dnia, źródło na górze liczy się jako kanoniczne.", "resetDefaults": "Przywróć wartości domyślne", "resetDefaultsTitle": "Zresetować kolejność źródeł?", @@ -5778,7 +5778,7 @@ }, "anamnesis": { "title": "Wywiad medyczny", - "subtitle": "Zarządzaj swoimi alergiami i wywiadem rodzinnym.", + "subtitle": "Twoja historia zdrowia, styl życia, dane alarmowe i to, co może czytać AI.", "description": "Ustrukturyzowane rekordy alergii i wywiadu rodzinnego." }, "environment": { @@ -5962,7 +5962,6 @@ }, "changePassword": "Zmień hasło", "changePasswordDescription": "Zastąp obecne hasło nowym.", - "passwordReset": "Resetowanie hasła", "currentPassword": "Obecne hasło", "newPassword": "Nowe hasło", "confirmNewPassword": "Potwierdź nowe hasło", @@ -6042,7 +6041,6 @@ "webPushSubscribed": "Powiadomienia push włączone!", "webPushUnsubscribed": "Powiadomienia push wyłączone.", "webPushSubscribeFailed": "Aktywacja nie powiodła się", - "kiInsightsDescription": "Opcjonalnie: zapisz swój klucz OpenAI, aby uzyskać codzienne, automatyczne analizy w Insights.", "codexConnected": "ChatGPT połączony pomyślnie! Insights jest teraz aktywny.", "codexDisconnected": "Połączenie z ChatGPT usunięte.", "codexConnectionFailed": "Połączenie z ChatGPT nie powiodło się. Spróbuj ponownie.", @@ -6090,7 +6088,7 @@ "admin-openai": "OpenAI administratora" }, "title": "Łańcuch zapasowy", - "description": "Jeśli główny dostawca zawiedzie, HealthLog przechodzi przez łańcuch po kolei. Przeciągaj wiersze, aby zmienić kolejność; użyj przełącznika, aby wyłączyć dostawcę bez usuwania go.", + "description": "Gdy aktywny dostawca zawiedzie, HealthLog próbuje kolejnego włączonego w tej kolejności.", "moveUp": "Przesuń w górę", "moveDown": "Przesuń w dół", "removeFromChain": "Usuń z łańcucha", @@ -6103,11 +6101,8 @@ "resetConfirmTitle": "Przywrócić domyślny łańcuch?", "resetConfirmBody": "Łańcuch wraca do Codex → OpenAI → Anthropic → Lokalny → OpenAI administratora. Zapisane dane logowania pozostają nienaruszone." }, - "providerCardTitle": "Dostawca AI", "activeProviderHeading": "Aktywny dostawca", - "activeProviderBody": "Wybierz dostawcę, którego chcesz użyć jako pierwszego. Formularz poniżej konfiguruje tylko wybranego dostawcę; łańcuch zapasowy na dole decyduje, co się stanie w razie awarii.", "activeProviderLabel": "Główny dostawca", - "providerConfigTitle": "Konfiguracja dostawcy", "providerSelect": { "codex": "Konto ChatGPT (Codex)", "openai": "OpenAI (Twój klucz API)", @@ -6253,14 +6248,14 @@ }, "centralCodex": { "title": "Użyj wspólnego dostępu AI serwera", - "subLabel": "Kieruj zapytania AI przez połączenie skonfigurowane przez operatora dla tego serwera, obok Twoich własnych dostawców jako rozwiązanie awaryjne.", + "subLabel": "Zapytania AI idą przez wspólne połączenie serwera, a Twoi dostawcy służą jako zapas.", "honesty": "Wspólny dostęp to jedno zalogowane konto AI, które operator podłączył dla wszystkich na tym serwerze — nie Twój własny klucz. Zapytania, które przez nie wysyłasz, są domyślnie wykorzystywane do trenowania modeli dostawcy i nie obejmuje ich żadna umowa powierzenia przetwarzania danych, godzinowe i tygodniowe limity konta dzielisz z wszystkimi innymi, którzy się zgodzili, a Twoi właśni dostawcy są próbowani jako pierwsi. Włącz to tylko, jeśli akceptujesz ten kompromis.", "confirm": "Rozumiem — użyj połączenia", "cancel": "Anuluj" }, "consent": { "title": "Zgoda na AI", - "activeSince": "Udzielona {date}. Twoje dane zdrowotne mogą być wysyłane do skonfigurowanego dostawcy na potrzeby funkcji AI.", + "activeSince": "Udzielona {date}: Twoje dane zdrowotne mogą trafiać do skonfigurowanego dostawcy na potrzeby funkcji AI.", "withdrawn": "Wycofana. Jeśli żadna inna zgoda tego nie obejmuje, Coach i Insights nie korzystają już z dostępu AI zapewnianego przez ten serwer, a żaden model online nie czyta Twoich dokumentów. Na własnym kluczu lub lokalnym modelu Coach i Insights działają dalej.", "withdraw": "Wycofaj zgodę", "confirmBody": "Jeśli żadna inna Twoja zgoda ich nie obejmuje, od razu przestają działać: Coach i Insights tam, gdzie korzystają z dostępu AI zapewnianego przez ten serwer, oraz czytanie dokumentów przez model online. Na własnym kluczu lub lokalnym modelu Coach i Insights działają dalej. Jeśli żadna inna zgoda nie obejmuje już Insights, notatki napisane dla Ciebie przez model zostają usunięte: notatki o stanie, codzienne podsumowanie, podsumowania okresu napisane przez model, linie po nowym pomiarze i notatki o treningach. Twoje rozmowy z Coachem, to, co zapamiętał Coach, Twoje plany i podsumowania dokumentów zostają, a Ty możesz je sam przeczytać lub usunąć.", @@ -6271,7 +6266,7 @@ "error": "Nie udało się zapisać wycofania. Spróbuj ponownie.", "documentReading": { "title": "Zgoda na odczyt dokumentów", - "activeSince": "Udzielona {date}. Dokumenty, zeskanowane wyniki badań i opisy leków mogą być wysyłane do Twojej usługi AI do odczytu.", + "activeSince": "Udzielona {date}: dokumenty, skany badań i opisy leków mogą trafiać do Twojej usługi AI do odczytu.", "confirmBody": "Dokumenty, zeskanowane wyniki badań i opisy leków nie są już wysyłane do odczytu. Nic, co już masz, nie zostaje usunięte." } }, @@ -6305,7 +6300,9 @@ "high": "Wysokie" }, "coachNote": "W Coachu obowiązuje głębokość myślenia z ustawień Coacha." - } + }, + "providerCardDescription": "Dostawca, którego HealthLog pyta najpierw, wraz z kluczem i modelem.", + "runtimeTitle": "Sprawdź i odśwież" }, "dashboard": { "units": { @@ -7162,7 +7159,8 @@ "description": "Ta czynność udostępnia lub eksportuje Twoje dane zdrowotne. Potwierdź, że to Ty, aby kontynuować.", "signInAgain": "Zaloguj się ponownie, a potem spróbuj jeszcze raz. Twoje konto nie ma hasła ani klucza dostępu do potwierdzenia tutaj.", "failed": "To się nie udało. Sprawdź wprowadzone dane i spróbuj ponownie." - } + }, + "passwordTitle": "Hasło" }, "admin": { "title": "Administracja", @@ -7282,9 +7280,9 @@ "defaultLanguage": "Domyślny język", "defaultLanguageDescription": "Używany dla nowych użytkowników i jako rozwiązanie zapasowe.", "defaultUserTimezone": "Domyślna strefa czasowa dla nowych kont", - "defaultUserTimezoneDescription": "Używana dla nowych kont bez strefy wykrytej przez przeglądarkę. Nie wpływa na istniejących użytkowników.", + "defaultUserTimezoneDescription": "Używana dla nowych kont bez strefy wykrytej przez przeglądarkę; istniejące konta zachowują swoją.", "defaultUserTimezoneFallback": "Europe/Berlin (domyślna)", - "servicesGlobal": "Usługi (globalne)", + "servicesGlobal": "Kanały i API", "servicesGlobalDescription": "Wyłączone usługi nie są dostępne dla żadnego użytkownika.", "telegramGlobal": "Zezwól na powiadomienia Telegram.", "ntfyGlobal": "Zezwól na powiadomienia ntfy.", @@ -7295,16 +7293,16 @@ "offlineGeoFallback": "Online ({host}) — podłącz bazy GeoLite2 i ustaw GEOLITE2_DIR", "apiGlobal": "Zezwól na punkty końcowe API i tokeny API.", "umamiTitle": "Umami", - "umamiDescription": "Analityka internetowa z Umami", + "umamiDescription": "Analityka internetowa z Umami.", "glitchtipTitle": "GlitchTip", - "glitchtipDescription": "Śledzenie błędów z GlitchTip", + "glitchtipDescription": "Śledzenie błędów z GlitchTip.", "webPushVapidTitle": "Web Push VAPID", - "umamiEnabled": "Włącz śledzenie Umami.", + "umamiEnabled": "Włącz śledzenie Umami", "umamiScriptUrl": "Adres URL skryptu Umami", "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", "umamiWebsiteId": "Identyfikator witryny Umami", "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "glitchtipEnabled": "Włącz śledzenie błędów GlitchTip.", + "glitchtipEnabled": "Włącz śledzenie błędów GlitchTip", "glitchtipDsn": "GlitchTip DSN", "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", "glitchtipEnvironment": "Środowisko GlitchTip", @@ -7366,8 +7364,8 @@ "title": "Dostępność modułów", "description": "Wyłącz moduł dla całego serwera.", "saveError": "Nie udało się zaktualizować dostępności modułów.", - "detail": "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ć.", - "coachFollowsSwitch": "Podlega przełącznikowi Coach w sekcji Asystent." + "detail": "Waga, ciśnienie i tętno to podstawowe pomiary i zawsze pozostają włączone.", + "coachFollowsSwitch": "Podlega przełącznikowi Coach w sekcji Coach." }, "invites": { "title": "Zaproszenia", @@ -7452,7 +7450,6 @@ "tokenNeverUsed": "Nigdy", "tokensEmptyTitle": "Brak tokenów API", "tokensEmptyDescription": "Tokeny są wydawane, gdy klient natywny się loguje, lub przez Ustawienia → Konto.", - "loginOverview": "Przegląd logowań", "loginOverviewDescription": "Zdarzenia logowania i uwierzytelniania wszystkich kont, z filtrowaniem i eksportem CSV.", "allAuthEvents": "Wszystkie zdarzenia uwierzytelniania", "failedOnly": "Tylko nieudane", @@ -7560,7 +7557,7 @@ }, "services": { "title": "Usługi", - "subtitle": "Włącz lub wyłącz kanały powiadomień i integracje w całym systemie." + "subtitle": "Włącz lub wyłącz kanały powiadomień i API dla całego serwera." }, "integrations": { "title": "Integracje", @@ -7646,7 +7643,8 @@ "refresh": "Odśwież", "eventDetails": "Szczegóły zdarzenia", "closeDetails": "Zamknij szczegóły", - "processDetail": "Bufor jest ulotny i ograniczony do 500 wpisów." + "processDetail": "Bufor jest ulotny i ograniczony do 500 wpisów.", + "cardTitle": "Ostatnie zdarzenia" }, "backups": { "title": "Kopie zapasowe", @@ -7830,7 +7828,6 @@ "encryption": { "title": "Szyfrowanie", "subtitle": "Pokrycie szyfrowaniem i status rotacji kluczy dla danych w spoczynku.", - "loading": "Ładowanie statusu szyfrowania...", "loadError": "Nie udało się wczytać statusu szyfrowania.", "coverageTitle": "Pokrycie", "coverageDescription": "Ile zaszyfrowanych wierszy przypada na każdy identyfikator klucza.", @@ -7908,7 +7905,7 @@ }, "carrier": "Operator", "mfaRequired": "Wymagaj drugiego składnika", - "mfaRequiredDescription": "Każde konto bez aktywnego drugiego składnika jest po zalogowaniu kierowane do konfiguracji. To zachęca użytkowników sieci do włączenia go, ale nie blokuje bezpośredniego dostępu przez API ani natywnego (Bearer) dla kont jeszcze nieskonfigurowanych.", + "mfaRequiredDescription": "Konta bez drugiego składnika są po logowaniu w przeglądarce kierowane do jego konfiguracji; dostęp przez API i natywny (Bearer) pozostaje otwarty.", "mfaEnforcedOn": "MFA wł.", "mfaEnforcedOff": "MFA wył.", "mfaEnforcedOnHint": "Ten użytkownik musi używać drugiego składnika. Kliknij, aby przestać go wymagać.", @@ -8006,7 +8003,9 @@ "restartNote": "Po zmianie uruchom HealthLog ponownie.", "lastResort": "Ostateczność, tylko jeśli masz pewność, że klucz jest właściwy, a żadna z trzech dróg nie pasuje: ustaw {setting} i uruchom ponownie. HealthLog będzie wtedy działać mimo to i tylko zapisze wynik w logu. To wyłącza kontrolę bezpieczeństwa: przy złym kluczu każda zaszyfrowana wartość zawiedzie, a nowe dane zostaną zapisane tym kluczem.", "codes": "Dla administratora: żądania API odpowiadają 503 z kodem błędu {code}, a /api/health podaje powód {reason}." - } + }, + "loginOverviewCardTitle": "Zdarzenia logowania", + "userColumn": "Użytkownik" }, "achievements": { "title": "Osiągnięcia",