mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 12:32:43 +00:00
Each insights category page now carries two additions placed beside the chart and assessment: - a target-range card (MetricTargetSummary) showing the numeric goal band and the share of logged days within it, read from the shared /api/insights/targets payload so the bands match the /targets editor exactly. Blood pressure stitches the systolic and diastolic bands into one S/D string. A discreet link routes to /targets to adjust the band. - a question-mark explainer next to each heading (MetricExplainer in SubPageShell) opening a static, layperson 'What is X?' read. Popover on desktop, bottom-sheet on phones; keyboard- and touch-reachable with a 44px hit surface. Copy ships in all six locales. The /targets page stays the canonical place to tune the bands.
3991 lines
178 KiB
JSON
3991 lines
178 KiB
JSON
{
|
||
"common": {
|
||
"save": "Enregistrer",
|
||
"cancel": "Annuler",
|
||
"delete": "Supprimer",
|
||
"edit": "Modifier",
|
||
"moreOptions": "Plus d'options",
|
||
"create": "Créer",
|
||
"close": "Fermer",
|
||
"loading": "Chargement…...",
|
||
"loadFailed": "Could not load",
|
||
"error": "Erreur",
|
||
"saved": "Enregistré",
|
||
"no": "Non",
|
||
"noData": "Aucune donnée disponible",
|
||
"optional": "Facultatif",
|
||
"active": "Actif",
|
||
"inactive": "Inactif",
|
||
"enabled": "Activé",
|
||
"disabled": "Désactivé",
|
||
"networkError": "Erreur réseau",
|
||
"unknownError": "Erreur inconnue",
|
||
"copied": "Copié !",
|
||
"or": "ou",
|
||
"unknown": "Inconnu",
|
||
"add": "Ajouter",
|
||
"import": "Importer",
|
||
"test": "Tester",
|
||
"reset": "Réinitialiser",
|
||
"copy": "Copier",
|
||
"copyDetails": "Copier les détails",
|
||
"retry": "Réessayer",
|
||
"reportIssue": "Signaler un problème",
|
||
"showPassword": "Afficher le mot de passe",
|
||
"hidePassword": "Masquer le mot de passe"
|
||
},
|
||
"doctorReport": {
|
||
"title": "Rapport de santé",
|
||
"subtitle": "HealthLog — Rapport personnel de santé",
|
||
"patient": "Patient",
|
||
"dateOfBirth": "Date de naissance",
|
||
"gender": "Sexe",
|
||
"genderMale": "Homme",
|
||
"genderFemale": "Femme",
|
||
"genderOther": "Non-binaire",
|
||
"height": "Taille",
|
||
"period": "Période du rapport",
|
||
"createdOn": "Créé le",
|
||
"vitalsTitle": "Signes vitaux — Résumé",
|
||
"colParameter": "Paramètre",
|
||
"colCurrent": "Actuel",
|
||
"colAvgPeriod": "Moy. période",
|
||
"colMin": "Min",
|
||
"colMax": "Max",
|
||
"colN": "n",
|
||
"bpClassificationTitle": "Tension artérielle — Classification ESH (2023)",
|
||
"avgBp": "Tension artérielle moyenne",
|
||
"classification": "Classification",
|
||
"bmiTitle": "Indice de masse corporelle (IMC)",
|
||
"bmiRow": "IMC:{bmi} kg/m² — Classification: {class} (WHO)",
|
||
"complianceTitle": "Observance des médicaments",
|
||
"glp1Title": "Traitement GLP-1",
|
||
"glp1WeightSummary": "Poids sur la période du rapport : {start} kg → {end} kg ({delta} kg)",
|
||
"glp1CurrentDose": "Dose actuelle:{value} {unit} (since {since})",
|
||
"glp1Compliance": "Observance:{taken} / {total} ({rate}%)",
|
||
"glp1SideEffectsTitle": "Effets secondaires consignés",
|
||
"colGlp1Date": "Date",
|
||
"colGlp1Dose": "Dose",
|
||
"colGlp1Note": "Note",
|
||
"colGlp1SideEffect": "Effet secondaire",
|
||
"colMedication": "Médicament",
|
||
"colTaken": "Pris",
|
||
"colSkipped": "Sauté",
|
||
"colMissed": "Manqué",
|
||
"colTotal": "Total",
|
||
"colComplianceRate": "Taux d'observance",
|
||
"moodTitle": "Évolution de l’humeur",
|
||
"moodSummary": "Moyenne:{avg} / 5.0 · Entries: {count} · Range: {min}–{max}",
|
||
"colMood": "Humeur",
|
||
"colCount": "Nombre",
|
||
"colShare": "Part",
|
||
"footerDisclaimer1": "Ce rapport a été généré automatiquement à partir de données auto-déclarées et vise à soutenir",
|
||
"footerDisclaimer2": "la conversation médecin-patient. Il ne remplace pas un diagnostic médical. Les corrélations n'impliquent pas la causalité.",
|
||
"footerSource": "Source : HealthLog | Fuseau horaire : Europe/Berlin | Créé : {timestamp}",
|
||
"typeWeight": "Poids corporel",
|
||
"typeBpSys": "Tension artérielle systolique",
|
||
"typeBpDia": "Tension artérielle diastolique",
|
||
"typePulse": "Pouls au repos",
|
||
"typeBodyFat": "Masse grasse",
|
||
"typeSleep": "Durée du sommeil",
|
||
"typeSteps": "Activité (pas)",
|
||
"typeTotalBodyWater": "Eau corporelle totale",
|
||
"typeBoneMass": "Masse osseuse",
|
||
"typeOxygenSaturation": "Saturation en oxygène",
|
||
"unitSteps": "Pas",
|
||
"bmiUnderweight": "Insuffisance pondérale",
|
||
"bmiNormal": "Poids normal",
|
||
"bmiOverweight": "Surpoids (préobésité)",
|
||
"bmiObeseGrade1": "Obésité grade I",
|
||
"bmiObeseGrade2": "Obésité grade II",
|
||
"bmiObeseGrade3": "Obésité grade III",
|
||
"bpOptimal": "Optimale",
|
||
"bpNormal": "Normale",
|
||
"bpHighNormal": "Normale haute",
|
||
"bpHypertensionGrade1": "Hypertension grade 1",
|
||
"bpHypertensionGrade2": "Hypertension grade 2",
|
||
"bpHypertensionGrade3": "Hypertension grade 3",
|
||
"moodAwful": "Très mauvaise",
|
||
"moodBad": "Mauvais",
|
||
"moodNeutral": "Neutre",
|
||
"moodGood": "Bien",
|
||
"moodGreat": "Très bonne",
|
||
"typeGlucoseFasting": "Glycémie (à jeun)",
|
||
"typeGlucosePostprandial": "Glycémie (postprandiale)",
|
||
"typeGlucoseRandom": "Glycémie (indifférente)",
|
||
"typeGlucoseBedtime": "Glycémie (avant le coucher)",
|
||
"glucoseClassificationTitle": "Glycémie — Plages de référence (ADA 2024 / DDG)",
|
||
"glucoseRow": "{label} : moy. {avg} {unit} (cible {rangeMin}–{rangeMax}) — {class}",
|
||
"glucoseInTarget": "dans la cible",
|
||
"glucoseBelowTarget": "sous la cible",
|
||
"glucoseAboveTarget": "au-dessus de la cible",
|
||
"practiceLabel": "Cabinet",
|
||
"dialog": {
|
||
"title": "Rapport médical (PDF)",
|
||
"description": "Définis la période d’analyse et (optionnel) le nom du cabinet — les deux apparaîtront sur la page de garde.",
|
||
"startLabel": "Du",
|
||
"endLabel": "Au",
|
||
"practiceLabel": "Cabinet / clinique (optionnel)",
|
||
"practicePlaceholder": "p. ex. Dr Müller — médecin généraliste",
|
||
"preset90d": "90 derniers jours",
|
||
"preset180d": "6 derniers mois",
|
||
"preset365d": "12 derniers mois",
|
||
"submit": "Générer le PDF",
|
||
"cancel": "Annuler",
|
||
"errorEndBeforeStart": "La date de fin ne peut pas être antérieure à la date de début.",
|
||
"errorRangeTooLong": "La période d’analyse ne peut pas dépasser 2 ans.",
|
||
"errorInvalidDate": "Choisis une date de début et une date de fin valides."
|
||
},
|
||
"sections": {
|
||
"title": "Choisir le contenu",
|
||
"bp": "Tension artérielle",
|
||
"weight": "Poids",
|
||
"pulse": "Pouls au repos",
|
||
"bmi": "Indice de masse corporelle (IMC)",
|
||
"mood": "Humeur",
|
||
"moodSensitive": "Sensible — désactivé par défaut.",
|
||
"compliance": "Observance des médicaments",
|
||
"sleep": "Durée du sommeil",
|
||
"empty": "Pas de données sur la période sélectionnée. Le rapport conservera la page de garde.",
|
||
"unavailableHint": "Pas de données sur cette période"
|
||
},
|
||
"insurer": "Assurance maladie",
|
||
"insuranceNumber": "N° d’assuré",
|
||
"summaryTitle": "Résumé clinique",
|
||
"summaryReadings": "Enregistré sur {days} jours : {count} mesures sur {params} paramètres.",
|
||
"summaryTrend": "{label} : dernier {latest} {arrow}",
|
||
"summaryAdherence": "Observance médicamenteuse : {rate}% (moyenne pondérée).",
|
||
"chartsTitle": "Graphiques de tendance",
|
||
"aiSummaryTitle": "Résumé IA — non validé cliniquement",
|
||
"aiSummaryDisclaimer": "Cette section a été générée automatiquement par un modèle d’IA et n’est pas validée cliniquement. Elle ne remplace pas une évaluation médicale.",
|
||
"packageReadme": "Dossier de santé HealthLog\n\nCe paquet contient :\n- report.pdf : le rapport de santé pour votre médecin.\n- bundle.json : les mêmes données sous forme de Bundle document HL7 FHIR R4, compatible ePA.\n\nGénéré avec HealthLog."
|
||
},
|
||
"errorBoundary": {
|
||
"title": "Une erreur est survenue",
|
||
"description": "Une erreur inattendue est survenue. Tu peux réessayer, copier les détails techniques ou ouvrir un rapport de bug."
|
||
},
|
||
"notFound": {
|
||
"title": "Cette page n'existe pas.",
|
||
"backToDashboard": "Retour au tableau de bord"
|
||
},
|
||
"offlineBanner": {
|
||
"message": "Pas de connexion — tes modifications seront enregistrées dès que tu seras de nouveau en ligne."
|
||
},
|
||
"nav": {
|
||
"dashboard": "Tableau de bord",
|
||
"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": "Centre de notifications",
|
||
"theme": "Apparence",
|
||
"themeSystem": "Système",
|
||
"themeDark": "Sombre",
|
||
"themeLight": "Clair",
|
||
"collapseSidebar": "Réduire",
|
||
"userMenu": "Menu utilisateur",
|
||
"mood": "Humeur",
|
||
"skipToContent": "Aller au contenu",
|
||
"sidebar": "Barre latérale",
|
||
"mainNavigation": "Navigation principale",
|
||
"mobileNavigation": "Navigation mobile",
|
||
"breadcrumb": "Fil d'Ariane",
|
||
"loadingScreen": "Chargement…",
|
||
"more": "Plus",
|
||
"moreSheetTitle": "Plus",
|
||
"moreSheetDescription": "Pages qui ne tiennent pas dans la barre du bas."
|
||
},
|
||
"auth": {
|
||
"login": "Se connecter",
|
||
"register": "S'inscrire",
|
||
"username": "Nom d'utilisateur",
|
||
"password": "Mot de passe",
|
||
"email": "Adresse e-mail",
|
||
"emailPlaceholder": "nom@exemple.fr",
|
||
"emailOrUsername": "Adresse e-mail ou nom d’utilisateur",
|
||
"emailOrUsernamePlaceholder": "nom@exemple.fr ou nomdutilisateur",
|
||
"loginWithPasskey": "Se connecter avec une passkey",
|
||
"loginWithPassword": "Se connecter avec un mot de passe",
|
||
"noAccount": "Pas encore de compte ?",
|
||
"hasAccount": "Déjà un compte ?",
|
||
"loginFailed": "Échec de la connexion",
|
||
"registerFailed": "Échec de l’inscription",
|
||
"createAccount": "Créer un compte",
|
||
"newAccount": "Créer un nouveau compte",
|
||
"backToPasskey": "Revenir à la passkey",
|
||
"passkeySetupLater": "Tu peux configurer les passkeys plus tard dans les paramètres.",
|
||
"passwordMinLength": "Min. 12 caractères",
|
||
"passwordTooShort": "Le mot de passe doit comporter au moins {minLength} caractères.",
|
||
"privacyPolicy": "Politique de confidentialité"
|
||
},
|
||
"dashboard": {
|
||
"title": "Tableau de bord",
|
||
"greeting": {
|
||
"morning": "Bonjour",
|
||
"day": "Bonjour",
|
||
"evening": "Bonsoir"
|
||
},
|
||
"welcomeBack": "{greeting}, content de te revoir.",
|
||
"welcomeBackWithName": "{greeting} {name}, content de te revoir.",
|
||
"greetingSalutation": "Bonjour, {name}",
|
||
"streakLabel": "jours d’affilée",
|
||
"weight": "Poids",
|
||
"bloodPressure": "Tension artérielle",
|
||
"pulse": "Pouls",
|
||
"bodyFat": "Masse grasse",
|
||
"sleep": "Sommeil",
|
||
"steps": "Pas",
|
||
"vo2Max": "VO₂ max",
|
||
"vo2MaxUnit": "mL/(kg·min)",
|
||
"bpInTarget": "TA dans la cible",
|
||
"weightShort": "Poids",
|
||
"bloodPressureSysShort": "TA (Sys)",
|
||
"bloodPressureDiaShort": "TA (Dia)",
|
||
"pulseShort": "Pouls",
|
||
"bodyFatShort": "TG",
|
||
"moodShort": "Humeur",
|
||
"sleepShort": "Sommeil",
|
||
"stepsShort": "Pas",
|
||
"vo2MaxShort": "VO₂ max",
|
||
"bpInTargetShort": "TA-cible",
|
||
"medications": "Médicaments",
|
||
"quickAddMeasurement": "Saisir une mesure",
|
||
"quickAddMood": "Saisir une humeur",
|
||
"quickAddMedicationIntake": "Saisir une prise",
|
||
"medicationIntakeQuickAdd": {
|
||
"sheetTitle": "Saisir une prise de médicament",
|
||
"sheetDescription": "Enregistre la dose, l’heure et le médicament en quelques touches.",
|
||
"medicationLabel": "Médicament",
|
||
"medicationPlaceholder": "Sélectionner un médicament",
|
||
"doseLabel": "Dose",
|
||
"dosePlaceholder": "p. ex. 5 mg",
|
||
"doseHint": "Pour l’instant, la dose standard est enregistrée. Les doses variables arriveront dans une prochaine version.",
|
||
"timeLabel": "Heure de la prise",
|
||
"saveError": "Impossible d’enregistrer la prise.",
|
||
"emptyTitle": "Aucun médicament pour l’instant",
|
||
"emptyDescription": "Crée d’abord un médicament avec un horaire, puis reviens ici pour saisir la prise.",
|
||
"emptyCta": "Ajouter un médicament"
|
||
},
|
||
"compliance7d": "Observance (7 jours)",
|
||
"mood": "Humeur",
|
||
"customizeTitle": "Mise en page du tableau",
|
||
"layoutReset": "Rétablir les valeurs par défaut",
|
||
"layoutSaveSuccess": "Mise en page enregistrée",
|
||
"layoutSaveError": "Impossible d’enregistrer la mise en page",
|
||
"layoutResetSuccess": "Mise en page par défaut restaurée",
|
||
"layoutUsingDefaults": "Mise en page par défaut active",
|
||
"layoutCustomized": "Mise en page personnalisée active",
|
||
"moveUp": "Monter",
|
||
"moveDown": "Descendre",
|
||
"layoutTileColumn": "Tuile",
|
||
"layoutChartColumn": "Graphique",
|
||
"dragHandle": "Glisser pour réordonner",
|
||
"dragHandleHint": "Glisse la poignée pour réordonner ce widget. Tu peux aussi utiliser les flèches Haut et Bas, ou cibler la poignée puis appuyer sur Espace plus les flèches.",
|
||
"emptyTitle": "Ton tableau de bord est vide",
|
||
"emptyDescription": "Saisis ta première mesure ou humeur. Les tuiles et graphiques apparaissent automatiquement dès qu’il y a des données.",
|
||
"emptyAddMeasurement": "Saisir la première mesure",
|
||
"staleHint": "Dernière valeur il y a {count} j",
|
||
"staleHintWeeksOne": "Dernière valeur il y a 1 semaine",
|
||
"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",
|
||
"loading": "Chargement des entraînements…",
|
||
"empty": {
|
||
"title": "Aucun entraînement",
|
||
"cta": "Ouvre l'app Apple Santé sur ton iPhone pour synchroniser les entraînements."
|
||
}
|
||
},
|
||
"metric": {
|
||
"title": {
|
||
"weight": "Poids",
|
||
"bloodPressure": "Tension artérielle",
|
||
"pulse": "Pouls",
|
||
"bodyFat": "Masse grasse",
|
||
"glucose": "Glycémie",
|
||
"sleep": "Sommeil",
|
||
"steps": "Pas",
|
||
"totalBodyWater": "Eau corporelle totale",
|
||
"boneMass": "Masse osseuse",
|
||
"oxygenSaturation": "Saturation en oxygène"
|
||
},
|
||
"unit": {
|
||
"weight": "kg",
|
||
"bloodPressure": "mmHg",
|
||
"pulse": "bpm",
|
||
"bodyFat": "%",
|
||
"glucose": "mg/dL",
|
||
"sleep": "h",
|
||
"steps": "pas",
|
||
"totalBodyWater": "kg",
|
||
"boneMass": "kg",
|
||
"oxygenSaturation": "%"
|
||
}
|
||
}
|
||
},
|
||
"measurements": {
|
||
"title": "Mesures",
|
||
"subtitle": "Poids, tension artérielle, pouls et plus",
|
||
"addMeasurement": "Ajouter",
|
||
"editMeasurement": "Modifier la mesure",
|
||
"type": "Type",
|
||
"value": "Valeur",
|
||
"date": "Date",
|
||
"source": "Source",
|
||
"notes": "Notes",
|
||
"typeWeight": "Poids",
|
||
"typeBloodPressure": "Tension artérielle",
|
||
"typeBpSys": "Sys",
|
||
"typeBpDia": "Dia",
|
||
"typePulse": "Pouls",
|
||
"typeBodyFat": "Masse grasse",
|
||
"typeSleep": "Sommeil",
|
||
"typeSteps": "Pas",
|
||
"typeBloodGlucose": "Glycémie",
|
||
"typeTotalBodyWater": "Eau corporelle totale",
|
||
"typeBoneMass": "Masse osseuse",
|
||
"typeOxygenSaturation": "Saturation en oxygène",
|
||
"typeHeartRateVariability": "Variabilité de la fréquence cardiaque",
|
||
"typeRestingHeartRate": "Fréquence cardiaque au repos",
|
||
"typeActiveEnergyBurned": "Énergie active",
|
||
"typeFlightsClimbed": "Étages",
|
||
"typeWalkingRunningDistance": "Distance à pied et en course",
|
||
"typeVo2Max": "VO₂ max",
|
||
"typeBodyTemperature": "Température corporelle",
|
||
"typeFatFreeMass": "Masse maigre",
|
||
"typeFatMass": "Masse grasse",
|
||
"typeMuscleMass": "Masse musculaire",
|
||
"typeSkinTemperature": "Température cutanée",
|
||
"typePulseWaveVelocity": "Vitesse de l’onde de pouls",
|
||
"typeVascularAge": "Âge vasculaire",
|
||
"typeVisceralFat": "Graisse viscérale",
|
||
"typeAudioExposureEnv": "Exposition au bruit (environnement)",
|
||
"typeAudioExposureHeadphone": "Exposition au bruit (écouteurs)",
|
||
"typeTimeInDaylight": "Temps à la lumière du jour",
|
||
"typeWalkingSteadiness": "Stabilité à la marche",
|
||
"typeAudioExposureEvent": "Événement d’écoute forte",
|
||
"typeRespiratoryRate": "Fréquence respiratoire",
|
||
"typeBodyMassIndex": "Indice de masse corporelle",
|
||
"typeLeanBodyMass": "Masse maigre",
|
||
"typeWalkingHeartRateAverage": "Fréquence cardiaque à la marche (moy.)",
|
||
"typeWalkingAsymmetry": "Asymétrie de la marche",
|
||
"typeWalkingDoubleSupport": "Double appui à la marche",
|
||
"typeWalkingStepLength": "Longueur du pas",
|
||
"typeWalkingSpeed": "Vitesse de marche",
|
||
"glucoseContext": "Contexte",
|
||
"glucoseContextFasting": "À jeun (≥8 h sans repas)",
|
||
"glucoseContextPostprandial": "Postprandial (2 h après le repas)",
|
||
"glucoseContextRandom": "Indifférent / sans contexte",
|
||
"glucoseContextBedtime": "Avant le coucher",
|
||
"unitHours": "Heures",
|
||
"unitSteps": "Pas",
|
||
"sourceManual": "Manuelle",
|
||
"sourceWithings": "Withings",
|
||
"sourceImport": "Importer",
|
||
"sourceAppleHealth": "Apple Health",
|
||
"systolicLabel": "Systolique (mmHg)",
|
||
"diastolicLabel": "Diastolique (mmHg)",
|
||
"pulseLabel": "Pouls (bpm)",
|
||
"valueWithUnit": "Valeur ({unit})",
|
||
"timestamp": "Heure",
|
||
"notesPlaceholder": "p. ex. après le repas",
|
||
"formReset": "Réinitialiser le formulaire",
|
||
"saveError": "Erreur lors de l’enregistrement",
|
||
"duplicateTimestamp": "Une mesure de ce type existe déjà à cet horodatage.",
|
||
"deleteError": "Erreur lors de la suppression",
|
||
"invalidValue": "Saisis une valeur valide.",
|
||
"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.",
|
||
"emptyFilteredTitle": "Aucune mesure ne correspond au filtre",
|
||
"emptyFilteredDescription": "Choisis un autre type ou supprime le filtre pour voir toutes les mesures.",
|
||
"emptyAddFirst": "Saisir la première mesure",
|
||
"emptyResetFilter": "Afficher tous les types",
|
||
"comment": "Commentaire",
|
||
"actions": "Actions",
|
||
"deleteConfirmTitle": "Supprimer la mesure ?",
|
||
"deleteConfirmDescription": "Cette mesure sera supprimée définitivement.",
|
||
"pageInfo": "Page {page} sur {total}",
|
||
"previousPage": "Page précédente",
|
||
"nextPage": "Page suivante",
|
||
"dailyTotalCaption": "({count} échantillons)",
|
||
"expandDay": "Afficher les échantillons de ce jour",
|
||
"collapseDay": "Masquer les échantillons de ce jour",
|
||
"loadError": "Impossible de charger les mesures."
|
||
},
|
||
"mood": {
|
||
"title": "Humeur",
|
||
"subtitle": "Tendance et entrées d’humeur",
|
||
"addEntry": "Ajouter",
|
||
"editEntry": "Modifier l’entrée",
|
||
"moodLevel": "Humeur",
|
||
"tags": "Étiquettes",
|
||
"tagsPlaceholder": "p. ex. sport, travail, famille",
|
||
"tagsHelp": "Sépare par des virgules",
|
||
"timestamp": "Heure",
|
||
"date": "Date",
|
||
"source": "Source",
|
||
"levelSuperGut": "Excellent",
|
||
"levelGut": "Bien",
|
||
"levelOkay": "Correct",
|
||
"levelSchlecht": "Mauvais",
|
||
"levelLausig": "Pénible",
|
||
"sourceMoodlog": "moodLog",
|
||
"allMoods": "Toutes les humeurs",
|
||
"entryCount": "{count} entrées",
|
||
"emptyTitle": "Pas encore d’entrée d’humeur",
|
||
"emptyDescription": "Note comment tu te sens aujourd’hui pour repérer des tendances au fil du temps.",
|
||
"emptyFilteredTitle": "Aucune entrée ne correspond au filtre",
|
||
"emptyFilteredDescription": "Choisis un autre niveau ou supprime le filtre pour voir toutes les entrées.",
|
||
"emptyAddFirst": "Saisir la première humeur",
|
||
"emptyResetFilter": "Afficher toutes les humeurs",
|
||
"actions": "Actions",
|
||
"formReset": "Réinitialiser le formulaire",
|
||
"saveError": "Erreur lors de l’enregistrement",
|
||
"deleteError": "Erreur lors de la suppression",
|
||
"invalidTimestamp": "Choisis une date et une heure valides.",
|
||
"deleteConfirmTitle": "Supprimer l’entrée ?",
|
||
"deleteConfirmDescription": "Cette entrée d’humeur sera supprimée définitivement.",
|
||
"pageInfo": "Page {page} sur {total}",
|
||
"loginRequired": "Connecte-toi pour voir tes entrées d’humeur."
|
||
},
|
||
"medications": {
|
||
"title": "Médicaments",
|
||
"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",
|
||
"emptyTitle": "Aucun médicament pour l’instant",
|
||
"emptyDescription": "Crée des médicaments, des doses et des fenêtres horaires pour suivre l’observance.",
|
||
"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": "Open medication detail page",
|
||
"deleteConfirm": "Supprimer le médicament ?",
|
||
"compliance": "Observance",
|
||
"importIntakes": "Import intakes",
|
||
"importDescription": "Paste a JSON array with intake data. Expected format:",
|
||
"importUploadFile": "Upload JSON file",
|
||
"importPaste": "Paste JSON here...",
|
||
"importSelected": "Selected: {name}",
|
||
"importFileLoaded": "File \"{name}\" loaded",
|
||
"importInvalidJson": "File does not contain valid JSON",
|
||
"importNoArray": "No array found",
|
||
"importResult": "{imported} intakes imported",
|
||
"importDuplicatesSkipped": "{count} duplicates skipped",
|
||
"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": "Tension artérielle",
|
||
"categoryVitamin": "Vitamines",
|
||
"categoryThyroid": "Thyroïde",
|
||
"categoryHormone": "Hormones",
|
||
"categorySupplement": "Complément",
|
||
"categoryPainRelief": "Antalgique",
|
||
"categoryAllergy": "Allergie",
|
||
"categoryDigestive": "Digestif",
|
||
"categorySkin": "Soin de la peau",
|
||
"categorySleepAid": "Aide au sommeil",
|
||
"categoryDiabetes": "Diabetes",
|
||
"categoryAntibiotic": "Antibiotic",
|
||
"categoryOther": "Autres",
|
||
"daysSun": "Dim",
|
||
"daysMon": "Lun",
|
||
"daysTue": "Mar",
|
||
"daysWed": "Mer",
|
||
"daysThu": "Jeu",
|
||
"daysFri": "Ven",
|
||
"daysSat": "Sam",
|
||
"back": "Retour",
|
||
"today": "Aujourd'hui",
|
||
"yesterday": "Hier",
|
||
"tomorrow": "Demain",
|
||
"withoutNotification": "Sans notification",
|
||
"pausedSince": "En pause depuis",
|
||
"takeNow": "Prendre maintenant",
|
||
"overdue": "En retard",
|
||
"veryOverdue": "Très en retard",
|
||
"compliance7d": "Observance 7 jours",
|
||
"compliance30d": "Observance 30 jours",
|
||
"lastIntake": "Dernière prise :",
|
||
"nextIntake": "Prochaine prise :",
|
||
"dayStreak": "jours de série",
|
||
"taken": "Pris",
|
||
"skipped": "Sauté",
|
||
"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": "Dernier rendez-vous : {label}",
|
||
"glp1LastInjectionWithSite": "Dernier rendez-vous : {label} · {site}",
|
||
"glp1NextInjectionDays": "Suivant : {label} (dans {days} jours)",
|
||
"glp1NextInjectionToday": "Prochain rendez-vous : aujourd’hui",
|
||
"glp1NextInjectionTomorrow": "Prochain rendez-vous : demain",
|
||
"glp1RotationLast": "Dernier site : {site}",
|
||
"glp1RotationSuggested": "Conseillé : {site}",
|
||
"glp1LogSideEffect": "Consigner un effet secondaire",
|
||
"sideEffects": {
|
||
"section": "Effets secondaires",
|
||
"addCta": "Consigner",
|
||
"sheetTitle": "Consigner un effet secondaire",
|
||
"categoryLabel": "Catégorie",
|
||
"entryLabel": "Symptôme",
|
||
"severityLabel": "Sévérité",
|
||
"severity": {
|
||
"mild": "Léger",
|
||
"moderate": "Modéré",
|
||
"significant": "Notable",
|
||
"severe": "Sévère",
|
||
"verySevere": "Très sévère"
|
||
},
|
||
"notesLabel": "Notes (facultatif)",
|
||
"notesPlaceholder": "Ce qui vaut la peine d'être noté, 280 caractères max.",
|
||
"submitCta": "Enregistrer",
|
||
"cancelCta": "Annuler",
|
||
"emptyState": "Aucun effet secondaire consigné. Le suivi peut aider votre médecin et révéler des tendances dans le temps.",
|
||
"recentTitle": "30 derniers jours",
|
||
"loading": "Chargement…",
|
||
"deleteCta": "Supprimer",
|
||
"deleteConfirm": "Supprimer cette entrée ?",
|
||
"errorSeverity": "La sévérité doit être entre 1 et 5",
|
||
"errorEntry": "Choisissez un symptôme",
|
||
"categories": {
|
||
"gi": "Gastro-intestinal",
|
||
"metabolic": "Métabolique",
|
||
"injectionSite": "Site d'injection",
|
||
"cognitive": "Cognitif",
|
||
"glp1Specific": "Spécifique GLP-1"
|
||
},
|
||
"entries": {
|
||
"nausea": "Nausée",
|
||
"vomiting": "Vomissement",
|
||
"diarrhea": "Diarrhée",
|
||
"constipation": "Constipation",
|
||
"abdominalPain": "Douleur abdominale",
|
||
"hypoglycemiaSymptoms": "Symptômes d'hypoglycémie",
|
||
"dehydration": "Déshydratation",
|
||
"anorexia": "Perte d'appétit",
|
||
"electrolyteFatigue": "Fatigue électrolytique",
|
||
"injectionRedness": "Rougeur au site d'injection",
|
||
"injectionSwelling": "Gonflement au site d'injection",
|
||
"injectionBruising": "Ecchymose au site d'injection",
|
||
"injectionInduration": "Induration au site d'injection",
|
||
"brainFog": "Brouillard mental",
|
||
"dizziness": "Vertiges",
|
||
"lowMood": "Humeur basse",
|
||
"lowEnergy": "Faible énergie",
|
||
"earlySatiety": "Satiété précoce",
|
||
"gastroparesisLike": "Vidange gastrique lente",
|
||
"dysgeusia": "Altération du goût",
|
||
"gallbladderDiscomfort": "Inconfort de la vésicule biliaire"
|
||
}
|
||
},
|
||
"scheduling": {
|
||
"naturalLanguage": {
|
||
"title": "Décris ton médicament",
|
||
"description": "Décris le médicament avec tes propres mots et le formulaire sera pré-rempli pour toi.",
|
||
"placeholder": "p. ex. Mounjaro 5 mg par semaine le mercredi matin à partir de lundi prochain",
|
||
"submit": "Extraire",
|
||
"submitBusy": "Extraction…",
|
||
"cancel": "Annuler",
|
||
"examples": {
|
||
"label": "Essayer un de ces exemples",
|
||
"weekly": "Mounjaro 5 mg par semaine le mercredi matin",
|
||
"daily": "Ibuprofène 200 mg tous les jours, 3 fois par jour",
|
||
"rolling": "Méthotrexate 7,5 mg tous les 7 jours depuis la dernière injection"
|
||
},
|
||
"error": {
|
||
"empty": "Saisis d'abord une description.",
|
||
"tooLong": "Garde la description sous 2000 caractères.",
|
||
"rateLimit": "Trop de requêtes — attends un instant et réessaie.",
|
||
"noProvider": "Aucun fournisseur d'IA configuré — configure-le dans les Paramètres.",
|
||
"budget": "Budget IA quotidien atteint — réessaie demain.",
|
||
"network": "Impossible de joindre le fournisseur d'IA — réessaie."
|
||
}
|
||
},
|
||
"cadence": {
|
||
"section": "Cadence",
|
||
"label": "How often",
|
||
"kind": {
|
||
"daily": "Every day",
|
||
"weekdays": "Certain days of the week",
|
||
"everyNWeeks": "Every N weeks on certain days",
|
||
"monthly": "Monthly on a specific day",
|
||
"everyNMonths": "Every N months on a specific day",
|
||
"yearly": "Once a year",
|
||
"rolling": "Every N days from when I last took it (flexible)",
|
||
"rollingExplainer": "Counts from your last logged intake — pauses if you skip a dose.",
|
||
"oneShot": "One-time dose"
|
||
},
|
||
"weekdays": {
|
||
"label": "Days of the week",
|
||
"short": {
|
||
"mo": "Mo",
|
||
"tu": "Tu",
|
||
"we": "We",
|
||
"th": "Th",
|
||
"fr": "Fr",
|
||
"sa": "Sa",
|
||
"su": "Su"
|
||
},
|
||
"long": {
|
||
"mo": "Monday",
|
||
"tu": "Tuesday",
|
||
"we": "Wednesday",
|
||
"th": "Thursday",
|
||
"fr": "Friday",
|
||
"sa": "Saturday",
|
||
"su": "Sunday"
|
||
}
|
||
},
|
||
"intervalWeeks": {
|
||
"suffix": "weeks"
|
||
},
|
||
"dayOfMonth": {
|
||
"label": "Day"
|
||
},
|
||
"intervalMonths": {
|
||
"suffix": "months",
|
||
"dayOnLabel": "on day"
|
||
},
|
||
"yearly": {
|
||
"date": {
|
||
"label": "Date"
|
||
}
|
||
},
|
||
"rollingDays": {
|
||
"suffix": "days"
|
||
}
|
||
},
|
||
"timesOfDay": {
|
||
"section": "Times of day",
|
||
"label": "Times of day",
|
||
"empty": {
|
||
"cta": "Add the first time."
|
||
},
|
||
"add": "Add time",
|
||
"remove": "Remove",
|
||
"presets": {
|
||
"morning": "Morning",
|
||
"noon": "Noon",
|
||
"evening": "Evening",
|
||
"night": "Night"
|
||
},
|
||
"max": {
|
||
"reached": "Maximum reached — remove a time before adding another."
|
||
}
|
||
},
|
||
"courseWindow": {
|
||
"section": "Course window",
|
||
"startsOn": {
|
||
"label": "Starts on"
|
||
},
|
||
"endsOn": {
|
||
"label": "Ends on"
|
||
},
|
||
"noEndDate": "No end date",
|
||
"oneShotCaption": "(one-time dose)",
|
||
"invalidRange": "End date must be on or after the start date."
|
||
}
|
||
},
|
||
"wizard": {
|
||
"header": {
|
||
"stepOf": "Step {current} of {total}",
|
||
"createTitle": "New medication",
|
||
"editTitle": "Edit {name}"
|
||
},
|
||
"nav": {
|
||
"back": "Back",
|
||
"next": "Next",
|
||
"save": "Save",
|
||
"saveEdit": "Save changes"
|
||
},
|
||
"nl": {
|
||
"button": "Describe"
|
||
},
|
||
"steps": {
|
||
"step1": {
|
||
"title": "What's the medication called?",
|
||
"subline": "Exactly as it appears on the box.",
|
||
"label": "Name",
|
||
"placeholder": "e.g. Ramipril"
|
||
},
|
||
"step2": {
|
||
"title": "What kind of medication is it?",
|
||
"subline": "We use this for the right templates and analytics."
|
||
},
|
||
"step3": {
|
||
"title": "What's the dose?",
|
||
"subline": "A tablet, a puff, a drop — depending on the form.",
|
||
"amountLabel": "Amount",
|
||
"amountPlaceholder": "e.g. 5",
|
||
"unitLabel": "Unit",
|
||
"unit": {
|
||
"mg": "mg",
|
||
"ml": "ml",
|
||
"iu": "IU",
|
||
"mcg": "µg",
|
||
"g": "g",
|
||
"tablets": "tablet(s)",
|
||
"capsules": "capsule(s)",
|
||
"drops": "drops",
|
||
"puffs": "puff",
|
||
"sprays": "spray",
|
||
"pieces": "pieces",
|
||
"other": "other"
|
||
},
|
||
"deliveryFormLabel": "Voie",
|
||
"deliveryForm": {
|
||
"ORAL": "Orale",
|
||
"INJECTION": "Injection",
|
||
"OTHER": "Autre"
|
||
},
|
||
"dosesPerUnitLabel": "Doses par unité",
|
||
"dosesPerUnitPlaceholder": "p. ex. 4",
|
||
"dosesPerUnitHint": "Doses par stylo / flacon — laisser vide pour ne pas suivre le stock.",
|
||
"injectionSiteToggle": "Rotation des sites d'injection",
|
||
"injectionSiteHint": "Guide de rotation facultatif. Le site de chaque dose est enregistré lors de la saisie de la prise."
|
||
},
|
||
"step4": {
|
||
"title": "Over what period are you taking it?",
|
||
"subline": "A start date is enough for today. You can add an end date later."
|
||
},
|
||
"step5": {
|
||
"title": "How often do you take it?",
|
||
"subline": "Pick the cadence — the details follow on the next step."
|
||
},
|
||
"step6": {
|
||
"title": "What does that look like in detail?",
|
||
"subline": "Set weekdays, intervals, or the day of the month.",
|
||
"intervalWeeks": {
|
||
"label": "Every",
|
||
"suffix": "weeks"
|
||
},
|
||
"dayOfMonth": {
|
||
"label": "On",
|
||
"suffix": "day of the month"
|
||
},
|
||
"rollingDays": {
|
||
"label": "Every",
|
||
"suffix": "days from the last intake"
|
||
}
|
||
},
|
||
"step7": {
|
||
"title": "When do you take it?",
|
||
"subline": "One or more times of day — reminders follow this list.",
|
||
"presetsLabel": "Time-of-day presets",
|
||
"presets": {
|
||
"morning": "Morning",
|
||
"noon": "Noon",
|
||
"evening": "Evening",
|
||
"night": "Night"
|
||
}
|
||
},
|
||
"step8": {
|
||
"title": "All done — should HealthLog remind you?",
|
||
"subline": "Review everything below before you save.",
|
||
"remindersLabel": "Reminders on",
|
||
"remindersDescription": "Push, Telegram or ntfy — based on your settings.",
|
||
"multiScheduleNote": "This medication has multiple schedules. The detailed editor returns in a later release."
|
||
}
|
||
},
|
||
"classRow": {
|
||
"bloodPressure": "Blood pressure",
|
||
"diabetes": "Diabetes",
|
||
"hormone": "Hormones",
|
||
"glp1": "GLP-1 injection",
|
||
"painRelief": "Pain",
|
||
"allergy": "Allergy",
|
||
"vitamin": "Vitamins",
|
||
"supplement": "Supplement",
|
||
"antibiotic": "Antibiotic",
|
||
"other": "Other"
|
||
},
|
||
"cadence": {
|
||
"daily": {
|
||
"label": "Daily",
|
||
"description": "Every day at the same time."
|
||
},
|
||
"weekdays": {
|
||
"label": "Specific weekdays",
|
||
"description": "E.g. Monday, Wednesday, Friday."
|
||
},
|
||
"everyNWeeks": {
|
||
"label": "Every few weeks",
|
||
"description": "E.g. every 2 weeks on Thursdays (GLP-1, biologics)."
|
||
},
|
||
"monthly": {
|
||
"label": "Monthly",
|
||
"description": "On a fixed day each month (e.g. always the 1st)."
|
||
},
|
||
"rolling": {
|
||
"label": "Flexible from last dose",
|
||
"description": "Leave the next dose open. When you tap 'taken', the counter starts again from that moment."
|
||
},
|
||
"oneShot": {
|
||
"label": "Single dose",
|
||
"description": "One administration, e.g. a vaccine or an antibiotic course."
|
||
}
|
||
},
|
||
"summary": {
|
||
"title": "Summary",
|
||
"cadence": {
|
||
"daily": "Every day",
|
||
"weekdays": "On selected days of the week",
|
||
"biweekly": "Every two weeks",
|
||
"monthly": "Monthly",
|
||
"quarterly": "Every three months",
|
||
"yearly": "Once a year",
|
||
"rolling": "Every {n} days from your last intake",
|
||
"oneShot": "A single dose",
|
||
"everyNWeeks": "Every {n} weeks",
|
||
"everyNMonths": "Every {n} months"
|
||
},
|
||
"weekdaysDetail": ", on {days}",
|
||
"dayOfMonthDetail": ", on day {day}.",
|
||
"times": "at {times}",
|
||
"startsOn": "Starts: {date}",
|
||
"endsOn": "Ends: {date}",
|
||
"noEndDate": "No end date"
|
||
},
|
||
"compose": {
|
||
"scheduleIndex": "Schedule {n} of {total}",
|
||
"list": {
|
||
"add": "Add another schedule",
|
||
"edit": "Edit",
|
||
"remove": "Remove",
|
||
"removeDisabled": "At least one schedule is required.",
|
||
"empty": "No schedule yet."
|
||
}
|
||
},
|
||
"errors": {
|
||
"submitFailed": "Could not save the medication — please retry."
|
||
}
|
||
},
|
||
"titration": {
|
||
"section": "Paliers de titration",
|
||
"loading": "Chargement des données de titration",
|
||
"loadFailed": "Échec du chargement des données de titration.",
|
||
"drugLadderHeader": "Paliers standard (référence EMA)",
|
||
"typicalWeeksOnStep": "≥ {weeks} sem. typique",
|
||
"youAreHere": "Vous êtes ici",
|
||
"nextStepCaption": "Palier suivant (typique) : {dose} mg après ~{weeks} semaines au palier actuel.",
|
||
"ceilingMessage": "Vous êtes au sommet du palier standard.",
|
||
"escalationDueHint": "Vous êtes à ce palier depuis {weeks} semaines ; le schéma prévoit une progression typique après ~{typical} semaines.",
|
||
"currentStepDwell": "À ce palier depuis {weeks} semaines",
|
||
"doseUnitMg": "mg",
|
||
"emptyState": "Aucun historique de dose. Enregistrez une dose pour voir votre position dans le schéma.",
|
||
"nonStandardDose": "La dose actuelle est en dehors des paliers standard.",
|
||
"disclaimer": "Valeurs de référence EMA. Consultez votre médecin avant toute modification de dose.",
|
||
"emaSourceCta": "Source EMA",
|
||
"stepLabel": "Palier {n}"
|
||
},
|
||
"injectionSiteBodyOutlineAriaLabel": "Silhouette du corps",
|
||
"injectionSitePickerAriaLabel": "Sélecteur de site d'injection",
|
||
"siteAbdomenLeft": "Abdomen, en bas à gauche",
|
||
"siteAbdomenRight": "Abdomen, en bas à droite",
|
||
"siteAbdomenUpperLeft": "Abdomen, en haut à gauche",
|
||
"siteAbdomenUpperRight": "Abdomen, en haut à droite",
|
||
"siteThighLeft": "Cuisse gauche",
|
||
"siteThighRight": "Cuisse droite",
|
||
"siteUpperArmLeft": "Bras gauche",
|
||
"siteUpperArmRight": "Bras droit",
|
||
"sideEffectTagsHelp": "Touche un chip pour l’ajouter aux étiquettes d’humeur.",
|
||
"sideEffectTagNausea": "Nausées",
|
||
"sideEffectTagConstipation": "Constipation",
|
||
"sideEffectTagDiarrhea": "Diarrhée",
|
||
"sideEffectTagFatigue": "Fatigue",
|
||
"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",
|
||
"phaseYellow": "Jaune",
|
||
"phaseOrange": "Orange",
|
||
"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": "API",
|
||
"sourceReminder": "Rappel",
|
||
"sourceImport": "Import",
|
||
"intakeHistoryEmptyTitle": "Aucune prise pour l’instant",
|
||
"intakeHistoryEmptyDescription": "Dès que tu enregistreras une prise, elle apparaîtra ici avec l’heure et la source.",
|
||
"intakeHistoryEmptyAction": "Enregistrer une prise",
|
||
"intakeHistoryColTaken": "Prise",
|
||
"intakeHistoryColScheduled": "Programmée",
|
||
"intakeHistoryColStatus": "Statut",
|
||
"intakeHistoryColSource": "Source",
|
||
"intakeHistoryStatusTaken": "Prise",
|
||
"intakeHistoryStatusSkipped": "Ignorée",
|
||
"intakeHistorySortByTaken": "Trier par heure de prise",
|
||
"intakeHistorySortByScheduled": "Trier par heure programmée",
|
||
"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": {
|
||
"name": "Tirzépatide"
|
||
},
|
||
"semaglutide": {
|
||
"name": "Sémaglutide"
|
||
},
|
||
"liraglutide": {
|
||
"name": "Liraglutide"
|
||
},
|
||
"dulaglutide": {
|
||
"name": "Dulaglutide"
|
||
},
|
||
"exenatide": {
|
||
"name": "Exénatide"
|
||
}
|
||
}
|
||
},
|
||
"researchMode": {
|
||
"dialog": {
|
||
"title": "Activer le mode Recherche",
|
||
"intro": "Le mode Recherche ajoute un graphique estimé du niveau de médicament à votre page GLP-1. Lisez la limite ci-dessous avant de l'activer — le graphique est un outil d'apprentissage, jamais une mesure, jamais un conseil médical.",
|
||
"whatItIsHeader": "Ce que c'est",
|
||
"whatItIs": "Une courbe en dents de scie qui simule la superposition de vos doses enregistrées dans le temps, à partir du modèle Bateman à un compartiment avec les paramètres d'absorption et de demi-vie publiés dans l'EPAR EMA de chaque agoniste GLP-1 approuvé. L'axe vertical est sans unité et non étiqueté. C'est la forme, pas la valeur, qui est l'information de la courbe.",
|
||
"whatItIsntHeader": "Ce que ce n'est pas",
|
||
"whatItIsnt": "Pas un taux sanguin. Pas une mesure. Pas une prévision de la réponse réelle de votre corps. Pas une base pour une décision de dose, de timing ou d'escalade. Pour tout ce qui touche à votre traitement, parlez-en à votre médecin prescripteur.",
|
||
"whyEstimateHeader": "Pourquoi c'est une estimation",
|
||
"whyEstimate": "La pharmacocinétique de population décrit le patient typique. La variabilité individuelle est grande — le modèle Schneck/Urva 2024 du tirzépatide rapporte environ 22 % de variabilité interindividuelle sur l'absorption et environ 49 % sur le volume de distribution. Une courbe de manuel ne peut capturer ni votre poids, ni votre fonction rénale, ni votre technique d'injection, ni la précision de vos horaires. Lisez la courbe comme le rythme de votre dosage, pas comme votre niveau.",
|
||
"mdrBoundaryHeader": "Limite réglementaire",
|
||
"mdrBoundary": "HealthLog affiche des données réglementaires publiques et vos propres enregistrements. L'application ne prédit, ne diagnostique, ne traite et ne recommande aucune thérapie. Le règlement UE 2017/745 (Medical Device Regulation, MDR) et le document de guidance MDCG 2021-24 tracent la limite à partir des logiciels qui interprètent des données à des fins médicales — cette courbe reste résolument du côté éducatif de cette limite. Si vous avez le sentiment qu'elle vous pousse vers une décision clinique, fermez-la.",
|
||
"citationsHeader": "Sources",
|
||
"citations": "Rapports européens publics d'évaluation (EPAR) de l'EMA pour Mounjaro, Ozempic, Wegovy, Saxenda, Trulicity, Byetta et Bydureon (section 5.2). Schneck K, Urva S. Population pharmacokinetics of the GIP/GLP receptor agonist tirzepatide. CPT Pharmacometrics Syst Pharmacol 2024;13(3):494-503 (DOI 10.1002/psp4.13099).",
|
||
"versionLine": "Version du disclaimer : {version}",
|
||
"acknowledgeCta": "J'ai compris — activer",
|
||
"cancelCta": "Annuler",
|
||
"successToast": "Mode Recherche activé. La courbe de niveau de médicament est maintenant visible sur votre page GLP-1.",
|
||
"errorToast": "Impossible d'activer le mode Recherche. Veuillez réessayer.",
|
||
"staleVersionToast": "Le disclaimer a été mis à jour depuis le chargement de cette page. Rechargez pour lire la version actuelle."
|
||
},
|
||
"chart": {
|
||
"title": "Niveau de médicament estimé",
|
||
"axisLabel": "Niveau estimé (relatif)",
|
||
"emptyState": "Aucune prise enregistrée.",
|
||
"emptyStateCta": "Enregistrez une dose pour voir la courbe estimée prendre forme.",
|
||
"estimateNote": "Estimation éducative à partir de la pharmacocinétique de population publiée par l'EMA. Pas une mesure.",
|
||
"gatedTitle": "Mode Recherche désactivé",
|
||
"gatedBody": "Activez le mode Recherche dans les paramètres pour voir la courbe estimée du niveau de médicament. La courbe est en opt-in parce que c'est un outil d'apprentissage, pas une mesure clinique.",
|
||
"gatedStaleTitle": "Le disclaimer doit être reconfirmé",
|
||
"gatedStaleBody": "Le disclaimer du mode Recherche a été mis à jour depuis votre dernière confirmation. Relisez-le dans les paramètres et confirmez à nouveau pour réafficher la courbe.",
|
||
"gatedCta": "Ouvrir le mode Recherche dans les paramètres",
|
||
"unknownDrug": "{name} n'est pas dans le catalogue GLP-1 approuvé par l'EMA, donc HealthLog ne peut pas tracer de courbe de pharmacocinétique de population."
|
||
}
|
||
},
|
||
"detail": {
|
||
"status": {
|
||
"active": "Active",
|
||
"paused": "Paused",
|
||
"ended": "Ended"
|
||
},
|
||
"today": {
|
||
"groupLabel": "Today's dose",
|
||
"taken": "Taken",
|
||
"skipped": "Skipped",
|
||
"toastTaken": "Today's dose logged",
|
||
"toastSkipped": "Today's dose skipped",
|
||
"recordedTaken": "Taken today at {time}",
|
||
"recordedSkipped": "Skipped today at {time}",
|
||
"recordedOneShot": "One-shot dose taken at {time}",
|
||
"noneScheduled": "No dose scheduled for today.",
|
||
"pausedHint": "Paused — no reminder today.",
|
||
"error": "Could not log the dose."
|
||
},
|
||
"cadence": {
|
||
"oneShotOn": "One-time dose on {date}.",
|
||
"oneShotPending": "One-time dose pending."
|
||
},
|
||
"intake": {
|
||
"title": "Intake history",
|
||
"importButton": "Import",
|
||
"rowActions": {
|
||
"openMenu": "Open row actions",
|
||
"edit": "Edit",
|
||
"delete": "Delete"
|
||
},
|
||
"selection": {
|
||
"rowToggleLabel": "Select row"
|
||
},
|
||
"bulkDelete": {
|
||
"selectionCount": "{count} entries selected",
|
||
"deleteButton": "Delete selection",
|
||
"cancelButton": "Cancel",
|
||
"confirmTitle": "Delete the selected entries?",
|
||
"confirmBody": "{count} entries will be removed permanently. The medication itself stays.",
|
||
"confirmAction": "Delete",
|
||
"toast": "Selection deleted",
|
||
"failed": "Could not delete the selection."
|
||
},
|
||
"edit": {
|
||
"dialogTitle": "Edit intake",
|
||
"takenAtLabel": "Taken at",
|
||
"skippedLabel": "Skipped",
|
||
"noteLabel": "Note",
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"savedToast": "Intake updated",
|
||
"failed": "Could not update the intake."
|
||
},
|
||
"deleteRow": {
|
||
"confirmTitle": "Delete this intake?",
|
||
"confirmBody": "The entry is removed permanently.",
|
||
"confirmAction": "Delete",
|
||
"toast": "Intake deleted",
|
||
"failed": "Could not delete the intake."
|
||
}
|
||
},
|
||
"notifications": {
|
||
"title": "Notifications",
|
||
"switchLabel": "Send a reminder when this dose is due",
|
||
"helperOn": "Reminders are on.",
|
||
"helperOff": "Reminders are off.",
|
||
"enabledToast": "Reminders on",
|
||
"disabledToast": "Reminders off",
|
||
"toggleFailed": "Could not change the reminder setting.",
|
||
"clientManagedChip": "Your iPhone manages reminders for this medication."
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"phases": {
|
||
"openButton": "Configure phases",
|
||
"requiresCourseWindow": "Phases are available once a course window is set."
|
||
},
|
||
"grace": {
|
||
"label": "Reminder window — applies to your primary schedule",
|
||
"primaryScheduleNote": "Multi-schedule medications keep their other schedules' default window.",
|
||
"unit": "minutes",
|
||
"saved": "Reminder window saved",
|
||
"failed": "Could not save the reminder window."
|
||
}
|
||
},
|
||
"zone": {
|
||
"title": "Manage & danger zone",
|
||
"pause": {
|
||
"title": "Pause",
|
||
"helper": "Pause reminders until you turn them back on. History stays intact.",
|
||
"pausedToast": "Reminders paused",
|
||
"resumedToast": "Reminders resumed",
|
||
"failed": "Could not change the paused state."
|
||
},
|
||
"end": {
|
||
"title": "End medication",
|
||
"helper": "Stop reminders and mark the medication as ended. History stays visible.",
|
||
"button": "End",
|
||
"dialogTitle": "End {name} — stop reminders, history stays visible",
|
||
"dialogBody": "No more reminders. Old entries remain in the timeline.",
|
||
"toast": "Medication ended",
|
||
"failed": "Could not end the medication."
|
||
},
|
||
"purge": {
|
||
"title": "Delete history",
|
||
"helper": "{count} intake events are stored for this medication.",
|
||
"button": "Delete history",
|
||
"dialogTitle": "Really delete the history?",
|
||
"dialogBody": "The {count} intake events will be removed permanently. The medication itself stays.",
|
||
"toast": "History deleted",
|
||
"failed": "Could not delete the history."
|
||
},
|
||
"delete": {
|
||
"title": "Delete medication",
|
||
"helper": "Removes the medication and every related record.",
|
||
"button": "Delete",
|
||
"dialogTitle": "Delete {name}?",
|
||
"dialogBody": "The medication, its schedules, intake history, API tokens, phase config and reminders will be removed permanently.",
|
||
"toast": "Medication deleted",
|
||
"failed": "Could not delete the medication."
|
||
}
|
||
},
|
||
"phases": {
|
||
"modeLabel": "{phase} mode",
|
||
"saveFailed": "Could not save the reminder phases."
|
||
},
|
||
"api": {
|
||
"caption": "Endpoint for \"{name}\"",
|
||
"copyUrl": "Copy URL",
|
||
"urlCopied": "URL copied",
|
||
"mintToken": "Mint token",
|
||
"mintAnotherToken": "Mint another token",
|
||
"mintFailed": "Could not mint a token.",
|
||
"copyFailed": "Could not copy.",
|
||
"tokenCopied": "Token copied",
|
||
"copyToken": "Copy token",
|
||
"mintedHint": "Copy this token now — it is shown only once."
|
||
},
|
||
"edit": {
|
||
"planOption": "Modifier le plan",
|
||
"advancedOption": "Paramètres avancés"
|
||
},
|
||
"advanced": {
|
||
"title": "Paramètres avancés",
|
||
"group": {
|
||
"data": "Données",
|
||
"reminders": "Rappels",
|
||
"lifecycle": "Cycle de vie",
|
||
"danger": "Zone de danger"
|
||
},
|
||
"dataPortability": {
|
||
"import": {
|
||
"title": "Importer les prises",
|
||
"helper": "Chargez les prises passées depuis un fichier JSON ou du JSON collé.",
|
||
"button": "Importer JSON"
|
||
},
|
||
"export": {
|
||
"title": "Exporter le médicament",
|
||
"helper": "Téléchargez ce médicament au format CSV.",
|
||
"includeIntake": "Inclure l'historique des prises",
|
||
"button": "Exporter CSV"
|
||
}
|
||
}
|
||
},
|
||
"header": {
|
||
"historyLabel": "Voir l'historique des prises",
|
||
"advancedLabel": "Paramètres avancés"
|
||
},
|
||
"history": {
|
||
"back": "Retour au médicament",
|
||
"subtitle": "Historique complet des prises",
|
||
"plannedSuffix": "prévu",
|
||
"drugLevelDisclosure": "Afficher la courbe estimée du principe actif"
|
||
}
|
||
}
|
||
},
|
||
"charts": {
|
||
"loadingLabel": "Chargement du graphique…",
|
||
"loadingSlowHint": "Calcul des analyses — cela peut prendre un instant.",
|
||
"weight": "Poids",
|
||
"bloodPressure": "Tension artérielle",
|
||
"pulse": "Pouls",
|
||
"bodyFat": "Masse grasse",
|
||
"sleep": "Sommeil",
|
||
"steps": "Pas",
|
||
"noData": "Aucune donnée sur la période sélectionnée",
|
||
"bucketWeekly": "Moyenne hebdomadaire",
|
||
"bucketMonthly": "Moyenne mensuelle",
|
||
"points7Label": "7 pts",
|
||
"points7Title": "Derniers 7 points",
|
||
"points30Label": "30 pts",
|
||
"points30Title": "Derniers 30 points",
|
||
"points90Label": "90 pts",
|
||
"points90Title": "Derniers 90 points",
|
||
"pointsAllLabel": "Tous",
|
||
"pointsAllTitle": "Tous les points disponibles",
|
||
"systolic": "Systolique",
|
||
"diastolic": "Diastolique",
|
||
"bodyWater": "Eau corporelle",
|
||
"boneMass": "Masse osseuse",
|
||
"spo2": "SpO₂",
|
||
"movingAverage7d": "Tendance 7 jours",
|
||
"avg7dShort": "7J",
|
||
"avg30dShort": "30J",
|
||
"trend7dShort": "Tendance 7 jours",
|
||
"trend": "Tendance",
|
||
"perWeek": "/semaine",
|
||
"totalDelta": "Total",
|
||
"colorGreen": "Vert :",
|
||
"colorOrange": "Orange :",
|
||
"colorRed": "Rouge :",
|
||
"mood": "Humeur",
|
||
"moodScore": "Score d’humeur",
|
||
"weekdays": {
|
||
"mon": "Lun",
|
||
"wed": "Mer",
|
||
"fri": "Ven",
|
||
"sun": "Dim"
|
||
},
|
||
"months": {
|
||
"jan": "Jan",
|
||
"feb": "Fév",
|
||
"mar": "Mar",
|
||
"apr": "Avr",
|
||
"may": "Mai",
|
||
"jun": "Juin",
|
||
"jul": "Juil",
|
||
"aug": "Août",
|
||
"sep": "Sept",
|
||
"oct": "Oct",
|
||
"nov": "Nov",
|
||
"dec": "Déc"
|
||
},
|
||
"heatmapOnTime": "à l’heure",
|
||
"heatmapLate": "en retard",
|
||
"heatmapVeryLate": "très en retard",
|
||
"legendOnTime": "À l’heure",
|
||
"legendLate": "En retard",
|
||
"legendVeryLate": "Très en retard",
|
||
"legendMissed": "Manquée",
|
||
"emptyStateTitle": "Saisis plus de mesures pour voir les tendances",
|
||
"emptyStateDescription": "Saisis au moins 3 entrées pour débloquer la courbe de tendance.",
|
||
"needMoreDistinctDaysTitle": "Plus de jours distincts requis",
|
||
"needMoreDistinctDaysDescription": "Saisis sur plusieurs jours pour débloquer la courbe de tendance.",
|
||
"noDataInRangeTitle": "Aucune donnée sur cette période",
|
||
"noDataInRangeDescription": "Aucune mesure ne tombe dans la plage sélectionnée. Change de plage ou saisis une nouvelle mesure.",
|
||
"personalBaseline": "Ta moyenne",
|
||
"deltaVsBaseline": "{delta} vs. ta moyenne",
|
||
"deltaUnchanged": "correspond à ta moyenne",
|
||
"deltaVsTarget": "{delta} vs. cible"
|
||
},
|
||
"chart": {
|
||
"overlay": {
|
||
"controls": {
|
||
"title": "Calques du graphique",
|
||
"trendIndicator": "Tendance 7 jours",
|
||
"trendArrow": "Flèche de tendance",
|
||
"targetRange": "Plage cible",
|
||
"comparisonBaseline": "Comparaison",
|
||
"comparisonUnavailable": "Aucune période antérieure disponible",
|
||
"tooltip": {
|
||
"openSettings": "Paramètres des calques de graphique"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"comparison": {
|
||
"toggleLabel": "Comparer avec",
|
||
"toggleHint": "Compare la période actuelle avec la même période de l’année précédente.",
|
||
"baseline": {
|
||
"none": "Désactivé",
|
||
"lastMonth": "Mois précédent",
|
||
"lastYear": "Année précédente"
|
||
},
|
||
"captionLastMonth": "vs. mois précédent",
|
||
"captionLastYear": "vs. année précédente",
|
||
"deltaVs": {
|
||
"lastMonth": "{delta} vs. mois précédent",
|
||
"lastYear": "{delta} vs. année précédente"
|
||
},
|
||
"tooltipPrior": "Période précédente",
|
||
"unavailable": {
|
||
"lastMonth": "Comparaison indisponible — pas de données du mois précédent",
|
||
"lastYear": "Comparaison indisponible — pas de données de l’année précédente"
|
||
},
|
||
"notAvailableForCompliance": "Comparaison indisponible pour l’observance"
|
||
},
|
||
"insights": {
|
||
"noAnalysisYet": "Pas encore d’analyse.",
|
||
"emptyTitle": "Pas encore assez de données",
|
||
"emptyDescription": "Les insights apparaissent dès que tu auras saisi quelques mesures. Commence par le poids ou la tension.",
|
||
"emptyAddMeasurement": "Saisir une mesure",
|
||
"bmiEmptyTitle": "Ajoute ta taille pour l’IMC",
|
||
"bmiEmptyDescription": "L’IMC nécessite ta taille. Renseigne-la dans Paramètres → Compte.",
|
||
"bmiEmptyAction": "Ouvrir les paramètres du compte",
|
||
"noProviderConfigured": "Analyse indisponible.",
|
||
"startAnalysis": "Lancer l’analyse",
|
||
"refreshAnalysis": "Actualiser l’analyse",
|
||
"keyTakeaway": "L’essentiel",
|
||
"findingsTitle": "Constats",
|
||
"heroFindingPositive": "Constat principal",
|
||
"heroFindingNeutral": "Constat principal",
|
||
"heroFindingAttention": "À surveiller",
|
||
"heroFindingWarning": "Alerte principale",
|
||
"correlationsTitle": "Corrélations",
|
||
"recommendationsTitle": "Recommandations",
|
||
"personalRecord": {
|
||
"badge": "PR",
|
||
"tooltip": "Record personnel : {value} {unit} le {date}"
|
||
},
|
||
"recommendation": {
|
||
"source": "Source",
|
||
"viewSource": "Ouvrir la recommandation dans un nouvel onglet",
|
||
"rationale": "Pourquoi cette recommandation",
|
||
"rationaleWindow": "Fenêtre",
|
||
"rationaleComparedTo": "Comparé à",
|
||
"rationaleDeviation": "Écart",
|
||
"rationaleExpand": "Afficher la justification",
|
||
"rationaleCollapse": "Masquer la justification",
|
||
"legacyPayloadCta": "Insights mis à jour — regénère pour activer les nouvelles explications",
|
||
"feedbackHelpful": "Utile",
|
||
"feedbackNotHelpful": "Peu utile",
|
||
"feedbackThanks": "Merci pour ton retour",
|
||
"feedbackConfirmed": "Retour enregistré",
|
||
"feedbackAlreadyRated": "Déjà noté",
|
||
"confidence": "Confiance",
|
||
"confidenceAria": "Confiance : {value} sur 100",
|
||
"confidenceHigh": "Confiance élevée",
|
||
"confidenceMedium": "Confiance moyenne",
|
||
"confidenceLow": "Confiance faible — peu de points de données",
|
||
"confidenceDraft": "Brouillon"
|
||
},
|
||
"dataFoundation": "Base de données",
|
||
"dataGaps": "Lacunes :",
|
||
"lastUpdated": "Dernière mise à jour",
|
||
"confidenceHoch": "Élevée",
|
||
"confidenceMittel": "Moyenne",
|
||
"confidenceGering": "Faible",
|
||
"loadError": "Impossible de charger les analyses",
|
||
"heroGenerated": "Généré {time}",
|
||
"heroPersonalBaseline": "Basé sur tes 90 derniers jours",
|
||
"heroRegenerate": "Régénérer",
|
||
"heroRegenerating": "Génération en cours",
|
||
"regenerateAnalysis": "Relancer l’analyse",
|
||
"regenerateSuccess": "Analyse regénérée",
|
||
"heroFallbackSubtitle": "Un coup d’œil quotidien sur tes tendances — directement issu des chiffres que tu saisis.",
|
||
"heroGreetingMorning": "Bonjour",
|
||
"heroGreetingAfternoon": "Bonjour",
|
||
"heroGreetingEvening": "Bonsoir",
|
||
"heroComingSoonTooltip": "Bientôt disponible",
|
||
"heroActionAskCoach": "Demander au coach",
|
||
"healthScore": {
|
||
"label": "Score de santé",
|
||
"progressAria": "Progression du score de santé",
|
||
"deltaVsLastWeek": "{delta} par rapport à la semaine précédente",
|
||
"deltaUnavailable": "Pas encore d’historique — reviens la semaine prochaine.",
|
||
"componentBp": "TA",
|
||
"componentWeight": "Poids",
|
||
"componentMood": "Humeur",
|
||
"componentCompliance": "Observance",
|
||
"disclaimer": "Repère — pas un avis médical.",
|
||
"deltaExplainer": {
|
||
"trigger": "Que signifie cet écart ?",
|
||
"title": "Comment l'écart est calculé",
|
||
"description": "Écart par rapport à la semaine dernière : {delta}",
|
||
"body": "Le score combine TA, poids, humeur et observance. Nous comparons le score d'aujourd'hui à celui de la semaine précédente à la même période. Enregistre une nouvelle mesure ou une note d'humeur pour le faire remonter."
|
||
},
|
||
"provenance": {
|
||
"toggle": "Composé de",
|
||
"weightLabel": "part",
|
||
"mixedBanner": "Certains composants combinent plusieurs sources. La ventilation affiche la valeur la plus récente par composant.",
|
||
"footnote": "Les pondérations sont recalibrées en fonction des données disponibles.",
|
||
"asOfLabel": "au {date}",
|
||
"provisional": "Provisoire — seulement {count} entrée(s) sur {total} disponible(s)",
|
||
"provisionalBadge": "Provisoire",
|
||
"sourceAria": "Source : {source}",
|
||
"sources": {
|
||
"manual": "Manuelle",
|
||
"withings": "Withings",
|
||
"appleHealth": "Apple Health",
|
||
"mixed": "Mixte",
|
||
"none": "Aucune donnée"
|
||
}
|
||
}
|
||
},
|
||
"suggestedPrompts": {
|
||
"label": "Demande-moi",
|
||
"whyMonday": "Pourquoi ma tension était-elle plus haute lundi ?",
|
||
"weightVsPulse": "Comment la perte de poids a-t-elle influé sur mon pouls ?",
|
||
"weekVsMonth": "Compare cette semaine avec le mois dernier",
|
||
"tellMyDoctor": "Que devrais-je dire à mon médecin ?",
|
||
"medicationWorking": "Mon médicament fonctionne-t-il ?"
|
||
},
|
||
"dailyBriefing": {
|
||
"title": "Briefing du jour",
|
||
"keyFindingsTitle": "Constats clés",
|
||
"emptyTitle": "Pas encore de briefing",
|
||
"emptyDescription": "Génère le briefing du jour pour obtenir un récap de tes tendances.",
|
||
"emptyAction": "Générer le briefing",
|
||
"loadingLabel": "Préparation du briefing"
|
||
},
|
||
"therapyTimeline": {
|
||
"title": "Historique du traitement GLP-1",
|
||
"description": "Liste chronologique : changements de dose, injections, stock et jours d’effets secondaires.",
|
||
"empty": "Aucun événement GLP-1 sur les 90 derniers jours.",
|
||
"doseTo": "Dose à",
|
||
"pens": "Stylos",
|
||
"sideEffects": "Effets secondaires"
|
||
},
|
||
"trendsRow": {
|
||
"title": "Tendances",
|
||
"subtitle": "Les 30 derniers jours en un coup d’œil"
|
||
},
|
||
"vo2Max": {
|
||
"statLatest": "Actuel",
|
||
"statMin": "Min",
|
||
"statMax": "Max",
|
||
"empty": "Pas encore de données VO₂ max — synchronise Apple Health pour remplir cette vue."
|
||
},
|
||
"trendAnnotation": {
|
||
"emptyBp": "Il faut plus de données pour commenter cette tendance.",
|
||
"emptyWeight": "Il faut plus de données pour commenter cette tendance.",
|
||
"emptyMood": "Il faut plus de données pour commenter cette tendance.",
|
||
"confidenceHigh": "Confiance élevée",
|
||
"confidenceModerate": "Confiance moyenne",
|
||
"confidenceLow": "Confiance faible",
|
||
"pendingLabel": "Commentaire de tendance en cours de génération"
|
||
},
|
||
"correlationRow": {
|
||
"title": "Corrélations",
|
||
"subtitle": "Hypothèses prédéfinies, validées si n ≥ 14 et p < 0,05",
|
||
"disclaimer": "Les corrélations sont observationnelles, pas causales — parle à ton médecin si ta tension est élevée.",
|
||
"experimentCta": "Lancer une expérience de 7 jours",
|
||
"experimentTooltip": "Bientôt disponible",
|
||
"emptyTitle": "Il faut plus de données pour afficher cette corrélation",
|
||
"sourceChip": "sur la base de {n} mesures appariées · {window}",
|
||
"sourceWindowLast30": "30 derniers jours",
|
||
"confidenceHigh": "Confiance élevée",
|
||
"confidenceModerate": "Confiance moyenne",
|
||
"confidenceLow": "Confiance faible",
|
||
"card": {
|
||
"bpComplianceTitle": "TA × observance médicaments",
|
||
"bpComplianceSubtitle": "Systolique quotidienne face au % d’observance",
|
||
"moodPulseTitle": "Humeur × pouls au repos",
|
||
"moodPulseSubtitle": "Humeur et pouls au repos le même jour",
|
||
"weightWeekdayTitle": "Poids × jour de la semaine",
|
||
"weightWeekdaySubtitle": "Poids groupé par jour de la semaine"
|
||
}
|
||
},
|
||
"coach": {
|
||
"refusalOutOfScope": "Je ne peux aider que pour les données de santé de ton journal — mesures, médicaments, humeur, tendances. Les questions hors de ce périmètre ne sont pas traitées.",
|
||
"refusalInjection": "Ton message contient des instructions qui cherchent à remplacer mes consignes. Je suis le coach HealthLog et je ne résume que tes propres données de santé — reformule ta question dans ce cadre.",
|
||
"errorBudget": "Tu as atteint la limite quotidienne du coach. Le quota se réinitialise à minuit (UTC).",
|
||
"errorProvider": "Le coach n’a pas pu joindre un fournisseur d’analyse maintenant. Réessaie dans un instant.",
|
||
"errorNetwork": "Pas de connexion Internet — réessaie une fois reconnecté.",
|
||
"tagline": "Coach personnel de santé, ancré sur tes données.",
|
||
"newChat": "Nouvelle conversation",
|
||
"send": "Envoyer",
|
||
"thinking": "Réflexion en cours…",
|
||
"composerPlaceholder": "Pose-moi une question sur tes données…",
|
||
"composerHint": "Entrée pour envoyer, Maj+Entrée pour une nouvelle ligne.",
|
||
"composerDisclaimer": "Les réponses sont générées. Les décisions cliniques relèvent de ton médecin.",
|
||
"voiceComingSoon": "La saisie vocale arrive avec l’app iOS en v1.5.",
|
||
"threadEmpty": "Pose une question sur tes tendances, médicaments ou mesures pour démarrer.",
|
||
"historyTitle": "Conversations",
|
||
"historySearchPlaceholder": "Rechercher dans les conversations…",
|
||
"historyEmpty": "Tes conversations s’affichent ici. Lance une question pour commencer.",
|
||
"historyDeleteAria": "Supprimer la conversation",
|
||
"historyDeleteConfirm": "Supprimer cette conversation ? Action irréversible.",
|
||
"sourcesTitle": "Ce à quoi j’accède",
|
||
"sourcesFresh": "À jour",
|
||
"sourcesStale": "Obsolètes",
|
||
"sourcesFooter": "Le coach ne lit que les données que tu as connectées.",
|
||
"evidenceLabel": "Sur quoi est-ce fondé ?",
|
||
"metric": {
|
||
"bp": "Tension artérielle",
|
||
"weight": "Poids",
|
||
"pulse": "Pouls",
|
||
"mood": "Humeur",
|
||
"compliance": "Observance",
|
||
"general": "Général",
|
||
"hrv": "VFC",
|
||
"sleep": "Sommeil",
|
||
"resting_hr": "Pouls au repos",
|
||
"steps": "Pas",
|
||
"active_energy": "Énergie active",
|
||
"flights": "Étages",
|
||
"distance": "Distance",
|
||
"vo2_max": "VO₂ max",
|
||
"body_temp": "Température corporelle",
|
||
"medications": "Médicaments",
|
||
"anthropometrics": "Profil (taille, âge, sexe)",
|
||
"walking_hr": "Fréquence cardiaque à la marche",
|
||
"respiratory_rate": "Fréquence respiratoire",
|
||
"spo2": "Oxygène sanguin",
|
||
"pulse_wave_velocity": "Vitesse de l'onde de pouls",
|
||
"vascular_age": "Âge vasculaire",
|
||
"body_fat": "Masse grasse",
|
||
"fat_mass": "Masse grasse",
|
||
"fat_free_mass": "Masse sans graisse",
|
||
"muscle_mass": "Masse musculaire",
|
||
"lean_body_mass": "Masse maigre",
|
||
"bone_mass": "Masse osseuse",
|
||
"total_body_water": "Eau corporelle",
|
||
"bmi": "IMC",
|
||
"visceral_fat": "Graisse viscérale",
|
||
"glucose": "Glycémie",
|
||
"walking_steadiness": "Stabilité à la marche",
|
||
"walking_asymmetry": "Asymétrie de marche",
|
||
"walking_double_support": "Temps de double appui",
|
||
"walking_step_length": "Longueur de foulée",
|
||
"walking_speed": "Vitesse de marche",
|
||
"audio_env": "Son ambiant",
|
||
"audio_headphone": "Audio du casque",
|
||
"audio_event": "Événements sonores forts",
|
||
"daylight": "Temps à la lumière du jour",
|
||
"skin_temp": "Température cutanée",
|
||
"workouts": "Entraînements"
|
||
},
|
||
"window": {
|
||
"last7days": "7 derniers jours",
|
||
"last30days": "30 derniers jours",
|
||
"last90days": "90 derniers jours",
|
||
"lastYear": "depuis le début de l'année",
|
||
"allTime": "Toute la période"
|
||
},
|
||
"windowLabel": "Période",
|
||
"settingsAriaLabel": "Paramètres du coach",
|
||
"settingsTitle": "Paramètres du coach",
|
||
"settingsDescription": "Configure comment le coach te parle.",
|
||
"settingsToneLabel": "Ton",
|
||
"settingsToneWarm": "Chaleureux",
|
||
"settingsToneNeutral": "Neutre",
|
||
"settingsToneConcise": "Concis",
|
||
"settingsVerbosityLabel": "Longueur de réponse",
|
||
"settingsVerbosityBrief": "Bref",
|
||
"settingsVerbosityDefault": "Standard",
|
||
"settingsVerbosityDetailed": "Détaillé",
|
||
"settingsExcludeLabel": "Exclure des métriques",
|
||
"settingsExcludeHint": "Le coach ne verra pas les données des métriques sélectionnées.",
|
||
"settingsEvidenceLabel": "Afficher les preuves par défaut",
|
||
"settingsEvidenceHint": "Ouvre automatiquement l’encadré preuves sous chaque réponse.",
|
||
"settingsDefaultWindowLabel": "Période d’analyse par défaut",
|
||
"settingsDefaultWindowHint": "Le coach lit cette période par chat, sauf si tu en choisis une autre dans l’en-tête du panneau.",
|
||
"settingsSave": "Enregistrer",
|
||
"settingsSaved": "Enregistré.",
|
||
"settingsCancel": "Annuler",
|
||
"feedbackHelpful": "Utile",
|
||
"feedbackUnhelpful": "Peu utile",
|
||
"feedbackThanks": "Merci pour l’indication.",
|
||
"dailyLimitTitle": "Limite quotidienne atteinte",
|
||
"dailyLimitBody": "Limite quotidienne atteinte ; réinitialisation à 00:00 UTC.",
|
||
"providerRateLimitTitle": "Fournisseur limité en débit",
|
||
"providerRateLimitBody": "Le fournisseur est temporairement saturé ; réinitialisation dans ~5 min.",
|
||
"settingsContextLabel": "Envoyer le contexte",
|
||
"settingsContextHint": "Blocs optionnels sur lesquels le coach peut s’appuyer. Si tu en désactives un, il sera omis dans chaque réponse.",
|
||
"cluster": {
|
||
"cardio": {
|
||
"label": "Cardiovasculaire",
|
||
"hint": "TA · pouls · VFC · FC repos & marche"
|
||
},
|
||
"body": {
|
||
"label": "Composition corporelle",
|
||
"hint": "Poids · masse grasse · muscle · IMC"
|
||
},
|
||
"activity": {
|
||
"label": "Activité",
|
||
"hint": "Pas · énergie · distance · VO₂ max"
|
||
},
|
||
"workouts": {
|
||
"label": "Entraînements",
|
||
"hint": "Courses · sorties · séances"
|
||
},
|
||
"sleep": {
|
||
"label": "Sommeil",
|
||
"hint": "Durée · phases"
|
||
},
|
||
"mood": {
|
||
"label": "Humeur",
|
||
"hint": "Entrées d'humeur quotidiennes"
|
||
},
|
||
"glucose": {
|
||
"label": "Glycémie",
|
||
"hint": "Mesures à jeun & postprandiales"
|
||
},
|
||
"medication": {
|
||
"label": "Médication",
|
||
"hint": "Observance · contexte GLP-1"
|
||
},
|
||
"mobility": {
|
||
"label": "Mobilité & démarche",
|
||
"hint": "Stabilité · asymétrie · démarche"
|
||
},
|
||
"environment": {
|
||
"label": "Environnement",
|
||
"hint": "Bruit · lumière · temp. cutanée"
|
||
}
|
||
},
|
||
"settingsClustersLabel": "Données vues par le Coach",
|
||
"settingsClustersHint": "Choisissez les groupes de données que le Coach peut lire. Plus de données, des réponses plus riches et un prompt plus grand.",
|
||
"settingsClusterNoData": "Pas encore de données",
|
||
"sourcesMemberCount": "{count} mesures"
|
||
},
|
||
"relativeJustNow": "à l’instant",
|
||
"relativeMinutesAgoOne": "il y a {count} minute",
|
||
"relativeMinutesAgoOther": "il y a {count} minutes",
|
||
"relativeHoursAgoOne": "il y a {count} heure",
|
||
"relativeHoursAgoOther": "il y a {count} heures",
|
||
"relativeDaysAgoOne": "il y a {count} jour",
|
||
"relativeDaysAgoOther": "il y a {count} jours",
|
||
"navOverview": "Vue d'ensemble",
|
||
"navBloodPressure": "Tension artérielle",
|
||
"navWeight": "Poids",
|
||
"navPulse": "Pouls",
|
||
"navMood": "Humeur",
|
||
"navMedication": "Médicament",
|
||
"navBmi": "IMC",
|
||
"navSleep": "Sommeil",
|
||
"navHrv": "VFC",
|
||
"navRestingHr": "FC repos",
|
||
"navOxygenSaturation": "Oxygène",
|
||
"navBodyTemperature": "Température",
|
||
"navActiveEnergy": "Énergie active",
|
||
"navAriaLabel": "Aller à la section",
|
||
"tabStrip": {
|
||
"vitalsParent": {
|
||
"label": "Constantes",
|
||
"header": "Constantes vitales"
|
||
},
|
||
"bodyParent": {
|
||
"label": "Corps",
|
||
"header": "Composition corporelle"
|
||
},
|
||
"activityParent": {
|
||
"label": "Activité",
|
||
"header": "Activité et mobilité"
|
||
},
|
||
"cardiovascularParent": {
|
||
"label": "Cardiovasculaire",
|
||
"header": "Marqueurs cardiovasculaires"
|
||
},
|
||
"hearingParent": {
|
||
"label": "Audition",
|
||
"header": "Audition et exposition sonore"
|
||
},
|
||
"environmentParent": {
|
||
"label": "Environnement",
|
||
"header": "Environnement"
|
||
},
|
||
"metabolicParent": {
|
||
"label": "Métabolique",
|
||
"header": "Métabolique"
|
||
}
|
||
},
|
||
"hrv": {
|
||
"title": "VFC",
|
||
"description": "Variabilité de la fréquence cardiaque dans le temps — signal de récupération du système nerveux, capté la nuit par l'Apple Watch et d'autres wearables compatibles.",
|
||
"chartTitle": "Variabilité de la fréquence cardiaque",
|
||
"emptyState": {
|
||
"title": "Aucune mesure de VFC",
|
||
"description": "Les mesures de VFC apparaîtront ici dès que l'Apple Watch (ou un appareil Withings compatible) synchronisera des relevés nocturnes."
|
||
}
|
||
},
|
||
"restingHr": {
|
||
"title": "FC au repos",
|
||
"description": "La fréquence cardiaque de base sur la journée — distincte des pointages ponctuels de la page Pulse. Apple Santé fournit une valeur par jour.",
|
||
"chartTitle": "Fréquence cardiaque au repos",
|
||
"emptyState": {
|
||
"title": "Aucune FC au repos",
|
||
"description": "La FC au repos arrive dès que l'Apple Watch ou un appareil Withings compatible a porté une journée calme."
|
||
}
|
||
},
|
||
"oxygenSaturation": {
|
||
"title": "Saturation en oxygène",
|
||
"description": "Oxygène sanguin (SpO₂) — plage clinique normale 95–100 %, avec zones cibles ombrées sur le graphique.",
|
||
"chartTitle": "Saturation en oxygène",
|
||
"emptyState": {
|
||
"title": "Aucune mesure SpO₂",
|
||
"description": "Les mesures SpO₂ apparaîtront dès qu'un wearable compatible (Apple Watch, Withings ScanWatch) en capturera une."
|
||
}
|
||
},
|
||
"bodyTemperature": {
|
||
"title": "Température corporelle",
|
||
"description": "Tendance de température corporelle centrale en Celsius. La température cutanée Withings vit sur une métrique distincte.",
|
||
"chartTitle": "Température corporelle",
|
||
"emptyState": {
|
||
"title": "Aucune température corporelle",
|
||
"description": "Enregistre une mesure ou laisse ton wearable en synchroniser une — la tendance apparaîtra ici.",
|
||
"cta": "Enregistrer la température"
|
||
}
|
||
},
|
||
"activeEnergy": {
|
||
"title": "Énergie active",
|
||
"description": "Total quotidien d'énergie active en kilocalories — une ligne par jour, depuis Apple Santé ou Withings activité.",
|
||
"chartTitle": "Énergie active",
|
||
"emptyState": {
|
||
"title": "Aucune donnée d'énergie active",
|
||
"description": "Les totaux d'énergie active apparaîtront dès qu'Apple Santé ou un appareil Withings activité synchronise une journée complète."
|
||
}
|
||
},
|
||
"subPage": {
|
||
"blutdruckDescription": "Ton évolution systolique/diastolique avec des plages cibles adaptées à l’âge et une évaluation textuelle.",
|
||
"gewichtDescription": "Évolution du poids face à la bande saine dérivée de ta taille, avec évaluation.",
|
||
"pulsDescription": "Resting pulse vs. the personalised Karvonen target band, plus a written assessment.",
|
||
"stimmungDescription": "Valeurs d’humeur quotidiennes dans le temps, avec une évaluation textuelle.",
|
||
"stimmungEmptyTitle": "Saisir la première humeur",
|
||
"stimmungEmptyDescription": "Les insights d’humeur apparaissent dès que tu auras saisi quelques entrées. Appuie ci-dessous pour démarrer.",
|
||
"stimmungEmptyAction": "Ouvrir le journal d’humeur",
|
||
"medikamenteDescription": "Calendrier des prises par médicament, ainsi qu’une évaluation textuelle.",
|
||
"medikamenteEmptyTitle": "Ajouter le premier médicament",
|
||
"medikamenteEmptyDescription": "Les insights d’observance ont besoin d’au moins un médicament enregistré.",
|
||
"medikamenteEmptyAction": "Ouvrir les médicaments",
|
||
"therapyTimelineDescription": "Journal chronologique de la thérapie GLP-1 — changements de dose, injections, stock, effets secondaires.",
|
||
"bmiDescription": "IMC dérivé de ton poids et de ta taille, avec évaluation.",
|
||
"target": {
|
||
"range": "Cible : {min}–{max} {unit}",
|
||
"bpRange": "Cible : {sysMin}–{sysMax} / {diaMin}–{diaMax} {unit}",
|
||
"inTargetShare": "{pct}% des jours enregistrés dans la cible",
|
||
"adjustLink": "Ajuster la plage cible"
|
||
},
|
||
"explainer": {
|
||
"trigger": "Qu'est-ce que {title} ?",
|
||
"blutdruckTitle": "Tension artérielle",
|
||
"blutdruckBody": "La tension artérielle est la force exercée par le sang sur les parois des artères, exprimée en systolique sur diastolique (le pic lors d'un battement sur la valeur de repos entre les battements). Des valeurs durablement élevées sollicitent le cœur et les vaisseaux à la longue.",
|
||
"pulsTitle": "Pouls",
|
||
"pulsBody": "Le pouls correspond au nombre de battements du cœur par minute. Une mesure ponctuelle reflète ce que vous faisiez à l'instant : au repos, il est généralement de 60 à 100 battements par minute et augmente naturellement avec le mouvement, le stress ou la caféine.",
|
||
"gewichtTitle": "Poids",
|
||
"gewichtBody": "Le poids corporel est l'un des signaux les plus simples de l'équilibre énergétique à long terme et de la santé globale. La tendance sur plusieurs semaines compte bien plus qu'une mesure isolée, qui varie avec l'hydratation, l'alimentation et l'heure de la journée.",
|
||
"bmiTitle": "Indice de masse corporelle (IMC)",
|
||
"bmiBody": "L'IMC correspond à votre poids divisé par votre taille au carré, un seul chiffre qui vous situe dans une large catégorie de poids. C'est un dépistage de population, pas un diagnostic, et il ne distingue pas le muscle de la graisse.",
|
||
"schlafTitle": "Sommeil",
|
||
"schlafBody": "La durée du sommeil est le temps réellement dormi au cours de la nuit, réparti entre sommeil léger, profond et paradoxal. La plupart des adultes ont besoin d'environ sept à neuf heures ; une quantité et une qualité régulières soutiennent la récupération, l'humeur et le métabolisme.",
|
||
"stimmungTitle": "Humeur",
|
||
"stimmungBody": "Le suivi de l'humeur consigne ce que vous ressentez au fil du temps sur une échelle simple. Le noter régulièrement révèle des tendances — comment le sommeil, l'activité ou les médicaments s'alignent sur votre ressenti — qu'une seule journée ne montre jamais.",
|
||
"medikamenteTitle": "Observance du traitement",
|
||
"medikamenteBody": "L'observance mesure la fiabilité avec laquelle vous prenez votre traitement comme prescrit, ici sous forme de la part des doses attendues que vous avez enregistrées. Une prise régulière est souvent ce qui permet à un traitement d'agir comme prévu.",
|
||
"restingHrTitle": "Fréquence cardiaque au repos",
|
||
"restingHrBody": "La fréquence cardiaque au repos est votre rythme cardiaque lorsque vous êtes totalement au repos, généralement mesuré la nuit. Une fréquence plus basse indique souvent une meilleure forme cardiovasculaire, et une tendance à la hausse peut être un signe précoce de stress ou de maladie.",
|
||
"hrvTitle": "Variabilité de la fréquence cardiaque (VFC)",
|
||
"hrvBody": "La VFC est la petite variation du temps entre des battements consécutifs. Une variabilité plus élevée reflète généralement un système nerveux bien récupéré et adaptable, tandis qu'une baisse durable peut signaler de la fatigue, du stress ou une récupération insuffisante.",
|
||
"oxygenSaturationTitle": "Saturation en oxygène (SpO₂)",
|
||
"oxygenSaturationBody": "La SpO₂ est le pourcentage de globules rouges transportant de l'oxygène. Des valeurs de 95 à 100 % sont normales au repos ; des valeurs qui restent sous 90 % méritent attention, bien que de brèves baisses nocturnes soient fréquentes.",
|
||
"bodyTemperatureTitle": "Température corporelle",
|
||
"bodyTemperatureBody": "La température corporelle reflète votre état thermique central, normalement autour de 37 °C avec de petites variations quotidiennes. Une hausse durable peut indiquer une infection, tandis que les mesures nocturnes au poignet suivent surtout des variations relatives plutôt qu'une valeur clinique.",
|
||
"activeEnergyTitle": "Énergie active",
|
||
"activeEnergyBody": "L'énergie active correspond aux calories que vous brûlez par le mouvement, en plus de la dépense de base au repos. C'est une mesure directe du niveau d'activité physique de votre journée.",
|
||
"workoutsTitle": "Entraînements",
|
||
"workoutsBody": "Les entraînements sont les séances d'exercice structurées que vos appareils enregistrent, avec le type, la durée et l'énergie. Les suivre montre comment un entraînement régulier s'accumule au fil des semaines et comment il se relie à vos autres signaux de santé."
|
||
}
|
||
},
|
||
"sleep": {
|
||
"title": "Sommeil",
|
||
"description": "Répartition des phases et durée nocturne, issues d’Apple Health.",
|
||
"headlineTitle": "Moyenne par nuit",
|
||
"headlineCaption": "Moyenne sur {count} nuits — {suffix}",
|
||
"headlineCaptionSuffix": "par nuit",
|
||
"compositionTitle": "Répartition des phases",
|
||
"compositionSubtitle": "{nights} dernières nuits",
|
||
"compositionAriaLabel": "Répartition des phases de sommeil sur {nights} nuits",
|
||
"stages": {
|
||
"deep": "Profond",
|
||
"rem": "REM",
|
||
"core": "Léger",
|
||
"asleep": "Endormi",
|
||
"awake": "Éveillé",
|
||
"inBed": "Au lit",
|
||
"unavailable": "Pas encore de données de phases — la synchro des phases via Apple Health arrive avec la v1.5."
|
||
},
|
||
"empty": {
|
||
"title": "Pas encore de données de sommeil",
|
||
"description": "La synchro Apple Health arrive avec la v1.5 et remplira automatiquement cette vue.",
|
||
"action": "Gérer les appareils"
|
||
}
|
||
},
|
||
"correlations": "Corrélations",
|
||
"medicationCompliance": "Observance des médicaments",
|
||
"dayStreak": "{count} jours de série",
|
||
"compliance7d": "Observance 7 jours",
|
||
"compliance30d": "Observance 30 jours",
|
||
"taken": "Pris",
|
||
"skipped": "Sauté",
|
||
"missed": "Manqué",
|
||
"generalStatusBadge": {
|
||
"good": "Bien",
|
||
"watch": "Surveiller",
|
||
"critical": "Critique"
|
||
},
|
||
"assessmentTitle": "Évaluation",
|
||
"bloodPressureSectionTitle": "Tension artérielle",
|
||
"weightSectionTitle": "Poids",
|
||
"pulseSectionTitle": "Pouls",
|
||
"bmiSectionTitle": "IMC",
|
||
"complianceNoData": "Aucune donnée d’observance disponible",
|
||
"generate": "Générer une nouvelle analyse",
|
||
"moodSectionTitle": "Humeur",
|
||
"confidence": "Confiance",
|
||
"cached": "En cache",
|
||
"emptyState": {
|
||
"bloodPressure": {
|
||
"title": "Aucune mesure de tension artérielle",
|
||
"description": "Enregistrez une mesure de tension : la tendance, la part dans la cible et la classification OMS s'afficheront ici.",
|
||
"cta": "Enregistrer une tension"
|
||
},
|
||
"weight": {
|
||
"title": "Aucune mesure de poids",
|
||
"description": "Enregistrez un poids : la tendance, la moyenne glissante et la zone cible apparaîtront automatiquement.",
|
||
"cta": "Enregistrer un poids"
|
||
},
|
||
"pulse": {
|
||
"title": "Aucune mesure de pouls",
|
||
"description": "Enregistrez un pouls : pouls au repos, VFC et VO₂ max apparaîtront dans cette vue.",
|
||
"cta": "Enregistrer un pouls"
|
||
},
|
||
"bmi": {
|
||
"title": "IMC pas encore calculé",
|
||
"description": "Dès qu'une taille et au moins un poids sont enregistrés, la tendance IMC avec les zones OMS s'affichera ici.",
|
||
"cta": "Enregistrer un poids"
|
||
},
|
||
"mood": {
|
||
"title": "Aucune entrée d'humeur",
|
||
"description": "Enregistrez une humeur : la tendance, la bande de stabilité et les corrélations s'afficheront.",
|
||
"cta": "Enregistrer une humeur"
|
||
},
|
||
"medication": {
|
||
"title": "Aucun médicament configuré",
|
||
"description": "Configurez un médicament : observance, taux plasmatique et titration apparaîtront ici.",
|
||
"cta": "Ajouter un médicament"
|
||
},
|
||
"sleep": {
|
||
"title": "Aucune donnée de sommeil",
|
||
"description": "Dès que des données de sommeil sont disponibles (manuel ou via Withings / Apple Health), la répartition par stade apparaîtra ici.",
|
||
"cta": "Connecter Withings"
|
||
}
|
||
},
|
||
"navWorkouts": "Entraînements",
|
||
"workouts": {
|
||
"title": "Entraînements",
|
||
"description": "Courses, sorties à vélo, marches et séances de musculation récentes, dédupliquées entre Apple Watch et Withings.",
|
||
"emptyState": {
|
||
"title": "Aucun entraînement",
|
||
"description": "Ouvre l'app Apple Santé sur ton iPhone pour synchroniser tes entraînements. L'import d'activité Withings alimente également la marche et le vélo."
|
||
},
|
||
"row": {
|
||
"duration": "Durée",
|
||
"distance": "Distance",
|
||
"energy": "Énergie active"
|
||
},
|
||
"detail": {
|
||
"backToList": "Retour aux entraînements",
|
||
"statsTitle": "Statistiques",
|
||
"statsDuration": "Durée",
|
||
"statsDistance": "Distance",
|
||
"statsActiveEnergy": "Énergie active",
|
||
"statsAvgHr": "FC moyenne",
|
||
"statsMaxHr": "FC max",
|
||
"statsMinHr": "FC min",
|
||
"statsStepCount": "Pas",
|
||
"statsElevation": "Dénivelé",
|
||
"statsPace": "Allure",
|
||
"statsSource": "Source",
|
||
"routeTitle": "Parcours",
|
||
"routeUnavailable": "Aucun parcours GPS enregistré pour cet entraînement.",
|
||
"hrChartTitle": "Fréquence cardiaque",
|
||
"hrChartUnavailable": "Les échantillons de fréquence cardiaque à la seconde ne sont pas stockés pour cet entraînement.",
|
||
"notFound": "Entraînement introuvable.",
|
||
"loading": "Chargement de l'entraînement…"
|
||
},
|
||
"sport": {
|
||
"walking": "Marche",
|
||
"running": "Course",
|
||
"cycling": "Vélo",
|
||
"hiking": "Randonnée",
|
||
"swimming": "Natation",
|
||
"rowing": "Aviron",
|
||
"elliptical": "Elliptique",
|
||
"stairClimber": "Stepper",
|
||
"yoga": "Yoga",
|
||
"mindAndBody": "Mind and Body",
|
||
"strength": "Musculation",
|
||
"hiit": "HIIT",
|
||
"dance": "Danse",
|
||
"golf": "Golf",
|
||
"tennis": "Tennis",
|
||
"basketball": "Basket",
|
||
"soccer": "Football",
|
||
"crossTraining": "Cross-training",
|
||
"mixedCardio": "Cardio mixte",
|
||
"other": "Autre"
|
||
}
|
||
},
|
||
"bloodGlucose": {
|
||
"title": "Glycémie",
|
||
"description": "Vos relevés de glycémie au fil du temps, en mg/dL.",
|
||
"chartTitle": "Glycémie",
|
||
"emptyState": {
|
||
"title": "Aucune donnée de glycémie",
|
||
"description": "Les relevés de glycémie apparaissent ici dès que vous en saisissez un ou qu’un appareil se synchronise."
|
||
}
|
||
},
|
||
"navBloodGlucose": "Glucose",
|
||
"totalBodyWater": {
|
||
"title": "Eau corporelle totale",
|
||
"description": "Votre eau corporelle totale au fil du temps, en kilogrammes.",
|
||
"chartTitle": "Eau corporelle totale",
|
||
"emptyState": {
|
||
"title": "Aucune donnée d’eau corporelle",
|
||
"description": "Les relevés d’eau corporelle apparaissent ici dès qu’une balance à impédance se synchronise."
|
||
}
|
||
},
|
||
"navTotalBodyWater": "Eau corporelle",
|
||
"boneMass": {
|
||
"title": "Masse osseuse",
|
||
"description": "Votre masse osseuse au fil du temps, en kilogrammes.",
|
||
"chartTitle": "Masse osseuse",
|
||
"emptyState": {
|
||
"title": "Aucune donnée de masse osseuse",
|
||
"description": "Les relevés de masse osseuse apparaissent ici dès qu’une balance à impédance se synchronise."
|
||
}
|
||
},
|
||
"navBoneMass": "Masse osseuse",
|
||
"flightsClimbed": {
|
||
"title": "Étages gravis",
|
||
"description": "Volées d’escaliers gravies chaque jour.",
|
||
"chartTitle": "Étages gravis par jour",
|
||
"emptyState": {
|
||
"title": "Aucune donnée d’étages",
|
||
"description": "Les totaux d’étages apparaissent ici dès qu’Apple Health synchronise une journée."
|
||
}
|
||
},
|
||
"navFlightsClimbed": "Étages",
|
||
"walkingRunningDistance": {
|
||
"title": "Distance marche + course",
|
||
"description": "Distance de marche et de course parcourue chaque jour, en kilomètres.",
|
||
"chartTitle": "Distance par jour",
|
||
"emptyState": {
|
||
"title": "Aucune donnée de distance",
|
||
"description": "La distance quotidienne apparaît ici dès qu’Apple Health synchronise une journée."
|
||
}
|
||
},
|
||
"navWalkingRunningDistance": "Distance",
|
||
"fatFreeMass": {
|
||
"title": "Masse sans graisse",
|
||
"description": "Votre masse sans graisse au fil du temps, en kilogrammes.",
|
||
"chartTitle": "Masse sans graisse",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’une balance à impédance se synchronise."
|
||
}
|
||
},
|
||
"navFatFreeMass": "Masse maigre",
|
||
"fatMass": {
|
||
"title": "Masse grasse",
|
||
"description": "Votre masse grasse au fil du temps, en kilogrammes.",
|
||
"chartTitle": "Masse grasse",
|
||
"emptyState": {
|
||
"title": "Aucune donnée de masse grasse",
|
||
"description": "Les relevés apparaissent ici dès qu’une balance à impédance se synchronise."
|
||
}
|
||
},
|
||
"navFatMass": "Masse grasse",
|
||
"muscleMass": {
|
||
"title": "Masse musculaire",
|
||
"description": "Votre masse musculaire au fil du temps, en kilogrammes.",
|
||
"chartTitle": "Masse musculaire",
|
||
"emptyState": {
|
||
"title": "Aucune donnée musculaire",
|
||
"description": "Les relevés apparaissent ici dès qu’une balance à impédance se synchronise."
|
||
}
|
||
},
|
||
"navMuscleMass": "Masse musculaire",
|
||
"skinTemperature": {
|
||
"title": "Température cutanée",
|
||
"description": "La température cutanée de votre poignet au fil du temps, en degrés Celsius.",
|
||
"chartTitle": "Température cutanée",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’un appareil synchronise la température nocturne."
|
||
}
|
||
},
|
||
"navSkinTemperature": "Temp. peau",
|
||
"pulseWaveVelocity": {
|
||
"title": "Vitesse de l’onde de pouls",
|
||
"description": "Votre vitesse d’onde de pouls artérielle au fil du temps, en m/s — des valeurs plus élevées suggèrent des artères plus rigides.",
|
||
"chartTitle": "Vitesse de l’onde de pouls",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’un appareil Withings compatible se synchronise."
|
||
}
|
||
},
|
||
"navPulseWaveVelocity": "Vitesse onde de pouls",
|
||
"vascularAge": {
|
||
"title": "Âge vasculaire",
|
||
"description": "Votre âge vasculaire estimé au fil du temps, en années.",
|
||
"chartTitle": "Âge vasculaire",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les estimations apparaissent ici dès qu’un appareil Withings compatible se synchronise."
|
||
}
|
||
},
|
||
"navVascularAge": "Âge vasculaire",
|
||
"visceralFat": {
|
||
"title": "Graisse viscérale",
|
||
"description": "Votre indice de graisse viscérale au fil du temps.",
|
||
"chartTitle": "Graisse viscérale",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les indices apparaissent ici dès qu’une balance à impédance compatible se synchronise."
|
||
}
|
||
},
|
||
"navVisceralFat": "Graisse viscérale",
|
||
"audioExposureEnv": {
|
||
"title": "Audio ambiant",
|
||
"description": "Votre exposition quotidienne moyenne au son ambiant, en dBA.",
|
||
"chartTitle": "Exposition au son ambiant",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les niveaux sonores apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navAudioExposureEnv": "Audio ambiant",
|
||
"audioExposureHeadphone": {
|
||
"title": "Audio du casque",
|
||
"description": "Votre exposition quotidienne moyenne au casque, en dBA.",
|
||
"chartTitle": "Exposition au casque",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les niveaux apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navAudioExposureHeadphone": "Audio casque",
|
||
"timeInDaylight": {
|
||
"title": "Temps à la lumière du jour",
|
||
"description": "Minutes passées à la lumière du jour chaque jour.",
|
||
"chartTitle": "Lumière du jour par jour",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les totaux apparaissent ici dès qu’Apple Health synchronise une journée."
|
||
}
|
||
},
|
||
"navTimeInDaylight": "Lumière du jour",
|
||
"walkingSteadiness": {
|
||
"title": "Stabilité de la marche",
|
||
"description": "Votre stabilité de marche au fil du temps, en pourcentage.",
|
||
"chartTitle": "Stabilité de la marche",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navWalkingSteadiness": "Stabilité de marche",
|
||
"audioExposureEvent": {
|
||
"title": "Événements sonores forts",
|
||
"description": "Jours avec un événement d’exposition sonore forte.",
|
||
"chartTitle": "Événements sonores par jour",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les événements apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navAudioExposureEvent": "Événements sonores",
|
||
"respiratoryRate": {
|
||
"title": "Fréquence respiratoire",
|
||
"description": "Votre fréquence respiratoire au fil du temps, en respirations par minute.",
|
||
"chartTitle": "Fréquence respiratoire",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health synchronise la respiration du sommeil ou de l’entraînement."
|
||
}
|
||
},
|
||
"navRespiratoryRate": "Fréquence respiratoire",
|
||
"leanBodyMass": {
|
||
"title": "Masse maigre corporelle",
|
||
"description": "Votre masse maigre corporelle au fil du temps, en kilogrammes.",
|
||
"chartTitle": "Masse maigre corporelle",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’une balance à impédance se synchronise."
|
||
}
|
||
},
|
||
"navLeanBodyMass": "Masse maigre corporelle",
|
||
"walkingHeartRateAverage": {
|
||
"title": "Pouls en marchant",
|
||
"description": "Votre fréquence cardiaque moyenne en marchant, en bpm.",
|
||
"chartTitle": "Pouls moyen en marchant",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navWalkingHeartRateAverage": "Pouls en marchant",
|
||
"walkingAsymmetry": {
|
||
"title": "Asymétrie de la marche",
|
||
"description": "Votre asymétrie de marche au fil du temps, en pourcentage.",
|
||
"chartTitle": "Asymétrie de la marche",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navWalkingAsymmetry": "Asymétrie de marche",
|
||
"walkingDoubleSupport": {
|
||
"title": "Temps de double appui",
|
||
"description": "Le pourcentage de chaque foulée avec les deux pieds au sol.",
|
||
"chartTitle": "Temps de double appui",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navWalkingDoubleSupport": "Double appui",
|
||
"walkingStepLength": {
|
||
"title": "Longueur de pas",
|
||
"description": "Votre longueur de pas moyenne au fil du temps, en mètres.",
|
||
"chartTitle": "Longueur de pas",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navWalkingStepLength": "Longueur de pas",
|
||
"walkingSpeed": {
|
||
"title": "Vitesse de marche",
|
||
"description": "Votre vitesse de marche moyenne au fil du temps, en km/h.",
|
||
"chartTitle": "Vitesse de marche (km/h)",
|
||
"emptyState": {
|
||
"title": "Aucune donnée",
|
||
"description": "Les relevés apparaissent ici dès qu’Apple Health se synchronise."
|
||
}
|
||
},
|
||
"navWalkingSpeed": "Vitesse de marche"
|
||
},
|
||
"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",
|
||
"minLabel": "Min",
|
||
"maxLabel": "Max",
|
||
"unitSuffix": "({unit})",
|
||
"outOfBoundsHint": "Plage autorisée : {min}–{max} {unit}",
|
||
"overrideWarning": "Des valeurs en dehors des recommandations peuvent conduire à des objectifs malsains. Ne personnalise qu’après avis médical.",
|
||
"saveSuccess": "Objectifs mis à jour",
|
||
"saveError": "Impossible d’enregistrer les objectifs",
|
||
"resetSuccess": "Valeur par défaut restaurée",
|
||
"sourceOverride": "Valeur personnelle",
|
||
"metricWeight": "Poids",
|
||
"metricBpSys": "Tension artérielle (systolique)",
|
||
"metricBpDia": "Tension artérielle (diastolique)",
|
||
"metricPulse": "Pouls au repos",
|
||
"metricBodyFat": "Masse grasse",
|
||
"metricSleep": "Durée du sommeil",
|
||
"metricSteps": "Pas/jour",
|
||
"metricGlucoseFasting": "Glycémie — à jeun",
|
||
"metricGlucosePostprandial": "Glycémie — postprandiale",
|
||
"metricGlucoseRandom": "Glycémie — indifférente",
|
||
"metricGlucoseBedtime": "Glycémie — avant le coucher",
|
||
"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."
|
||
},
|
||
"onboarding": {
|
||
"errorGeneric": "Une erreur est survenue à la fin de la configuration. Réessaie.",
|
||
"tour": {
|
||
"stepOf": "Étape {current} sur {total}",
|
||
"next": "Suivant",
|
||
"back": "Précédent",
|
||
"skip": "Passer la visite",
|
||
"done": "Compris",
|
||
"restart": "Relancer la visite",
|
||
"restartHint": "Affiche à nouveau la visite du tableau de bord à la prochaine ouverture.",
|
||
"restartConfirmation": "La visite redémarrera lors de ta prochaine visite du tableau de bord.",
|
||
"steps": {
|
||
"tileStrip": {
|
||
"title": "Tes valeurs du jour",
|
||
"body": "La barre de tuiles affiche la dernière valeur et la tendance 7 jours de chaque métrique — poids, tension, pouls, humeur. Masque ce qui ne te sert pas dans Paramètres → Tableau de bord."
|
||
},
|
||
"quickAdd": {
|
||
"title": "Saisi en deux tapotements",
|
||
"body": "Via le bouton Ajouter, tu saisis des mesures ou des humeurs sans quitter le tableau de bord. Le formulaire mémorise le dernier contexte et les étiquettes."
|
||
},
|
||
"insights": {
|
||
"title": "Insights automatiques",
|
||
"body": "Insights transforme tes valeurs en un résumé santé clair, avec un classement de la tension, du poids et de l’humeur. Clé personnelle ou par défaut — c’est toi qui choisis."
|
||
},
|
||
"integrations": {
|
||
"title": "Connecter des appareils",
|
||
"body": "Dans les paramètres, tu connectes Withings (synchronisation automatique du poids, de la tension et du pouls), moodLog ou ton fournisseur d’analyse. Tout reste optionnel et chiffré."
|
||
},
|
||
"achievements": {
|
||
"title": "Collecter séries et badges",
|
||
"body": "La page Succès suit les séries de saisie quotidienne, les paliers de tension et les badges de constance. Un petit coup de pouce pour rester régulier."
|
||
}
|
||
}
|
||
},
|
||
"shell": {
|
||
"back": "Retour",
|
||
"skip": "Ignorer",
|
||
"next": "Continuer",
|
||
"step1of4": "Étape 1 sur 4",
|
||
"step2of4": "Étape 2 sur 4",
|
||
"step3of4": "Étape 3 sur 4",
|
||
"step4of4": "Étape 4 sur 4"
|
||
},
|
||
"goals": {
|
||
"title": "Que souhaitez-vous suivre ?",
|
||
"body": "Sélectionnez les domaines qui comptent pour vous. Le tableau de bord et les rappels s'y adapteront.",
|
||
"helpHint": "Un à trois axes prioritaires fonctionnent généralement le mieux, mais vous pourrez en ajouter plus tard.",
|
||
"options": {
|
||
"weightManagement": "Gestion du poids",
|
||
"bpTracking": "Tension artérielle",
|
||
"glucoseTracking": "Glycémie",
|
||
"sleepImprovement": "Mieux dormir",
|
||
"medicationCompliance": "Médicaments",
|
||
"generalWellness": "Bien-être général"
|
||
}
|
||
},
|
||
"source": {
|
||
"title": "Connecter une source",
|
||
"body": "Importez les mesures automatiquement ou conservez la saisie manuelle, c'est vous qui décidez.",
|
||
"recommended": "Recommandé",
|
||
"manual": {
|
||
"title": "Saisie manuelle",
|
||
"body": "Enregistrez vos mesures vous-même, quand cela vous convient. Fonctionne sur tout appareil, aucun compte tiers requis."
|
||
},
|
||
"withings": {
|
||
"title": "Withings",
|
||
"body": "Balances, tensiomètres et trackers Withings se synchronisent automatiquement.",
|
||
"cta": "Connecter Withings"
|
||
},
|
||
"appleHealth": {
|
||
"title": "Apple Health",
|
||
"body": "Les données de l'iPhone et de l'Apple Watch arrivent via l'application iOS HealthLog.",
|
||
"badge": "Avec la v1.5 (iOS)",
|
||
"disabledHint": "Disponible dès la sortie de l'application iOS."
|
||
}
|
||
},
|
||
"baseline": {
|
||
"title": "Quelques informations",
|
||
"body": "Quatre champs facultatifs affinent vos seuils cibles, l'IMC et les rappels. Tout reste modifiable plus tard dans les paramètres.",
|
||
"displayNameLabel": "Nom d'affichage",
|
||
"displayNamePlaceholder": "Comment HealthLog doit-il vous appeler ?",
|
||
"displayNameHint": "Apparaît dans le message d'accueil du tableau de bord et dans les rapports.",
|
||
"heightLabel": "Taille (cm)",
|
||
"genderLabel": "Genre",
|
||
"genderNone": "Préfère ne pas le préciser",
|
||
"genderMale": "Homme",
|
||
"genderFemale": "Femme",
|
||
"dateOfBirthLabel": "Date de naissance",
|
||
"dateOfBirthHint": "Utilisée uniquement pour les analyses qui tiennent compte de l'âge.",
|
||
"saveCta": "Enregistrer et continuer"
|
||
},
|
||
"done": {
|
||
"title": "Tout est prêt",
|
||
"body": "Bienvenue à bord. Votre tableau de bord vous attend.",
|
||
"returnCta": "Ouvrir le tableau de bord"
|
||
},
|
||
"welcomeBack": {
|
||
"title": "Bon retour",
|
||
"body": "Vous avez déjà terminé la configuration. Pour modifier un élément, ouvrez les paramètres — tout reste éditable.",
|
||
"cta": "Ouvrir le tableau de bord"
|
||
},
|
||
"welcome": {
|
||
"title": "Bienvenue dans HealthLog",
|
||
"carouselLabel": "Carrousel de bienvenue",
|
||
"slideOf": "Diapositive {current} sur {total}",
|
||
"prevSlide": "Diapositive précédente",
|
||
"nextSlide": "Diapositive suivante",
|
||
"gotoSlide": "Aller à la diapositive {index}",
|
||
"cta": "Commencer",
|
||
"slide1": {
|
||
"title": "Notez chaque signal",
|
||
"body": "Poids, tension, glycémie, sommeil, humeur — un seul journal qui vous appartient."
|
||
},
|
||
"slide2": {
|
||
"title": "Connectez vos sources",
|
||
"body": "Synchronisez avec Apple Health et Withings, ou ajoutez vos mesures à la main. Vos données restent sur votre serveur."
|
||
},
|
||
"slide3": {
|
||
"title": "Repérez les tendances",
|
||
"body": "Résumés quotidiens, graphiques de tendances et un coach qui met en avant ce qui a changé — le tout sur votre appareil."
|
||
}
|
||
}
|
||
},
|
||
"gettingStarted": {
|
||
"title": "Premiers pas",
|
||
"subtitle": "Petites victoires pour tirer le meilleur de HealthLog.",
|
||
"progress": "{done} sur {total} faits",
|
||
"dismissAll": "Masquer la liste",
|
||
"dismissTooltip": "Masquer ce point",
|
||
"items": {
|
||
"profileTitle": "Configurer le profil",
|
||
"profileDescription": "Taille, date de naissance et sexe débloquent des objectifs personnalisés.",
|
||
"profileCta": "Ouvrir le profil",
|
||
"measurementTitle": "Saisir la première mesure",
|
||
"measurementDescription": "Une mesure suffit à activer la tuile — la tendance se dessine à partir de la 5ᵉ mesure.",
|
||
"measurementCta": "Ajouter une mesure",
|
||
"medicationTitle": "Ajouter un médicament",
|
||
"medicationDescription": "Suis l’observance et reçois des rappels au moment où tu en as besoin.",
|
||
"medicationCta": "Ajouter un médicament",
|
||
"withingsTitle": "Connecter Withings (optionnel)",
|
||
"withingsDescription": "Synchronise automatiquement poids, tension et pouls depuis tes appareils Withings.",
|
||
"withingsCta": "Connecter",
|
||
"notificationsTitle": "Configurer les notifications",
|
||
"notificationsDescription": "Choisis comment HealthLog te prévient — Telegram, ntfy ou Web Push.",
|
||
"notificationsCta": "Ouvrir les notifications"
|
||
}
|
||
},
|
||
"trendHints": {
|
||
"title": "Première tendance après 5 mesures",
|
||
"remainingOne": "Encore 1 mesure avant la tendance.",
|
||
"remainingMany": "Encore {count} mesures avant la tendance."
|
||
},
|
||
"settings": {
|
||
"researchMode": {
|
||
"sectionTitle": "Mode Recherche",
|
||
"subtitle": "Affichage optionnel d'une courbe de niveau estimé de médicament GLP-1, dérivée de la pharmacocinétique de population publiée par l'EMA. Lecture seule — jamais une mesure ni un conseil médical.",
|
||
"toggleLabel": "Afficher la courbe estimée du niveau de médicament",
|
||
"disabledStatus": "Désactivé. La courbe est masquée.",
|
||
"enabledStaleStatus": "Le disclaimer a été mis à jour. Reconfirmez ci-dessous pour réafficher la courbe.",
|
||
"acknowledgedOn": "Confirmé le {date}.",
|
||
"rePromptTitle": "Disclaimer mis à jour",
|
||
"rePromptBody": "Le disclaimer du mode Recherche a été mis à jour depuis votre dernière confirmation. Relisez-le et reconfirmez pour garder la courbe visible.",
|
||
"rePromptCta": "Reconfirmer le disclaimer",
|
||
"disableError": "Impossible de désactiver le mode Recherche. Veuillez réessayer."
|
||
},
|
||
"shell": {
|
||
"sectionsNav": "Settings sections"
|
||
},
|
||
"sections": {
|
||
"account": {
|
||
"title": "Compte",
|
||
"description": "Profile, password, passkeys, and your onboarding tour."
|
||
},
|
||
"integrations": {
|
||
"title": "Intégrations",
|
||
"description": "Withings, moodLog, and other connected services."
|
||
},
|
||
"notifications": {
|
||
"title": "Canaux de notification",
|
||
"description": "Live overview of every configured channel."
|
||
},
|
||
"dashboard": {
|
||
"title": "Tableau de bord",
|
||
"description": "Tile layout and order."
|
||
},
|
||
"thresholds": {
|
||
"title": "Objectifs et sources",
|
||
"description": "Par métrique : votre propre plage cible et quelle source prévaut quand plusieurs enregistrent la même valeur le même jour."
|
||
},
|
||
"sources": {
|
||
"title": "Sources",
|
||
"description": "Pick which ingest source wins when more than one records the same metric for the same day.",
|
||
"redirectNotice": "Les sources font désormais partie de « Objectifs et sources ».",
|
||
"cardTitle": "Source priority by metric",
|
||
"help": "When more than one source delivers the same value on the same day (e.g. Withings and Apple Health both report 1,200 steps), the top source counts as the canonical reading. Other sources stay stored for the audit trail.",
|
||
"resetDefaults": "Reset to defaults",
|
||
"moveUp": "Move up",
|
||
"moveDown": "Move down",
|
||
"saveSuccess": "Source priority saved.",
|
||
"saveError": "Saving the source priority failed.",
|
||
"resetSuccess": "Source priority reset to defaults.",
|
||
"perMetricToggle": "Per-metric overrides ({count})",
|
||
"perMetricHelp": "Metrics you have customised away from the default ladder. Use this list to roll any single metric back to its constant default without touching the rest.",
|
||
"perMetricEmpty": "No per-metric overrides set — every metric uses the global ladder above.",
|
||
"resetMetric": "Réinitialiser",
|
||
"deviceTypeToggle": "Device-type priority ({count})",
|
||
"deviceTypeHelp": "Within a source, which device wins. When an Apple Watch and an iPhone both record steps, the higher-ranked device-type counts as the canonical reading.",
|
||
"deviceTypeDefault": "Default device-type ladder",
|
||
"resetDeviceTypes": "Reset device-types",
|
||
"metrics": {
|
||
"steps": "Pas",
|
||
"activeEnergy": "Active energy",
|
||
"walkingRunningDistance": "Walking + running distance",
|
||
"flightsClimbed": "Flights climbed",
|
||
"sleep": "Sommeil",
|
||
"weight": "Poids",
|
||
"bloodPressure": "Tension artérielle",
|
||
"pulse": "Pouls",
|
||
"bodyFat": "Masse grasse",
|
||
"bodyTemperature": "Body temperature",
|
||
"spo2": "Oxygen saturation",
|
||
"hrv": "Heart-rate variability",
|
||
"restingHeartRate": "Fréquence cardiaque au repos",
|
||
"vo2Max": "VO2 max"
|
||
},
|
||
"sourceLabels": {
|
||
"WITHINGS": "Withings",
|
||
"APPLE_HEALTH": "Apple Health",
|
||
"MANUAL": "Manual entry",
|
||
"IMPORT": "Importer"
|
||
},
|
||
"deviceLabels": {
|
||
"watch": "Watch",
|
||
"band": "Band",
|
||
"ring": "Ring",
|
||
"phone": "Phone",
|
||
"scale": "Scale",
|
||
"other": "Other",
|
||
"unknown": "Inconnu"
|
||
}
|
||
},
|
||
"ai": {
|
||
"title": "Insights",
|
||
"description": "Provider, model, key."
|
||
},
|
||
"api": {
|
||
"title": "API & Tokens",
|
||
"description": "Bearer tokens for your own scripts and apps — log measurements or medication intake from anywhere."
|
||
},
|
||
"advanced": {
|
||
"title": "Avancé",
|
||
"description": "Bouton opt-in du mode Recherche et zone dangereuse pour effacer irrévocablement toutes les données de santé."
|
||
},
|
||
"export": {
|
||
"title": "Exporter",
|
||
"description": "Download your health data as PDF, CSV, or a full JSON backup.",
|
||
"otherOptionsHeading": "Autres options d'export",
|
||
"hero": {
|
||
"eyebrow": "Rendez-vous médical",
|
||
"valueStatement": "Un rapport PDF imprimable pour votre rendez-vous médical — constantes, IMC, classification de tension, observance des traitements et (en option) historique de l'humeur, en quelques pages.",
|
||
"cta": "Configurer & générer le rapport",
|
||
"formatHint": "PDF · prêt à imprimer"
|
||
},
|
||
"actions": {
|
||
"download": "Download"
|
||
},
|
||
"filters": {
|
||
"since": "De",
|
||
"until": "Until"
|
||
},
|
||
"cards": {
|
||
"doctorReport": {
|
||
"title": "Doctor Report",
|
||
"description": "Printable PDF for the doctor's appointment — vitals, BMI, BP classification, medication compliance, mood."
|
||
},
|
||
"measurementsCsv": {
|
||
"title": "Measurements",
|
||
"description": "Weight, blood pressure, pulse, glucose, and every other measurement as comma-separated values."
|
||
},
|
||
"medicationsCsv": {
|
||
"title": "Médicaments",
|
||
"description": "Your medication list with dosage, schedules, and (optionally) the full intake history.",
|
||
"includeIntake": "Include intake history"
|
||
},
|
||
"moodCsv": {
|
||
"title": "Humeur",
|
||
"description": "Daily mood entries with score, tags, and timestamps."
|
||
},
|
||
"fullBackup": {
|
||
"title": "Full backup",
|
||
"description": "Single JSON file with everything — same shape as the weekly auto-backup. Useful for self-restore via admin upload."
|
||
}
|
||
}
|
||
},
|
||
"about": {
|
||
"title": "About",
|
||
"description": "Version, license, links."
|
||
}
|
||
},
|
||
"profile": "Profil",
|
||
"language": "Langue",
|
||
"languageDescription": "Choose the display language of the application.",
|
||
"username": "Nom d'utilisateur",
|
||
"height": "Height (cm)",
|
||
"dateOfBirth": "Date de naissance",
|
||
"dateOfBirthHint": "Used for automatic blood pressure target calculations.",
|
||
"gender": "Sexe",
|
||
"genderNone": "Not specified",
|
||
"genderMale": "Homme",
|
||
"genderFemale": "Femme",
|
||
"genderHint": "Used for gender-specific target values.",
|
||
"timezone": "Fuseau horaire",
|
||
"timezoneHint": "Used for chart axis labels, reminder times, export timestamps, and Coach context. Stored data is unchanged.",
|
||
"timezoneInvalid": "Not a valid IANA timezone.",
|
||
"profileSaved": "Profile saved",
|
||
"avatar": {
|
||
"title": "Photo de profil",
|
||
"description": "Téléverse une photo stockée sur ton propre serveur. Elle apparaît dans toute l'application à la place d'un service d'avatar externe.",
|
||
"upload": "Téléverser une photo",
|
||
"replace": "Remplacer la photo",
|
||
"remove": "Supprimer",
|
||
"hint": "JPEG, PNG ou WebP. Jusqu'à 2 Mo et 2048×2048 pixels.",
|
||
"uploaded": "Photo de profil mise à jour",
|
||
"removed": "Photo de profil supprimée",
|
||
"invalidType": "Type d'image non pris en charge. Utilise JPEG, PNG ou WebP.",
|
||
"tooLarge": "L'image dépasse la limite de 2 Mo.",
|
||
"error": "Impossible de mettre à jour la photo de profil. Réessaie."
|
||
},
|
||
"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",
|
||
"passwordMismatch": "New passwords do not match",
|
||
"passwordUpdated": "Password updated successfully",
|
||
"passkeys": "Passkeys",
|
||
"registeredPasskeys": "Registered Passkeys",
|
||
"passkeysDescription": "Passkeys allow secure login without a password.",
|
||
"passkeyName": "Nom",
|
||
"passkeyDevice": "Device",
|
||
"passkeyBackup": "Backup",
|
||
"passkeyCreated": "Created",
|
||
"passkeyActions": "Actions",
|
||
"noPasskeys": "No passkeys registered.",
|
||
"addPasskey": "Add passkey",
|
||
"passkeyAdded": "Passkey added successfully!",
|
||
"passkeyOptionsError": "Could not load passkey options",
|
||
"passkeyRegistrationFailed": "Passkey registration failed",
|
||
"passkeyRegistrationCancelled": "Passkey registration cancelled",
|
||
"passkeyNotSupported": "Your browser or device doesn't support passkeys yet. Try a different browser or device.",
|
||
"passkeyAlreadyRegistered": "This device is already registered as a passkey for your account.",
|
||
"passkeySecurityBlocked": "Your browser blocked the passkey request for security reasons. Make sure you're on a trusted HTTPS origin and try again.",
|
||
"passkeyTimeout": "The passkey prompt timed out. Please try again.",
|
||
"passkeyUnknownError": "Passkey registration failed: {message}",
|
||
"deletePasskey": "Delete passkey?",
|
||
"deletePasskeyDescription": "The passkey will be permanently deleted.",
|
||
"singleDevice": "Single device",
|
||
"multiDevice": "Multi-device",
|
||
"backedUp": "backed up",
|
||
"telegram": "Telegram Notifications",
|
||
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
|
||
"telegramSaved": "Telegram settings saved",
|
||
"botToken": "Bot Token",
|
||
"chatId": "Chat ID",
|
||
"enableNotifications": "Enable notifications",
|
||
"testMessage": "Test message",
|
||
"testSent": "Test message sent!",
|
||
"telegramStep1": "1. Create a bot via @BotFather in Telegram and copy the token.",
|
||
"telegramStep2": "2. Send /start to your bot to activate the chat.",
|
||
"telegramStep3": "3. Find your Chat ID via @userinfobot or the Bot API.",
|
||
"ntfy": "ntfy",
|
||
"ntfyDescription": "Notifications via ntfy (self-hosted or ntfy.sh).",
|
||
"ntfyEnable": "Enable ntfy",
|
||
"ntfyServer": "Server URL",
|
||
"ntfyTopic": "Topic",
|
||
"ntfyAuthToken": "Auth Token (optional)",
|
||
"ntfyAuthTokenHint": "Only needed for private topics with access control.",
|
||
"webPush": "Browser Push",
|
||
"webPushDescription": "Receive notifications directly in your browser, even when HealthLog is not open.",
|
||
"webPushNotSupported": "Your browser does not support push notifications.",
|
||
"webPushDenied": "Push notifications are blocked. Allow them in your browser settings.",
|
||
"webPushNotConfigured": "Web Push is not configured on the server.",
|
||
"webPushSubscribe": "Enable push",
|
||
"webPushUnsubscribe": "Disable push",
|
||
"webPushSubscribed": "Push notifications enabled!",
|
||
"webPushUnsubscribed": "Push notifications disabled.",
|
||
"webPushSubscribeFailed": "Activation failed",
|
||
"webPushActive": "Actif",
|
||
"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.",
|
||
"rawData": "Send raw data",
|
||
"rawDataOnDescription": "Aggregated metrics plus anonymized raw points from the last 30 days are sent. This includes per-metric measurements (for example weight, blood pressure, pulse) with time context so the provider can detect patterns, outliers, and correlations more reliably. Name, email, and direct account identifiers are not transmitted.",
|
||
"rawDataOffDescription": "Only summarized metrics are sent (for example averages, trends, minimum/maximum). No individual points and no exact time context. This is more privacy-preserving, but the provider can be less precise for short-term patterns and fluctuations.",
|
||
"rawDataWarning": "Raw mode enabled: the provider receives additional anonymized points from the last 30 days for higher analysis accuracy.",
|
||
"regenerateInsights": "Regenerate reports",
|
||
"regenerateSuccess": "Reports regenerated successfully",
|
||
"regenerateRateLimit": "Please wait — you've hit the hourly limit for analyses.",
|
||
"lastGeneratedAt": "Last generated",
|
||
"ai": {
|
||
"chatgptConnectedBadge": "ChatGPT connected",
|
||
"adminAiActiveBadge": "Admin provider active",
|
||
"connectionExpiredBadge": "Connection expired",
|
||
"connectedSince": "Connected since {when}.",
|
||
"deviceCodeHeading": "Finish connecting on chatgpt.com",
|
||
"deviceCodeStep1": "Open this link on any device:",
|
||
"deviceCodeStep2": "Enter this one-time code:",
|
||
"deviceCodeStep3": "Approve the connection — this page updates automatically.",
|
||
"deviceCodeCopy": "Copier",
|
||
"deviceCodeWaiting": "Waiting for approval…",
|
||
"deviceCodeCancel": "Annuler",
|
||
"oauthNotConfigured": "ChatGPT OAuth is not configured on this instance — use your own API key below instead.",
|
||
"modelLabel": "Model",
|
||
"modelOptionDefault": "— Default —",
|
||
"modelOptionCustom": "Custom…",
|
||
"customModelLabel": "Custom model name",
|
||
"anthropicKeyLabel": "Anthropic API key",
|
||
"baseUrlLabel": "Base URL",
|
||
"localKeyLabel": "API key (optional)",
|
||
"savedPreview": "(saved {preview})",
|
||
"savedShort": "(saved)",
|
||
"saveCta": "Enregistrer",
|
||
"saved": "Enregistré",
|
||
"saveFailed": "Save failed",
|
||
"errorGeneric": "Erreur",
|
||
"providerChain": {
|
||
"types": {
|
||
"codex": "ChatGPT (Codex)",
|
||
"openai": "OpenAI (your key)",
|
||
"anthropic": "Anthropic (Claude)",
|
||
"local": "Local model",
|
||
"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.",
|
||
"moveUp": "Move up",
|
||
"moveDown": "Move down",
|
||
"removeFromChain": "Remove from chain",
|
||
"addProvider": "Add provider",
|
||
"addNoneAvailable": "All providers already in chain",
|
||
"saveOrder": "Save chain order",
|
||
"saved": "Chain saved",
|
||
"saveFailed": "Saving the chain failed",
|
||
"resetDefaults": "Reset to defaults",
|
||
"resetConfirmTitle": "Reset chain to defaults?",
|
||
"resetConfirmBody": "The chain reverts to Codex → OpenAI → Anthropic → Local → Admin OpenAI. Your saved credentials are not touched."
|
||
},
|
||
"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)",
|
||
"anthropic": "Anthropic (Claude)",
|
||
"local": "Local model (OpenAI-compatible)",
|
||
"admin-openai": "Admin-provided OpenAI"
|
||
},
|
||
"openai": {
|
||
"modelSelect": "Model",
|
||
"modelOptionCustom": "Custom slug…",
|
||
"modelCustomLabel": "Custom model slug",
|
||
"modelCustomPlaceholder": "gpt-5",
|
||
"baseUrlLabel": "Base URL (advanced)",
|
||
"baseUrlPlaceholder": "https://api.openai.com/v1",
|
||
"baseUrlHelp": "Override only when using an OpenAI-compatible gateway. Leave blank for OpenAI itself.",
|
||
"showAdvanced": "Show advanced",
|
||
"hideAdvanced": "Hide advanced",
|
||
"apiKey": "API key",
|
||
"apiKeyPlaceholder": "sk-…"
|
||
},
|
||
"codex": {
|
||
"statusConnected": "Connected",
|
||
"statusDisconnected": "Not connected",
|
||
"statusExpired": "Connection expired",
|
||
"connectButton": "Connect with ChatGPT",
|
||
"disconnectButton": "Disconnect",
|
||
"modelSlugLabel": "Model slug",
|
||
"modelSlugBody": "Codex uses the model your ChatGPT subscription routes to. The CODEX_MODEL environment variable lets ops override this on the instance.",
|
||
"lastInsight": "Last insight: {when}"
|
||
},
|
||
"adminOpenai": {
|
||
"title": "Admin OpenAI",
|
||
"body": "Operator-provided OpenAI key. Used as a last-ditch fallback when no personal provider is configured. There is nothing to configure on this row — visibility means the operator has set it up.",
|
||
"notConfigured": "The operator has not configured a shared OpenAI key on this instance."
|
||
},
|
||
"testProvider": "Test active provider",
|
||
"testSuccess": "OK — {provider} ({model})",
|
||
"testFailedShort": "Test failed: {message}",
|
||
"disableCoach": {
|
||
"title": "Masquer le Coach",
|
||
"description": "Masque le bouton et le panneau du Coach sur toutes les pages.",
|
||
"toggleAria": "Masquer le bouton et le panneau du Coach",
|
||
"savedHidden": "Coach masqué.",
|
||
"savedShown": "Coach visible.",
|
||
"saveError": "Impossible d'enregistrer la modification. Veuillez réessayer."
|
||
}
|
||
},
|
||
"dashboard": {
|
||
"units": {
|
||
"title": "Unités",
|
||
"description": "Choisissez l'affichage des distances et des vitesses dans les graphiques et les tuiles.",
|
||
"metric": "Métrique",
|
||
"imperial": "Impérial",
|
||
"saved": "Préférence d'unités enregistrée.",
|
||
"saveError": "Impossible d'enregistrer votre préférence d'unités."
|
||
}
|
||
},
|
||
"withings": "Withings",
|
||
"withingsDescription": "Connect your Withings scale and blood pressure monitors.",
|
||
"withingsCredentials": "API Credentials",
|
||
"withingsClientId": "Client ID",
|
||
"withingsClientSecret": "Client Secret",
|
||
"withingsCredentialsSaved": "Credentials saved",
|
||
"withingsCredentialsSavedPlaceholder": "Saved — enter new to replace",
|
||
"withingsCredentialsSavedPlaceholderSecret": "Saved — enter new to replace",
|
||
"withingsSaveCredentials": "Save credentials",
|
||
"configured": "Configured",
|
||
"withingsSync": "Sync now",
|
||
"withingsFullSync": "Sync all data",
|
||
"withingsFullSyncTitle": "Full synchronization?",
|
||
"withingsFullSyncDescription": "All available Withings data will be fully synchronized. This may take some time depending on your history.",
|
||
"withingsSyncResult": "{count} measurements synchronized",
|
||
"withingsFullSyncResult": "{count} measurements fully synchronized",
|
||
"withingsSyncFailed": "Sync failed",
|
||
"withingsSynchronize": "Synchronize",
|
||
"withingsDisconnect": "Disconnect",
|
||
"withingsDisconnectTitle": "Disconnect Withings?",
|
||
"withingsDisconnectDescription": "The connection to Withings will be disconnected. Previously synced data will be preserved.",
|
||
"withingsConnect": "Connect with Withings",
|
||
"withingsNoCredentials": "Please enter your API credentials above to connect Withings.",
|
||
"integrations": {
|
||
"withings": {
|
||
"reconnect": {
|
||
"banner": {
|
||
"title": "Activity sync available",
|
||
"body": "Your Withings connection was authorised before activity sync was added. Reconnect once to enable steps, active energy, walking + running distance, and floors-climbed ingest from your Withings devices.",
|
||
"action": "Reconnect Withings"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"integrationPill": {
|
||
"connected": "Connecté",
|
||
"errorReconnect": "Erreur — reconnecter",
|
||
"warningServerError": "Connecté, erreur serveur",
|
||
"parkedReconnect": "En pause — reconnecter manuellement",
|
||
"notConnected": "Non connecté",
|
||
"justNow": "just now",
|
||
"minutesAgo": "{count} min ago",
|
||
"hoursAgo": "{count} h ago",
|
||
"daysAgo": "{count} d ago",
|
||
"ariaLabel": "Integration status",
|
||
"resumeCta": "Reconnecter",
|
||
"resumeSuccess": "Intégration reprise",
|
||
"resumeError": "Échec de la reconnexion"
|
||
},
|
||
"apiTokens": "API Tokens",
|
||
"apiTokensDescription": "Create API tokens for external medication intake (e.g., Shortcuts, automations).",
|
||
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
|
||
"tokenCreated": "Token created — copy it now! It won't be shown again.",
|
||
"tokenRevoke": "Revoke token?",
|
||
"tokenRevokeDescription": "The token will be permanently deactivated. Applications using it will lose access.",
|
||
"tokenRevoked": "Revoked",
|
||
"tokenExpired": "Expired",
|
||
"tokenActive": "Actif",
|
||
"activeTokensTitle": "Active tokens",
|
||
"revokedTokensTitle": "Revoked tokens ({count})",
|
||
"tokenTableName": "Nom",
|
||
"tokenTablePermissions": "Permissions",
|
||
"tokenTableStatus": "Statut",
|
||
"tokenTableCreated": "Created",
|
||
"tokenTableLastUsed": "Last used",
|
||
"tokenTableActions": "Actions",
|
||
"noActiveTokens": "No active tokens available.",
|
||
"tokenNeverUsed": "Never",
|
||
"apiEndpointsTitle": "API endpoints",
|
||
"apiEndpointsDescription": "Overview of currently available external endpoint(s) for token-based ingestion.",
|
||
"apiEndpointMethod": "Method",
|
||
"apiEndpointPath": "Path",
|
||
"apiEndpointAuth": "Authentication",
|
||
"apiEndpointExample": "Body example",
|
||
"collapse": "Collapse",
|
||
"expand": "Expand",
|
||
"dangerZone": "Delete All Data",
|
||
"dangerZoneTitle": "Danger zone",
|
||
"dangerZoneDescription": "Deletes all your health data and integrations. Your user account will be preserved.",
|
||
"dangerZoneConfirm": "Delete all data?",
|
||
"dangerZoneConfirmDescription": "This will permanently delete all your health data and integrations. Your user account will be preserved.",
|
||
"dangerZoneSuccess": "All personal data has been deleted",
|
||
"dangerZoneDeleteFailed": "Deletion failed",
|
||
"finalDelete": "Delete permanently",
|
||
"deleteAccountCardTitle": "Delete account entirely",
|
||
"deleteAccountCardDescription": "Deletes your account along with passkeys, audit log, and sessions. This cannot be undone.",
|
||
"deleteAccountCta": "Delete account",
|
||
"deleteAccountConfirmTitle": "Delete account permanently?",
|
||
"deleteAccountConfirmDescription": "Your account, all health data, passkeys, sessions, and audit entries will be permanently deleted. You will be signed out immediately after.",
|
||
"deleteAccountSuccess": "Account deleted — signing you out.",
|
||
"deleteAccountFailed": "Account could not be deleted",
|
||
"deleteAccountFinal": "Delete permanently",
|
||
"saved": "Enregistré",
|
||
"savingError": "Error saving",
|
||
"moodLogTitle": "moodLog",
|
||
"moodLogDescription": "Import mood data from moodLog",
|
||
"moodLogUrl": "moodLog URL",
|
||
"moodLogUrlPlaceholder": "https://mood.example.com",
|
||
"moodLogApiKey": "API Key",
|
||
"moodLogApiKeyPlaceholder": "ml_...",
|
||
"moodLogWebhookSecret": "Webhook Secret",
|
||
"moodLogWebhookSecretHelp": "Enter this secret in moodLog as webhook secret",
|
||
"moodLogSync": "Start sync",
|
||
"moodLogFullSync": "Full sync",
|
||
"moodLogFullSyncConfirm": "Synchronize fully",
|
||
"moodLogFullSyncTitle": "Full sync?",
|
||
"moodLogFullSyncDescription": "All available mood data will be fully synchronized.",
|
||
"moodLogDisconnect": "Disconnect",
|
||
"moodLogDisconnectTitle": "Disconnect moodLog?",
|
||
"moodLogDisconnectDescription": "The connection will be removed and all imported mood data will be deleted.",
|
||
"moodLogEntries": "Entries",
|
||
"moodLogSyncResult": "{count} entries synchronized",
|
||
"moodLogSyncFailed": "Sync failed",
|
||
"moodLogSaved": "moodLog connection saved",
|
||
"moodLogDisconnected": "moodLog disconnected",
|
||
"about": {
|
||
"version": "App version",
|
||
"gitSha": "Build",
|
||
"builtAt": "Built {time}",
|
||
"builtAtLabel": "Built",
|
||
"license": "License",
|
||
"repository": "Source code",
|
||
"changelog": "Changelog",
|
||
"docs": "Documentation",
|
||
"linksHeading": "Sources et documentation",
|
||
"newerAvailable": "Nouvelle version : {tag}",
|
||
"tourReplay": "Revoir la visite",
|
||
"tourReplayHint": "Voir la visite guidée du tableau de bord — pratique si tu l'as sautée à la première visite."
|
||
},
|
||
"testConnection": {
|
||
"test": "Test connection",
|
||
"testing": "Testing…",
|
||
"ok": "Connected (latency {latency} ms)",
|
||
"errors": {
|
||
"credentials_rejected": "Credentials rejected — check your token",
|
||
"rate_limited": "Rate-limited by the upstream",
|
||
"timeout": "Request timed out",
|
||
"upstream_error": "Upstream returned an error",
|
||
"connection_failed": "Connection failed",
|
||
"not_configured": "Not configured",
|
||
"url_not_public": "URL is not a public endpoint",
|
||
"url_invalid": "URL is invalid",
|
||
"redirected": "Endpoint redirects — check the URL",
|
||
"endpoint_not_found": "Endpoint not found at the URL",
|
||
"credentials_unreadable": "Credentials cannot be decrypted",
|
||
"upstream_invalid_json": "Upstream sent invalid JSON",
|
||
"vapid_not_configured": "Web Push not configured (VAPID keys missing)",
|
||
"rate_limited_self": "Too many test requests",
|
||
"generic": "Test failed"
|
||
}
|
||
},
|
||
"notificationStatus": {
|
||
"title": "Channel reliability",
|
||
"description": "Live status of every notification channel — Auto-disabled means HealthLog stopped retrying after a permanent error.",
|
||
"emptyDescription": "No channels configured yet. Add a channel below to start tracking its delivery health.",
|
||
"stateActive": "Actif",
|
||
"stateAutoDisabled": "Auto-disabled",
|
||
"stateSendingPaused": "Sending paused",
|
||
"stateManuallyDisabled": "Désactivé",
|
||
"lastSuccess": "Last successful send",
|
||
"lastFailure": "Last failure",
|
||
"consecutiveFailures": "Consecutive failures",
|
||
"disabledReason": "Reason",
|
||
"nextRetry": "Next retry",
|
||
"reEnable": "Re-enable",
|
||
"sendTest": "Send test"
|
||
},
|
||
"identity": {
|
||
"description": "Informations facultatives pour l’export du dossier de santé (couverture PDF + export FHIR). Tous les champs sont facultatifs.",
|
||
"fullName": "Nom complet",
|
||
"fullNamePlaceholder": "p. ex. Jeanne Dupont",
|
||
"insurer": "Assurance maladie",
|
||
"insurerPlaceholder": "p. ex. AOK Bayern",
|
||
"insuranceNumber": "Numéro d’assuré (KVNR)",
|
||
"insuranceNumberHint": "10 caractères : une lettre + neuf chiffres (p. ex. A123456780)."
|
||
},
|
||
"healthRecord": {
|
||
"title": "Exporter le dossier de santé",
|
||
"description": "Générez un dossier de santé complet pour votre médecin — en PDF, structuré (FHIR) ou en paquet combiné.",
|
||
"format": "Format",
|
||
"format_pdf": "PDF",
|
||
"format_fhir": "Structuré (FHIR)",
|
||
"format_package": "Paquet : PDF + FHIR",
|
||
"range": "Période",
|
||
"range90": "90 derniers jours",
|
||
"range180": "6 derniers mois",
|
||
"range365": "12 derniers mois",
|
||
"practiceName": "Cabinet (facultatif)",
|
||
"practiceNamePlaceholder": "p. ex. Dr Dupont",
|
||
"includedData": "Données incluses",
|
||
"groupVitals": "Signes vitaux",
|
||
"groupCardio": "Cœur & forme",
|
||
"groupActivity": "Activité & sommeil",
|
||
"weight": "Poids",
|
||
"bp": "Tension artérielle",
|
||
"pulse": "Pouls",
|
||
"oxygenSaturation": "Saturation en oxygène",
|
||
"bodyFat": "Masse grasse",
|
||
"bodyComposition": "Composition corporelle",
|
||
"restingHeartRate": "Pouls au repos",
|
||
"hrv": "Variabilité de la fréquence cardiaque",
|
||
"vo2max": "VO₂max",
|
||
"steps": "Pas",
|
||
"distance": "Distance",
|
||
"sleep": "Sommeil",
|
||
"glucose": "Glycémie",
|
||
"medications": "Médicaments & observance",
|
||
"mood": "Humeur (désactivé par défaut — données sensibles)",
|
||
"bmi": "IMC",
|
||
"includeCharts": "Intégrer les graphiques de tendance (PDF uniquement)",
|
||
"includeAiSummary": "Ajouter le résumé IA (non validé cliniquement)",
|
||
"fhirNote": "La sortie structurée suit la norme FHIR R4 (compatible ePA).",
|
||
"generate": "Générer",
|
||
"error": "Échec de l’export ({code})."
|
||
}
|
||
},
|
||
"admin": {
|
||
"title": "Administration",
|
||
"subtitle": "System status, users, and settings",
|
||
"settingsSaveError": "Failed to save settings",
|
||
"systemStatus": "System Status",
|
||
"database": "Database",
|
||
"databaseConnected": "Connected",
|
||
"databaseError": "Erreur",
|
||
"startedAt": "Started",
|
||
"users": "Users",
|
||
"measurementsCount": "Measurements",
|
||
"activeTokens": "Active API Tokens",
|
||
"activeSessions": "Active Sessions",
|
||
"loadingStatus": "Loading status...",
|
||
"systemStatusLoadError": "Failed to load system status.",
|
||
"systemStatusRetry": "Réessayer",
|
||
"adminSettingsLoadError": "Failed to load admin settings. Toggles below may not reflect the live state — refresh the page.",
|
||
"hostMetrics": {
|
||
"title": "Host load",
|
||
"load1": "Load (1m)",
|
||
"memUsedPercent": "Memory",
|
||
"diskBusyPercent": "Disk I/O",
|
||
"last2hours": "Last 2 hours",
|
||
"empty": "Sampling started — data appears in 1–2 minutes.",
|
||
"loadError": "Failed to load host metrics. Try refreshing the page."
|
||
},
|
||
"aiQuality": {
|
||
"title": "Insights Quality",
|
||
"loading": "Loading feedback summary...",
|
||
"loadError": "Failed to load Insights quality summary. Try refreshing the page.",
|
||
"empty": "No feedback yet. The aggregator runs daily at 04:00 — once users start rating recommendations, helpful-rate bands appear here.",
|
||
"windowLabel": "Last {days} days",
|
||
"generatedAtLabel": "Generated",
|
||
"colSeverity": "Severity",
|
||
"colMetric": "Metric",
|
||
"colProvider": "Provider",
|
||
"colPromptVersion": "Prompt",
|
||
"colHelpful": "Helpful",
|
||
"colNotHelpful": "Not helpful",
|
||
"colHelpfulRate": "Helpful rate"
|
||
},
|
||
"coachFeedback": {
|
||
"title": "Coach Feedback",
|
||
"loading": "Loading Coach feedback summary...",
|
||
"loadError": "Failed to load Coach feedback summary. Try refreshing the page.",
|
||
"empty": "No Coach feedback yet. The aggregator runs daily at 04:00 — once users rate Coach replies, helpful-rate bands appear here.",
|
||
"windowLabel": "Last {days} days",
|
||
"generatedAtLabel": "Generated",
|
||
"colPromptVersion": "Prompt version",
|
||
"colTone": "Tone",
|
||
"colVerbosity": "Verbosity",
|
||
"colHelpful": "Helpful",
|
||
"colNotHelpful": "Not helpful",
|
||
"colN": "n",
|
||
"colHelpfulRate": "Helpful rate"
|
||
},
|
||
"workerStatus": "Job Worker",
|
||
"workerRunning": "Running",
|
||
"workerStopped": "Stopped",
|
||
"lastReminderCheck": "Last Reminder Check",
|
||
"appSettings": "Application Settings",
|
||
"registrationEnabled": "Allow registration",
|
||
"registrationEnabledDescription": "When disabled, new users cannot register.",
|
||
"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.",
|
||
"defaultUserTimezoneFallback": "Europe/Berlin (default)",
|
||
"servicesGlobal": "Services (global)",
|
||
"servicesGlobalDescription": "Disabled services are not available to any user.",
|
||
"telegramGlobal": "Allow Telegram notifications.",
|
||
"ntfyGlobal": "Allow ntfy notifications.",
|
||
"webPushGlobal": "Allow browser push notifications.",
|
||
"moodLogGlobal": "Allow mood-log reminders.",
|
||
"integrationWebPush": "Web Push",
|
||
"integrationBugReport": "Bug Report",
|
||
"offlineGeoLabel": "Données géographiques",
|
||
"offlineGeoEnabled": "Hors ligne (GeoLite2)",
|
||
"offlineGeoFallback": "Fallback (ipwho.is) — définissez MAXMIND_LICENSE_KEY dans la CI",
|
||
"apiGlobal": "Allow API endpoints and API tokens.",
|
||
"umamiTitle": "Umami",
|
||
"umamiDescription": "Web analytics with Umami",
|
||
"glitchtipTitle": "GlitchTip",
|
||
"glitchtipDescription": "Error tracking with GlitchTip",
|
||
"webPushVapidTitle": "Web Push VAPID",
|
||
"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.",
|
||
"glitchtipDsn": "GlitchTip DSN",
|
||
"glitchtipDsnPlaceholder": "https://<public-key>@glitchtip.example.com/<project-id>",
|
||
"glitchtipEnvironment": "GlitchTip environment",
|
||
"glitchtipEnvironmentPlaceholder": "production",
|
||
"webPushVapidDescription": "Configure VAPID keys and subject here so browser push works without environment variables.",
|
||
"webPushVapidPublicKey": "VAPID public key",
|
||
"webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)",
|
||
"webPushVapidPrivateKey": "VAPID private key",
|
||
"webPushVapidPrivateKeyPlaceholder": "Optional: enter a new private key",
|
||
"webPushVapidSubject": "VAPID subject",
|
||
"webPushVapidSubjectPlaceholder": "mailto:you@example.com",
|
||
"configured": "Configured",
|
||
"monitoringTestSuccess": "Test event sent",
|
||
"monitoringTestFailed": "Monitoring test failed",
|
||
"bugReportGithub": "Bug report (GitHub Issues)",
|
||
"bugReportGithubDescription": "Configure GitHub issue token and repository for incoming bug reports.",
|
||
"bugReportEnabledLabel": "Bug reports enabled",
|
||
"bugReportEnabledDescription": "When off, the in-app report button hides — token and repository stay configured.",
|
||
"assistant": {
|
||
"title": "Surfaces d'assistance",
|
||
"description": "Chaque bascule masque une surface pilotée par le modèle dans toute l'application sans retirer la configuration du fournisseur. Le commutateur principal force chaque option secondaire à off.",
|
||
"master": {
|
||
"title": "Assistant activé",
|
||
"description": "Commutateur principal pour chaque surface pilotée par le modèle. Lorsqu'il est désactivé, toutes les options secondaires ci-dessous sont forcées à off."
|
||
},
|
||
"coach": {
|
||
"title": "Coach",
|
||
"description": "Drawer de chat, bouton de lancement, et la FAB mobile sur chaque page Insights."
|
||
},
|
||
"briefing": {
|
||
"title": "Briefing quotidien",
|
||
"description": "Carte de briefing, narration du hero strip, grille de recommandations, et l'action Régénérer."
|
||
},
|
||
"insightStatus": {
|
||
"title": "Cartes de statut",
|
||
"description": "Cartes de statut par métrique sur chaque sous-page /insights."
|
||
},
|
||
"correlations": {
|
||
"title": "Corrélations",
|
||
"description": "Narration de la tuile de corrélation sur la vue d'ensemble Insights."
|
||
},
|
||
"healthScoreExplainer": {
|
||
"title": "Explicateur de Health-Score",
|
||
"description": "L'icône ? près de la ligne de delta du Health-Score. Le chiffre du delta reste visible quoi qu'il arrive."
|
||
}
|
||
},
|
||
"bugReportRepo": "Repository",
|
||
"bugReportRepoPlaceholder": "owner/repo",
|
||
"bugReportToken": "Issue token",
|
||
"bugReportTokenPlaceholder": "ghp_...",
|
||
"userManagement": "User Management",
|
||
"userName": "Nom",
|
||
"userEmail": "E-mail",
|
||
"userRole": "Role",
|
||
"userPasskeys": "Passkeys",
|
||
"userCreated": "Created",
|
||
"userActions": "Actions",
|
||
"editUser": "Edit user",
|
||
"editUserTitle": "Edit user: {name}",
|
||
"demoteToUser": "Demote to user",
|
||
"promoteToAdmin": "Promote to admin",
|
||
"toUser": "Make user",
|
||
"toAdmin": "Make admin",
|
||
"ownRoleUnchangeable": "Cannot change own role",
|
||
"resetPassword": "Reset password",
|
||
"resetPasswordTitle": "Reset password: {name}",
|
||
"newPassword": "New password",
|
||
"newPasswordPlaceholder": "At least 12 characters",
|
||
"passwordReset": "Password has been reset",
|
||
"reset": "Réinitialiser",
|
||
"loadingUsers": "Loading users...",
|
||
"apiTokens": "API Tokens",
|
||
"tokenUser": "User",
|
||
"tokenName": "Nom",
|
||
"tokenPermissions": "Permissions",
|
||
"tokenPermissionAll": "Tout",
|
||
"tokenPermissionAllTooltip": "Wildcard permission — this token can call every API route.",
|
||
"tokenStatus": "Statut",
|
||
"tokenLastUsed": "Last used",
|
||
"tokenCreated": "Created",
|
||
"tokenNeverUsed": "Never",
|
||
"tokensEmptyTitle": "No API tokens yet",
|
||
"tokensEmptyDescription": "Tokens are issued when a native client signs in or via Settings → Account.",
|
||
"loginOverview": "Login Overview",
|
||
"allAuthEvents": "All auth events",
|
||
"failedOnly": "Failed only",
|
||
"loginEmptyDescription": "Sign-ins, sign-outs, and passkey changes will show up here.",
|
||
"loginEmptyFailedTitle": "No failed sign-in attempts",
|
||
"loginEmptyFailedDescription": "That's the safe state. Switch to all events to see successful sign-ins.",
|
||
"loginEmptyResetFilter": "Show all events",
|
||
"showingEntries": "Affichage de {count} sur {total} entrées d'authentification",
|
||
"status": "Statut",
|
||
"action": "Action",
|
||
"ip": "IP",
|
||
"location": "Location",
|
||
"timestamp": "Heure",
|
||
"provider": "Provider",
|
||
"providerPassword": "Mot de passe",
|
||
"providerPasskey": "Passkey",
|
||
"providerApiToken": "API token",
|
||
"providerWithings": "Withings",
|
||
"providerUnknown": "Inconnu",
|
||
"outcome": "Outcome",
|
||
"outcomeSuccess": "Succès",
|
||
"outcomeFailed": "Failed",
|
||
"auditDetails": "Details",
|
||
"deleteAllData": "Delete all data globally",
|
||
"deleteAllDescription": "Deletes all measurement, medication, integration, and log data for all users. User accounts will be preserved.",
|
||
"deleteAllConfirm": "Really delete all data?",
|
||
"deleteAllConfirmDescription": "This will permanently delete all measurements, medications, intake events, API tokens, Withings connections, open authentication challenges, notification channels (Telegram, ntfy, Web Push), push subscriptions, and queued Telegram message deletions for all users. User accounts, the audit log, and submitted feedback are preserved so the wipe itself remains traceable and bug reports stay triageable.",
|
||
"deleteButton": "Delete all data",
|
||
"finalDelete": "Delete permanently",
|
||
"deletedResult": "Deleted: {measurements} measurements, {medications} Médicaments,{intakeEvents} intakes, {apiTokens} API tokens, {withingsConnections} Withings connections, {authChallenges} auth challenges, {notificationChannels} notification channels, {pushSubscriptions} push subscriptions, {telegramScheduledDeletions} queued Telegram deletions. Feedback rows preserved.",
|
||
"authRegister": "Registration",
|
||
"authLogin": "Connexion",
|
||
"authLoginPasskey": "Passkey login",
|
||
"authLoginPassword": "Password login",
|
||
"authLoginFailed": "Failed",
|
||
"authLogout": "Déconnexion",
|
||
"authPasskeyRegister": "Passkey added",
|
||
"authPasskeyDelete": "Passkey deleted",
|
||
"authTokenAutoissueNative": "Native client token issued",
|
||
"authTokenRefresh": "Token refreshed",
|
||
"authTokenRevoke": "Token revoked",
|
||
"medicationReminders": "Medication Reminders",
|
||
"medicationRemindersDescription": "Thresholds for reminder badge color transitions on medication cards.",
|
||
"reminderLateMinutes": "Late threshold (minutes)",
|
||
"reminderLateMinutesDescription": "Minutes after window end until the badge changes from yellow to orange.",
|
||
"reminderMissedMinutes": "Missed threshold (minutes)",
|
||
"reminderMissedMinutesDescription": "Minutes after window end until the intake is considered missed.",
|
||
"notificationTestSend": "Send test",
|
||
"notificationTestSuccess": "Test notification sent",
|
||
"notificationTestFailed": "Failed to send test notification",
|
||
"reminderCheckRun": "Run reminder check",
|
||
"reminderCheckSuccess": "Reminder check completed",
|
||
"reminderCheckFailed": "Failed to run reminder check",
|
||
"reminderCheckResults": "Results",
|
||
"reminderCheckNotifOn": "Notifications on",
|
||
"reminderCheckNotifOff": "Notifications off",
|
||
"reminderCheckEventsToday": "Events today",
|
||
"reminderCheckNotifSent": "Sent",
|
||
"feedback": {
|
||
"tabOpen": "Open",
|
||
"tabAcknowledged": "Acknowledged",
|
||
"tabResolved": "Resolved",
|
||
"tabArchived": "Archived",
|
||
"subject": "Subject",
|
||
"category": "Category",
|
||
"user": "User",
|
||
"createdAt": "Submitted",
|
||
"actions": "Actions",
|
||
"details": "Details",
|
||
"emptyTitle": "All caught up",
|
||
"emptyDescription": "No user feedback in this status. Submitted bugs, questions, and feature requests will appear here.",
|
||
"loading": "Loading feedback...",
|
||
"anonymous": "anonymous",
|
||
"categoryBug": "Bug",
|
||
"categoryFeature": "Feature",
|
||
"categoryQuestion": "Question",
|
||
"categoryOther": "Other",
|
||
"metadataHeading": "Metadata",
|
||
"metaUrl": "URL",
|
||
"metaLocale": "Locale",
|
||
"metaUserAgent": "User agent",
|
||
"metaAppVersion": "App version",
|
||
"screenshotHeading": "Screenshot",
|
||
"adminNote": "Admin note",
|
||
"adminNotePlaceholder": "Internal note (not visible to user)",
|
||
"saveNote": "Save note",
|
||
"noteSaved": "Note saved",
|
||
"actionAcknowledge": "Acknowledge",
|
||
"actionResolve": "Resolve",
|
||
"actionArchive": "Archive",
|
||
"actionPublishGithub": "Publish to GitHub",
|
||
"publishedToGithub": "Published to GitHub",
|
||
"viewIssue": "View issue",
|
||
"publishSuccess": "Issue created",
|
||
"publishFailed": "GitHub publish failed",
|
||
"updateFailed": "Update failed",
|
||
"archiveConfirm": "Archive this feedback entry?",
|
||
"submittedBy": "Submitted by"
|
||
},
|
||
"shell": {
|
||
"overview": "Vue d'ensemble",
|
||
"sectionsNav": "Admin sections"
|
||
},
|
||
"overview": {
|
||
"welcomeTitle": "Bienvenue,{name}",
|
||
"welcomeSubtitle": "You are signed in as administrator. Pick a section to manage HealthLog.",
|
||
"snapshotTitle": "System snapshot",
|
||
"snapshotVersion": "Version",
|
||
"snapshotDatabase": "Database",
|
||
"snapshotWorker": "Worker",
|
||
"snapshotStarted": "Started",
|
||
"snapshotBuildSha": "Build SHA",
|
||
"snapshotBuiltAt": "Built at",
|
||
"snapshotOfflineGeo": "Données géographiques",
|
||
"snapshotOfflineGeoOn": "Hors ligne (GeoLite2)",
|
||
"snapshotOfflineGeoOff": "Fallback (ipwho.is)",
|
||
"snapshotLoadError": "Failed to load system snapshot.",
|
||
"snapshotLoading": "Loading snapshot...",
|
||
"auditTitle": "Recent activity",
|
||
"auditEmpty": "No recent audit entries.",
|
||
"auditLoadError": "Failed to load recent activity.",
|
||
"auditLoading": "Loading activity...",
|
||
"auditViewAll": "View all"
|
||
},
|
||
"section": {
|
||
"system-status": {
|
||
"title": "System Status",
|
||
"subtitle": "Worker, database, and integration health at a glance."
|
||
},
|
||
"general": {
|
||
"title": "General",
|
||
"subtitle": "Registration, default language, and other app-wide toggles."
|
||
},
|
||
"services": {
|
||
"title": "Services",
|
||
"subtitle": "Enable or disable notification channels and integrations system-wide."
|
||
},
|
||
"integrations": {
|
||
"title": "Intégrations",
|
||
"subtitle": "Configure Umami, GlitchTip, Web Push, and bug reports."
|
||
},
|
||
"ai-quality": {
|
||
"title": "Insights Quality",
|
||
"subtitle": "Helpfulness scores grouped by severity and provider, from the last 30 days of user feedback."
|
||
},
|
||
"assistant": {
|
||
"title": "Surfaces d'assistance",
|
||
"subtitle": "Activer ou désactiver chaque surface pilotée par le modèle sans supprimer la configuration du fournisseur."
|
||
},
|
||
"coach-feedback": {
|
||
"title": "Coach Feedback",
|
||
"subtitle": "Helpful-rate per Coach prompt version, tone, and verbosity from the last 30 days."
|
||
},
|
||
"feedback": {
|
||
"title": "Feedback",
|
||
"subtitle": "Triage user feedback, bug reports, and feature requests."
|
||
},
|
||
"reminders": {
|
||
"title": "Reminders",
|
||
"subtitle": "Tune medication reminder thresholds and run a manual check."
|
||
},
|
||
"users": {
|
||
"title": "Users",
|
||
"subtitle": "Manage user accounts, roles, and active sessions.",
|
||
"filter": {
|
||
"all": "Tout",
|
||
"admin": "Admins",
|
||
"user": "Users"
|
||
},
|
||
"forceLogout": "Force logout",
|
||
"forceLogoutConfirmTitle": "Force logout {name}?",
|
||
"forceLogoutConfirmBody": "All active sessions for this user will be revoked. They will need to sign in again on every device.",
|
||
"forceLogoutSuccess": "Logged {name} out of {count} session(s)",
|
||
"forceLogoutFailed": "Failed to force logout",
|
||
"cannotLogoutSelf": "Cannot force-logout yourself",
|
||
"emptyTitle": "No users in this view",
|
||
"emptyDescription": "There are no users matching the current filter.",
|
||
"emptyResetFilter": "Show all users"
|
||
},
|
||
"api-tokens": {
|
||
"title": "API Tokens",
|
||
"subtitle": "Active bearer tokens issued to native clients and integrations."
|
||
},
|
||
"login-overview": {
|
||
"title": "Login Overview",
|
||
"subtitle": "Audit trail of authentication and admin events."
|
||
},
|
||
"auditLog": {
|
||
"filterActor": "Actor (user id or username)",
|
||
"filterAction": "Action",
|
||
"filterActionAll": "All actions",
|
||
"filterTarget": "Target (id or path)",
|
||
"filterDate": "Date range",
|
||
"range24h": "Last 24 hours",
|
||
"range7d": "7 derniers jours",
|
||
"range30d": "30 derniers jours",
|
||
"rangeAll": "Toute la période",
|
||
"perPage": "Per page",
|
||
"prev": "Previous",
|
||
"next": "Suivant",
|
||
"pageOf": "Page {page} sur {total}",
|
||
"export": "Export CSV",
|
||
"empty": "No audit entries match the current filters."
|
||
},
|
||
"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. Buffer is volatile and capped at 500 entries.",
|
||
"filterTraceId": "Trace ID",
|
||
"filterAction": "Action contains…",
|
||
"filterLevel": "Level",
|
||
"levelAll": "All levels",
|
||
"filterRange": "Time window",
|
||
"range15m": "Last 15 minutes",
|
||
"range1h": "Last hour",
|
||
"range6h": "Last 6 hours",
|
||
"rangeAll": "Whole buffer",
|
||
"colLevel": "Level",
|
||
"colTimestamp": "Timestamp",
|
||
"colAction": "Action",
|
||
"colDuration": "Duration",
|
||
"colTraceId": "Trace",
|
||
"showing": "Showing {count} of up to {bufferMax} buffered events",
|
||
"empty": "Buffer is empty",
|
||
"emptyDescription": "No events match the current filters yet. Hit refresh after triggering some traffic.",
|
||
"refresh": "Refresh",
|
||
"eventDetails": "Event details",
|
||
"closeDetails": "Close details"
|
||
},
|
||
"backups": {
|
||
"title": "Backups",
|
||
"subtitle": "Weekly per-user data snapshots stored in PostgreSQL.",
|
||
"description": "Each user gets one rolling snapshot per backup type. Sizes show the encrypted blob — payloads are not downloadable from this page.",
|
||
"runNow": "Backup now",
|
||
"runEnqueued": "Backup job enqueued",
|
||
"runFailed": "Failed to enqueue backup",
|
||
"loading": "Loading backups...",
|
||
"loadError": "Failed to load backups.",
|
||
"emptyTitle": "No backups yet",
|
||
"emptyDescription": "Backups run automatically every Sunday at 03:00 — or trigger one now to create the first snapshot.",
|
||
"colUser": "User",
|
||
"colType": "Type",
|
||
"typeWeeklyAuto": "Weekly (auto)",
|
||
"typeManual": "Manual",
|
||
"colSize": "Size",
|
||
"colCreatedAt": "Last snapshot",
|
||
"colActions": "Actions",
|
||
"retentionLabel": "Retention: {days} days",
|
||
"download": "Download",
|
||
"downloadAria": "Download backup for {username}",
|
||
"downloadFailed": "Download failed",
|
||
"downloadStarted": "Download started",
|
||
"uploadTitle": "Upload backup",
|
||
"uploadDescription": "Validate a backup file and store it as a manual snapshot. Restoring is a separate step.",
|
||
"uploadButton": "Upload file",
|
||
"uploadHelp": "JSON file matching the current backup schema. Max 10 MB.",
|
||
"uploadSuccess": "Backup uploaded ({count} records)",
|
||
"uploadFailed": "Upload failed",
|
||
"restore": "Restore",
|
||
"restoreAria": "Restore from backup for {username}",
|
||
"restoreTitle": "Restore from backup",
|
||
"restoreDescription": "This will replace ALL current data for {username} with the snapshot from {when}. Existing measurements, medications, intake events, mood entries, notification channels, push subscriptions and queued Telegram deletions will be deleted.",
|
||
"restorePromptLabel": "Type RESTORE to continue",
|
||
"restoreConfirm": "Restore now",
|
||
"restoreInProgress": "Restoring...",
|
||
"restoreSuccess": "Restore complete",
|
||
"restoreFailed": "Restore failed",
|
||
"docsLink": "Documentation"
|
||
},
|
||
"danger-zone": {
|
||
"title": "Danger Zone",
|
||
"subtitle": "Destructive system-wide operations."
|
||
},
|
||
"about": {
|
||
"title": "About",
|
||
"subtitle": "Version, license, source, and update check."
|
||
}
|
||
},
|
||
"carrier": "Opérateur",
|
||
"carrierUnknown": "Opérateur inconnu",
|
||
"carrierUnavailableGeoFallback": "{location} — carrier unavailable"
|
||
},
|
||
"achievements": {
|
||
"title": "Achievements",
|
||
"subtitle": "Earn achievements by tracking your health and taking your meds on time.",
|
||
"loginRequired": "Please sign in to view achievements.",
|
||
"points": "Points",
|
||
"unlocked": "Unlocked",
|
||
"nextGoal": "Next goal",
|
||
"allCompleted": "All achievements unlocked!",
|
||
"completed": "Completed",
|
||
"goalReached": "Goal reached",
|
||
"remainingUnlocks": "{count} still unlockable",
|
||
"noneUnlockedYet": "No achievements unlocked yet.",
|
||
"pointsValue": "{points} points",
|
||
"metricCount": "{count}",
|
||
"metricDays": "{count} days",
|
||
"metricPercent": "{count}%",
|
||
"badges": {
|
||
"intakeTotal1": {
|
||
"title": "First intake",
|
||
"description": "Record your first taken medication event."
|
||
},
|
||
"intakeTotal10": {
|
||
"title": "Intake starter",
|
||
"description": "Record 10 taken medication events."
|
||
},
|
||
"intakeTotal50": {
|
||
"title": "Intake routine",
|
||
"description": "Record 50 taken medication events."
|
||
},
|
||
"intakeTotal150": {
|
||
"title": "Intake expert",
|
||
"description": "Record 150 taken medication events."
|
||
},
|
||
"intakeTotal300": {
|
||
"title": "Intake legend",
|
||
"description": "Record 300 taken medication events."
|
||
},
|
||
"overIntake1": {
|
||
"title": "Double take",
|
||
"description": "Take medication at least once more than planned."
|
||
},
|
||
"skippedIntake1": {
|
||
"title": "Stepped back",
|
||
"description": "Skip at least one planned intake."
|
||
},
|
||
"passkeyCreated1": {
|
||
"title": "Passkey set up",
|
||
"description": "Create your first passkey."
|
||
},
|
||
"passkeyLogin1": {
|
||
"title": "Passkey login",
|
||
"description": "Sign in at least once with a passkey."
|
||
},
|
||
"passwordLogin1": {
|
||
"title": "Old school",
|
||
"description": "Sign in at least once with username and password."
|
||
},
|
||
"bugReport1": {
|
||
"title": "Bug hunter",
|
||
"description": "Submit a bug report."
|
||
},
|
||
"loginStreak7": {
|
||
"title": "Login streak 7d",
|
||
"description": "Sign in on 7 consecutive days."
|
||
},
|
||
"loginStreak30": {
|
||
"title": "Login streak 30d",
|
||
"description": "Sign in on 30 consecutive days."
|
||
},
|
||
"onTimePerfect1": {
|
||
"title": "On-time 1d",
|
||
"description": "Take all medications on time for 1 day."
|
||
},
|
||
"compliance801": {
|
||
"title": "80% adherence · 1d",
|
||
"description": "Reach at least 80% 30-day adherence for 1 day."
|
||
},
|
||
"bmiGreen1": {
|
||
"title": "BMI green · 1d",
|
||
"description": "Keep your BMI in the normal range for 1 day."
|
||
},
|
||
"bpGreen1": {
|
||
"title": "BP green · 1d",
|
||
"description": "Keep your blood pressure in the normal range for 1 day."
|
||
},
|
||
"pulseGreen1": {
|
||
"title": "Pulse green · 1d",
|
||
"description": "Keep your resting pulse in the normal range for 1 day."
|
||
},
|
||
"onTimePerfect7": {
|
||
"title": "On-time 7d",
|
||
"description": "Take all medications on time for 7 consecutive days."
|
||
},
|
||
"compliance807": {
|
||
"title": "80% adherence · 7d",
|
||
"description": "Reach at least 80% 30-day adherence for 7 consecutive days."
|
||
},
|
||
"bmiGreen7": {
|
||
"title": "BMI green · 7d",
|
||
"description": "Keep your BMI in the normal range for 7 consecutive days."
|
||
},
|
||
"bpGreen7": {
|
||
"title": "BP green · 7d",
|
||
"description": "Keep your blood pressure in the normal range for 7 consecutive days."
|
||
},
|
||
"pulseGreen7": {
|
||
"title": "Pulse green · 7d",
|
||
"description": "Keep your resting pulse in the normal range for 7 consecutive days."
|
||
},
|
||
"onTimePerfect30": {
|
||
"title": "On-time 30d",
|
||
"description": "Take all medications on time for 30 consecutive days."
|
||
},
|
||
"compliance8030": {
|
||
"title": "80% adherence · 30d",
|
||
"description": "Reach at least 80% 30-day adherence for 30 consecutive days."
|
||
},
|
||
"bmiGreen30": {
|
||
"title": "BMI green · 30d",
|
||
"description": "Keep your BMI in the normal range for 30 consecutive days."
|
||
},
|
||
"bpGreen30": {
|
||
"title": "BP green · 30d",
|
||
"description": "Keep your blood pressure in the normal range for 30 consecutive days."
|
||
},
|
||
"pulseGreen30": {
|
||
"title": "Pulse green · 30d",
|
||
"description": "Keep your resting pulse in the normal range for 30 consecutive days."
|
||
},
|
||
"onTimePerfect180": {
|
||
"title": "On-time 180d",
|
||
"description": "Take all medications on time for 180 consecutive days."
|
||
},
|
||
"compliance80180": {
|
||
"title": "80% adherence · 180d",
|
||
"description": "Reach at least 80% 30-day adherence for 180 consecutive days."
|
||
},
|
||
"bmiGreen180": {
|
||
"title": "BMI green · 180d",
|
||
"description": "Keep your BMI in the normal range for 180 consecutive days."
|
||
},
|
||
"bpGreen180": {
|
||
"title": "BP green · 180d",
|
||
"description": "Keep your blood pressure in the normal range for 180 consecutive days."
|
||
},
|
||
"pulseGreen180": {
|
||
"title": "Pulse green · 180d",
|
||
"description": "Keep your resting pulse in the normal range for 180 consecutive days."
|
||
},
|
||
"onTimePerfect360": {
|
||
"title": "On-time 360d",
|
||
"description": "Take all medications on time for 360 consecutive days."
|
||
},
|
||
"compliance80360": {
|
||
"title": "80% adherence · 360d",
|
||
"description": "Reach at least 80% 30-day adherence for 360 consecutive days."
|
||
},
|
||
"bmiGreen360": {
|
||
"title": "BMI green · 360d",
|
||
"description": "Keep your BMI in the normal range for 360 consecutive days."
|
||
},
|
||
"bpGreen360": {
|
||
"title": "BP green · 360d",
|
||
"description": "Keep your blood pressure in the normal range for 360 consecutive days."
|
||
},
|
||
"pulseGreen360": {
|
||
"title": "Pulse green · 360d",
|
||
"description": "Keep your resting pulse in the normal range for 360 consecutive days."
|
||
},
|
||
"moodFirst": {
|
||
"title": "First mood",
|
||
"description": "Log your first mood entry."
|
||
},
|
||
"moodStreak7": {
|
||
"title": "Mood diarist 7d",
|
||
"description": "Log a mood entry on 7 consecutive days."
|
||
},
|
||
"moodStreak30": {
|
||
"title": "Mood diarist 30d",
|
||
"description": "Log a mood entry on 30 consecutive days."
|
||
},
|
||
"moodUp7": {
|
||
"title": "Brighter week",
|
||
"description": "Your 7-day mood average improved by at least 1.0 point compared to the previous week."
|
||
},
|
||
"weightFirst": {
|
||
"title": "First weigh-in",
|
||
"description": "Record your first weight measurement."
|
||
},
|
||
"weight50": {
|
||
"title": "Fifty weigh-ins",
|
||
"description": "Record 50 weight measurements."
|
||
},
|
||
"weight200": {
|
||
"title": "200 weigh-ins",
|
||
"description": "Record 200 weight measurements."
|
||
},
|
||
"bpFirst": {
|
||
"title": "First reading",
|
||
"description": "Record your first blood-pressure measurement."
|
||
},
|
||
"bp50": {
|
||
"title": "Fifty BP readings",
|
||
"description": "Record 50 blood-pressure measurements."
|
||
},
|
||
"bp200": {
|
||
"title": "200 BP readings",
|
||
"description": "Record 200 blood-pressure measurements."
|
||
},
|
||
"pulseFirst": {
|
||
"title": "First pulse",
|
||
"description": "Record your first pulse measurement."
|
||
},
|
||
"consistentMonth": {
|
||
"title": "Consistent month",
|
||
"description": "Log entries on at least 25 distinct days within a single calendar month."
|
||
},
|
||
"entryStreak7": {
|
||
"title": "Tracker streak 7d",
|
||
"description": "Log at least one entry on 7 consecutive days."
|
||
},
|
||
"entryStreak30": {
|
||
"title": "Tracker streak 30d",
|
||
"description": "Log at least one entry on 30 consecutive days."
|
||
},
|
||
"weekendWarrior": {
|
||
"title": "Weekend tracker",
|
||
"description": "Log entries on 4 consecutive Saturday + Sunday weekend pairs."
|
||
},
|
||
"hiddenNightOwl": {
|
||
"title": "Night owl",
|
||
"description": "Logged an entry between 02:00 and 04:00 in the morning."
|
||
},
|
||
"hiddenEarlyBird": {
|
||
"title": "Early bird",
|
||
"description": "Logged an entry between 04:00 and 06:00 in the morning."
|
||
},
|
||
"hiddenLeapDay": {
|
||
"title": "Leap-day legend",
|
||
"description": "Logged an entry on February 29."
|
||
},
|
||
"hiddenDoctorPdf": {
|
||
"title": "House call",
|
||
"description": "Exported your first doctor-report PDF."
|
||
},
|
||
"hiddenLocaleFlip": {
|
||
"title": "Polyglot",
|
||
"description": "Switched the app language at least once."
|
||
},
|
||
"hiddenBugBuddy": {
|
||
"title": "Bug buddy",
|
||
"description": "Submitted at least 5 bug reports — the project loves you."
|
||
}
|
||
},
|
||
"nextProgressLabel": "Progress to unlock",
|
||
"completedOn": "Completed on {date}",
|
||
"locked": "Locked",
|
||
"criterionHint": "{current} / {target}",
|
||
"progressPercent": "{percent}%",
|
||
"categories": {
|
||
"medication": "Médicament",
|
||
"vitals": "Vitals",
|
||
"mood": "Humeur",
|
||
"security": "Account & security",
|
||
"engagement": "Engagement",
|
||
"hidden": "Hidden"
|
||
},
|
||
"hiddenCard": {
|
||
"title": "Hidden achievement",
|
||
"description": "Keep tracking — you might just stumble across it.",
|
||
"ariaLabel": "Hidden locked achievement"
|
||
},
|
||
"hiddenUnlockToast": {
|
||
"title": "You unlocked a hidden achievement!"
|
||
},
|
||
"dashboardCard": {
|
||
"title": "Recent unlocks",
|
||
"viewAll": "View all",
|
||
"empty": "No achievements yet — keep logging to unlock your first."
|
||
}
|
||
},
|
||
"bugreport": {
|
||
"title": "Rapport de bug",
|
||
"subtitle": "Envoie un bug, une suggestion ou une question. L’administrateur du serveur verra ton envoi.",
|
||
"loginRequired": "Connecte-toi pour signaler un bug.",
|
||
"bugTitle": "Titre",
|
||
"description": "Description",
|
||
"submit": "Envoyer",
|
||
"success": "Merci ! Ton rapport a bien été envoyé.",
|
||
"errorCreating": "Erreur lors de la création",
|
||
"category": "Type",
|
||
"categoryBug": "Bug",
|
||
"categoryFeature": "Suggestion",
|
||
"categoryQuestion": "Question",
|
||
"categoryOther": "Autre retour",
|
||
"bugTitlePlaceholder": "Résumé court (optionnel)",
|
||
"githubEscalationNote": "Ton retour est stocké localement. Si l’administrateur active l’intégration GitHub, il pourra être publié comme issue public à la demande.",
|
||
"internalOnlyNote": "Ton retour est stocké localement et n’est visible que par l’administrateur de ce serveur.",
|
||
"disabledTitle": "Bug reports are turned off",
|
||
"disabledBody": "The administrator has disabled bug reports on this server."
|
||
},
|
||
"notifications": {
|
||
"title": "Centre de notifications",
|
||
"breadcrumbInbox": "Centre de 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.",
|
||
"noChannels": "Configure d’abord un canal de notification dans les paramètres.",
|
||
"goToSettings": "Aller aux paramètres du canal",
|
||
"channelDisabled": "Désactivé",
|
||
"admin": {
|
||
"deployFailedTitle": "Échec du déploiement : {application}",
|
||
"deployFailedBody": "Une erreur est survenue lors du déploiement de {application} (#{deployment}) : {error}. Voir les journaux : {logsUrl}",
|
||
"testNotificationTitle": "HealthLog notification de test",
|
||
"testNotificationBody": "Cette notification de test a été déclenchée depuis le panneau d'administration. Si vous la voyez, le canal fonctionne.",
|
||
"reminderCheckMissedTitle": "Rappel manqué : {medication}",
|
||
"reminderCheckMissedBody": "{medication} ({dose}) n'a pas été enregistré dans la fenêtre {window}.",
|
||
"reminderCheckOverdueTitle": "Prise en retard : {medication}",
|
||
"reminderCheckOverdueBody": "{medication} ({dose}) dans la fenêtre {window} est en retard de {minutes} minutes.",
|
||
"offlineGeoUnavailableTitle": "Bases de géolocalisation hors ligne non chargées",
|
||
"offlineGeoUnavailableBody": "HealthLog résout les localisations de connexion via le fallback en ligne ipwho.is. Pour activer les bases hors ligne GeoLite2-City et GeoLite2-ASN, définissez MAXMIND_LICENSE_KEY dans les secrets GitHub Actions à {secretsUrl} puis redéployez. En attendant, la colonne opérateur dans l'aperçu des connexions reste vide."
|
||
},
|
||
"user": {
|
||
"telegramTestBody": "HealthLog: connexion réussie. Les notifications Telegram sont actives."
|
||
},
|
||
"moodReminder": {
|
||
"title": "Rappel quotidien d’humeur",
|
||
"description": "Petit rappel à l’heure que tu as choisie si tu n’as pas encore noté ton humeur du jour. Utilise uniquement les canaux déjà configurés (Telegram, ntfy, Web Push, Apple Push) et reste silencieux dès que tu as noté ton humeur aujourd’hui.",
|
||
"toggleAria": "Activer / désactiver le rappel quotidien d’humeur",
|
||
"statusOn": "Actif à l’heure que tu as choisie",
|
||
"statusOff": "Désactivé",
|
||
"enabledToast": "Rappel d’humeur activé.",
|
||
"disabledToast": "Rappel d’humeur désactivé.",
|
||
"saveError": "Échec de l’enregistrement. Réessayez.",
|
||
"hourLabel": "Heure du rappel",
|
||
"hourAria": "Heure du rappel d’humeur",
|
||
"hourSavedToast": "Heure du rappel mise à jour."
|
||
},
|
||
"eventMedicationReminder": "Rappel de médicament",
|
||
"eventMedicationReminderDesc": "Envoyé à chaque heure de prise prévue.",
|
||
"eventMeasurementAnomaly": "Mesure inhabituelle",
|
||
"eventMeasurementAnomalyDesc": "Envoyé quand une valeur sort nettement de votre plage habituelle.",
|
||
"eventComplianceLow": "Observance faible",
|
||
"eventComplianceLowDesc": "Envoyé quand votre taux de prise des derniers jours passe sous les 80 %.",
|
||
"eventWithingsSyncFailed": "Échec de la synchronisation Withings",
|
||
"eventWithingsSyncFailedDesc": "Envoyé quand la synchronisation Withings échoue plusieurs fois d'affilée.",
|
||
"eventSystemAlert": "Notification système",
|
||
"eventSystemAlertDesc": "Messages généraux du serveur HealthLog, par exemple maintenance ou avis de compte.",
|
||
"eventPersonalRecord": "Record personnel",
|
||
"eventPersonalRecordDesc": "Envoyé quand une valeur dépasse votre meilleur précédent.",
|
||
"eventMoodReminder": "Rappel d'humeur",
|
||
"eventMoodReminderDesc": "Rappel quotidien pour noter votre humeur du moment."
|
||
},
|
||
"i18n": {
|
||
"maintainershipBanner": {
|
||
"notice": "Cette langue est traduite automatiquement, y compris les instructions critiques pour la sécurité du Coach. Un contrôle de dérive automatique tourne en CI ; signalez toute régression du Coach sur GitHub.",
|
||
"cta": "Signaler sur GitHub",
|
||
"dismiss": "Ignorer"
|
||
}
|
||
},
|
||
"targets": {
|
||
"title": "Valeurs cibles",
|
||
"introText": "Tes valeurs actuelles face aux plages cibles recommandées. Les sources des recommandations sont liées sur chaque carte.",
|
||
"bmi": "IMC",
|
||
"average30d": "Moy. 30 jours :",
|
||
"consistency": {
|
||
"ariaLabel": "7 derniers jours, statut dans/hors plage par jour",
|
||
"daysInRange": "{count} sur {total} dans la cible",
|
||
"daysLogged": "{count} sur {total} enregistrés",
|
||
"dotInRange": "dans la plage",
|
||
"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",
|
||
"twoDaysAgo": "il y a 2 jours",
|
||
"threeDaysAgo": "il y a 3 jours",
|
||
"fourDaysAgo": "il y a 4 jours",
|
||
"fiveDaysAgo": "il y a 5 jours",
|
||
"sixDaysAgo": "il y a 6 jours"
|
||
}
|
||
},
|
||
"card": {
|
||
"lastMet": "Dernier objectif atteint : {when}",
|
||
"streak": "{count} jours d’affilée"
|
||
},
|
||
"relativeDay": {
|
||
"today": "Aujourd'hui",
|
||
"yesterday": "Hier",
|
||
"daysAgo": "il y a {count} jours"
|
||
},
|
||
"summary": {
|
||
"weekTitle": "{met} cibles sur {total} atteintes cette semaine",
|
||
"weekTitleAll": "Tout{total} targets met this week",
|
||
"streakHighlight": "{count} jours d’affilée : {metric}"
|
||
},
|
||
"coach": {
|
||
"cta": "Demander au coach"
|
||
},
|
||
"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).",
|
||
"minLabel": "Min",
|
||
"maxLabel": "Max",
|
||
"systolicMin": "Systolique min",
|
||
"systolicMax": "Systolique max",
|
||
"diastolicMin": "Diastolique min",
|
||
"diastolicMax": "Diastolique max",
|
||
"boundsHint": "Plage autorisée : {min}–{max} {unit}",
|
||
"resetToDefault": "Restaurer la valeur par défaut",
|
||
"saveSuccess": "Plage cible mise à jour",
|
||
"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}",
|
||
"inTarget": "Dans la plage cible",
|
||
"aboveTarget": "{delta} {unit} au-dessus de la plage",
|
||
"belowTarget": "{delta} {unit} en dessous de la plage",
|
||
"diastolic": "Diastolique",
|
||
"noMeasurementYet": "Pas encore de mesures",
|
||
"noMeasurementData": "Pas de données de mesure. Ajoute des mesures pour voir tes objectifs.",
|
||
"profileIncomplete": "Profil incomplet",
|
||
"profileIncompleteHeight": "Renseigne ta taille dans le profil pour activer les objectifs IMC.",
|
||
"profileIncompleteAge": "Renseigne ta date de naissance dans le profil pour activer les objectifs liés à l’âge.",
|
||
"profileIncompleteHeightAge": "Renseigne taille et date de naissance dans le profil pour voir des objectifs personnalisés.",
|
||
"compliancePerMedication": "Observance par médicament",
|
||
"glucoseFasting": "Glycémie — à jeun",
|
||
"glucosePostprandial": "Glycémie — postprandiale",
|
||
"glucoseRandom": "Glycémie — indifférente",
|
||
"glucoseBedtime": "Glycémie — avant le coucher",
|
||
"loadError": "Impossible de charger les valeurs cibles",
|
||
"label": {
|
||
"WEIGHT": "Poids",
|
||
"BLOOD_PRESSURE": "Tension artérielle",
|
||
"BLOOD_PRESSURE_IN_TARGET": "Tension dans la cible",
|
||
"PULSE": "Pouls au repos",
|
||
"SLEEP_DURATION": "Durée du sommeil",
|
||
"BMI": "IMC",
|
||
"BODY_FAT": "Masse grasse",
|
||
"ACTIVITY_STEPS": "Pas/jour",
|
||
"MEDICATION_COMPLIANCE": "Observance",
|
||
"MOOD_SCORE": "Humeur",
|
||
"MOOD_STABILITY": "Stabilité de l’humeur"
|
||
},
|
||
"status": {
|
||
"underweight": "Insuffisance pondérale",
|
||
"normal": "Normal",
|
||
"overweight": "Surpoids",
|
||
"obesityGrade1": "Obésité grade I",
|
||
"obesityGrade2": "Obésité grade II",
|
||
"obesityGrade3": "Obésité grade III",
|
||
"optimal": "Optimale",
|
||
"highNormal": "Normale haute",
|
||
"hypertensionGrade1": "Hypertension grade 1",
|
||
"hypertensionGrade2": "Hypertension grade 2",
|
||
"hypertensionGrade3": "Hypertension grade 3",
|
||
"bradycardia": "Bradycardie",
|
||
"elevated": "Élevé",
|
||
"tachycardia": "Tachycardie",
|
||
"significantlyLow": "Nettement bas",
|
||
"slightlyLow": "Légèrement bas",
|
||
"onTarget": "Dans la plage cible",
|
||
"slightlyElevated": "Légèrement élevé",
|
||
"significantlyElevated": "Nettement élevé",
|
||
"farTooShort": "Bien trop court",
|
||
"tooShort": "Trop court",
|
||
"slightlyLong": "Légèrement long",
|
||
"farTooLong": "Bien trop long",
|
||
"belowEssential": "Sous l’essentiel",
|
||
"essential": "Essentiel",
|
||
"athletic": "Athlétique",
|
||
"fitness": "Fitness",
|
||
"acceptable": "Acceptable",
|
||
"obese": "Obèse",
|
||
"veryLow": "Très bas",
|
||
"lowActive": "Peu actif",
|
||
"moderatelyActive": "Modérément actif",
|
||
"active": "Actif",
|
||
"veryActive": "Très actif",
|
||
"good": "Bon",
|
||
"moderate": "Modéré",
|
||
"low": "Bas",
|
||
"high": "Élevé",
|
||
"veryGood": "Très bon",
|
||
"veryStable": "Très stable",
|
||
"stable": "Stable",
|
||
"fluctuating": "Fluctuant"
|
||
}
|
||
},
|
||
"passwordStrength": {
|
||
"veryWeak": "Très faible",
|
||
"weak": "Faible",
|
||
"acceptable": "Acceptable",
|
||
"strong": "Fort",
|
||
"veryStrong": "Très fort",
|
||
"tooShort": "Trop court",
|
||
"characters": "caractères",
|
||
"minLength": "Au moins {count} caractères requis."
|
||
},
|
||
"telegram": {
|
||
"errorInvalidAction": "Action invalide.",
|
||
"errorMedicationNotFound": "Médicament introuvable.",
|
||
"errorMedicationInactive": "Médicament introuvable ou inactif.",
|
||
"errorUnknownAction": "Action inconnue.",
|
||
"snoozeOneHour": "1 heure",
|
||
"snoozeThreeHours": "3 heures",
|
||
"snoozedFor": "{name} reporté de {duration}.",
|
||
"skipped": "{name} ignoré.",
|
||
"alreadyRecorded": "{name} était déjà enregistré.",
|
||
"recordedAsTaken": "{name} enregistré comme pris.",
|
||
"confirmed": "{name} confirmé.",
|
||
"genericConfirmed": "Confirmé.",
|
||
"cancelled": "Annulé.",
|
||
"noActiveMedications": "Aucun médicament actif trouvé.",
|
||
"whichMedication": "<b>Quel médicament as-tu pris ?</b>",
|
||
"cancelButton": "Annuler",
|
||
"askMedicationName": "Indique le médicament, p. ex. <b>pris Ramipril</b>.",
|
||
"medicationNotFoundExact": "Médicament introuvable. Envoie le nom exactement tel qu’il apparaît dans HealthLog.",
|
||
"helpHeader": "<b>Available commands:</b>",
|
||
"helpBody": "/help — show this help\n/add — record an intake\n/start — start the bot\n\n<b>Text commands:</b>\ntaken <name> — confirm an intake\n\n<b>Buttons in reminders:</b>\n• Taken — confirm intake\n• 🕐 1h / 🕐 3h — postpone reminder\n• ⏭ Skip — skip intake\n• ✓ Confirm — confirm a missed intake"
|
||
},
|
||
"medicationReminders": {
|
||
"phaseGreenTitle": "🟢 Reminder: {medName}",
|
||
"phaseGreenMessage": "🟢 Reminder:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nWindow closes in {minutes} Min.",
|
||
"phaseYellowTitle": "🟡 Due soon: {medName}",
|
||
"phaseYellowMessage": "🟡 Due soon:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\n{minutes} min left.",
|
||
"phaseOrangeTitle": "🟠 Overdue: {medName}",
|
||
"phaseOrangeMessage": "🟠 Overdue:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nOverdue by {minutes} Min.",
|
||
"phaseRedTitle": "🔴 Missed: {medName}",
|
||
"phaseRedMessage": "🔴 Missed:\n<b>{medName}</b> ({doseInfo}, {timeWindow})\nMarked as missed.",
|
||
"buttonTaken": "Pris",
|
||
"buttonConfirm": "✓ Confirmer",
|
||
"buttonSnoozeOneHour": "🕐 1h",
|
||
"buttonSnoozeThreeHours": "🕐 3h",
|
||
"buttonSkip": "⏭ Ignorer"
|
||
},
|
||
"moodReminders": {
|
||
"dailyTitle": "Enregistrer votre humeur",
|
||
"dailyBody": "Comment vous sentez-vous aujourd’hui ?"
|
||
}
|
||
}
|