diff --git a/messages/de.json b/messages/de.json index d6028beca..8869e54ba 100644 --- a/messages/de.json +++ b/messages/de.json @@ -654,6 +654,205 @@ "budget": "Tägliches KI-Budget erreicht — bitte morgen erneut versuchen.", "network": "KI-Anbieter nicht erreichbar — bitte erneut versuchen." } + }, + "cadence": { + "section": "Rhythmus", + "label": "Wie oft", + "kind": { + "daily": "Jeden Tag", + "weekdays": "An bestimmten Wochentagen", + "everyNWeeks": "Alle N Wochen an bestimmten Tagen", + "monthly": "Monatlich an einem bestimmten Tag", + "everyNMonths": "Alle N Monate an einem bestimmten Tag", + "yearly": "Einmal im Jahr", + "rolling": "Alle N Tage seit der letzten Einnahme (flexibel)", + "rollingExplainer": "Zählt ab der letzten erfassten Einnahme — pausiert, wenn du eine Dosis auslässt.", + "oneShot": "Einmaldosis" + }, + "weekdays": { + "label": "Wochentage", + "short": { + "mo": "Mo", + "tu": "Di", + "we": "Mi", + "th": "Do", + "fr": "Fr", + "sa": "Sa", + "su": "So" + }, + "long": { + "mo": "Montag", + "tu": "Dienstag", + "we": "Mittwoch", + "th": "Donnerstag", + "fr": "Freitag", + "sa": "Samstag", + "su": "Sonntag" + } + }, + "intervalWeeks": { + "suffix": "Wochen" + }, + "dayOfMonth": { + "label": "Tag" + }, + "intervalMonths": { + "suffix": "Monate", + "dayOnLabel": "am Tag" + }, + "yearly": { + "date": { + "label": "Datum" + } + }, + "rollingDays": { + "suffix": "Tage" + } + }, + "timesOfDay": { + "section": "Uhrzeiten", + "label": "Uhrzeiten", + "empty": { + "cta": "Erste Uhrzeit hinzufügen." + }, + "add": "Uhrzeit hinzufügen", + "remove": "Entfernen", + "presets": { + "morning": "Morgens", + "noon": "Mittags", + "evening": "Abends", + "night": "Nachts" + }, + "max": { + "reached": "Maximum erreicht — bitte zuerst eine Uhrzeit entfernen." + } + }, + "courseWindow": { + "section": "Behandlungszeitraum", + "startsOn": { + "label": "Beginnt am" + }, + "endsOn": { + "label": "Endet am" + }, + "noEndDate": "Kein Enddatum", + "oneShotCaption": "(einmalige Dosis)", + "invalidRange": "Das Enddatum muss am oder nach dem Startdatum liegen." + }, + "oneShot": { + "section": "Einmaldosis" + }, + "legacyWindow": { + "section": "Erinnerungsfenster (alt)", + "help": "Ältere Pläne nutzen noch ein Zeitfenster-Paar. Neue Pläne nutzen die Uhrzeiten oben — das Fenster bleibt aus Kompatibilitätsgründen erhalten und entfällt in einer späteren Version." + } + }, + "create": { + "wizard": { + "header": { + "stepOf": "Schritt {current} von {total}", + "title": { + "step1": "Wie heißt das Medikament und was ist eine Einzeldosis?", + "step2": "Ist das eine einmalige Dosis oder nimmst du es regelmäßig?", + "step3": "Wie oft?", + "step4": "Etwas Besonderes zu den Tagen?", + "step5": "Zu welcher Uhrzeit?", + "step6": "Wann beginnt der Plan? Wann endet er (falls überhaupt)?", + "step7": "Erinnerungen und Übersicht" + } + }, + "step1": { + "name": { + "label": "Name", + "placeholder": "z. B. Mounjaro, Ibuprofen, Vitamin D" + }, + "dose": { + "amount": { + "label": "Dosis", + "placeholder": "z. B. 5" + }, + "unit": { + "label": "Einheit", + "mg": "mg", + "g": "g", + "ml": "ml", + "iu": "I.E.", + "tablets": "Tabletten", + "drops": "Tropfen", + "puffs": "Hübe", + "sprays": "Sprühstöße", + "capsules": "Kapseln", + "pieces": "Stück", + "other": "andere" + } + }, + "naturalLanguage": { + "button": "✨ Beschreiben", + "placeholderCopy": "Beschreibe das Medikament in eigenen Worten — der Assistent füllt die Schritte für dich aus." + } + }, + "step2": { + "oneShot": { + "title": "Einmaldosis", + "description": "Ein einzelner Termin — Grippeimpfung, Spritze, die letzte Dosis einer Kur." + }, + "recurring": { + "title": "Wiederkehrend", + "description": "Ein Medikament, das du nach einem Plan nimmst — täglich oder anders." + } + }, + "step3": { + "helper": "Wähle das Muster, das zu deiner Einnahme passt. Unteroptionen erscheinen, sobald du eines auswählst." + }, + "step4": { + "recap": "Das hast du gewählt. Tippe auf Zurück, wenn etwas nicht passt.", + "oneShotSkipped": "(übersprungen — Einmaldosis)" + }, + "step5": { + "helper": "Füge eine oder mehrere Uhrzeiten hinzu. Zu jeder Uhrzeit wird eine Erinnerung gesendet.", + "oneShotDate": { + "label": "Datum der Einmaldosis", + "helper": "Wir verwenden dieses Datum für die Erinnerung und für die Einnahmehistorie." + } + }, + "step6": { + "helper": "Der Plan läuft ab dem Startdatum. Lass das Enddatum offen, wenn du es dauerhaft nimmst." + }, + "step7": { + "reminders": { + "label": "Erinnerungen an", + "description": "Sendet eine Push-Benachrichtigung an deine konfigurierten Kanäle zu jeder geplanten Uhrzeit." + }, + "summary": { + "title": "Übersicht", + "cadence": { + "daily": "Jeden Tag", + "weekdays": "An ausgewählten Wochentagen", + "weekly": "Einmal pro Woche", + "biweekly": "Alle zwei Wochen", + "monthly": "Monatlich", + "quarterly": "Alle drei Monate", + "yearly": "Einmal im Jahr", + "rolling": "Alle {n} Tage seit der letzten Einnahme", + "oneShot": "Eine Einmaldosis", + "everyNWeeks": "Alle {n} Wochen", + "everyNMonths": "Alle {n} Monate" + }, + "times": "um {times}", + "startsOn": "Beginn: {date}", + "endsOn": "Ende: {date}", + "noEndDate": "Kein Enddatum" + } + }, + "nav": { + "back": "Zurück", + "next": "Weiter", + "create": "Medikament anlegen" + }, + "errors": { + "submitFailed": "Medikament konnte nicht angelegt werden — bitte erneut versuchen.", + "fieldRequired": "Pflichtfeld" + } } }, "titration": { diff --git a/messages/en.json b/messages/en.json index 057e1288c..80a53764a 100644 --- a/messages/en.json +++ b/messages/en.json @@ -654,6 +654,205 @@ "budget": "Daily AI budget reached — try again tomorrow.", "network": "Could not reach the AI provider — please retry." } + }, + "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." + }, + "oneShot": { + "section": "Single dose" + }, + "legacyWindow": { + "section": "Reminder window (legacy)", + "help": "Older schedules still use a window pair. New schedules use times of day above — the window stays for backwards compatibility and is dropped in a future release." + } + }, + "create": { + "wizard": { + "header": { + "stepOf": "Step {current} of {total}", + "title": { + "step1": "What's the medication called and what's a single dose?", + "step2": "Is this a one-time dose, or do you take it regularly?", + "step3": "How often?", + "step4": "Anything special about the days?", + "step5": "What time(s) of day?", + "step6": "When does the schedule start? When does it end (if ever)?", + "step7": "Reminders and summary" + } + }, + "step1": { + "name": { + "label": "Name", + "placeholder": "e.g. Mounjaro, Ibuprofen, Vitamin D" + }, + "dose": { + "amount": { + "label": "Dose", + "placeholder": "e.g. 5" + }, + "unit": { + "label": "Unit", + "mg": "mg", + "g": "g", + "ml": "ml", + "iu": "IU", + "tablets": "tablets", + "drops": "drops", + "puffs": "puffs", + "sprays": "sprays", + "capsules": "capsules", + "pieces": "pieces", + "other": "other" + } + }, + "naturalLanguage": { + "button": "✨ Describe it", + "placeholderCopy": "Type the medication in your own words and we will pre-fill the wizard." + } + }, + "step2": { + "oneShot": { + "title": "One-time dose", + "description": "A single appointment — flu shot, vaccine, the last dose of a course." + }, + "recurring": { + "title": "Recurring", + "description": "A medication you take on a schedule, daily or otherwise." + } + }, + "step3": { + "helper": "Pick the pattern that matches how often you take it. Sub-options appear once you choose." + }, + "step4": { + "recap": "Here's the cadence you picked. Tap Back if anything looks wrong.", + "oneShotSkipped": "(skipped — one-time dose)" + }, + "step5": { + "helper": "Add one or more times of day. Reminders fire at each entry.", + "oneShotDate": { + "label": "Date of the single dose", + "helper": "We use this date to schedule the reminder and to log the intake." + } + }, + "step6": { + "helper": "The schedule runs from the start date. Leave the end date open if you take it indefinitely." + }, + "step7": { + "reminders": { + "label": "Reminders on", + "description": "Send a push to your configured channels at every scheduled time." + }, + "summary": { + "title": "Summary", + "cadence": { + "daily": "Every day", + "weekdays": "On selected days of the week", + "weekly": "Once a 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" + }, + "times": "at {times}", + "startsOn": "Starts: {date}", + "endsOn": "Ends: {date}", + "noEndDate": "No end date" + } + }, + "nav": { + "back": "Back", + "next": "Next", + "create": "Create medication" + }, + "errors": { + "submitFailed": "Could not create the medication — please retry.", + "fieldRequired": "Required" + } } }, "titration": { diff --git a/messages/es.json b/messages/es.json index a68476904..3c7a9d6b3 100644 --- a/messages/es.json +++ b/messages/es.json @@ -654,6 +654,205 @@ "budget": "Se alcanzó el presupuesto diario de IA — inténtalo de nuevo mañana.", "network": "No se pudo contactar con el proveedor de IA — inténtalo de nuevo." } + }, + "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." + }, + "oneShot": { + "section": "Single dose" + }, + "legacyWindow": { + "section": "Reminder window (legacy)", + "help": "Older schedules still use a window pair. New schedules use times of day above — the window stays for backwards compatibility and is dropped in a future release." + } + }, + "create": { + "wizard": { + "header": { + "stepOf": "Step {current} of {total}", + "title": { + "step1": "What's the medication called and what's a single dose?", + "step2": "Is this a one-time dose, or do you take it regularly?", + "step3": "How often?", + "step4": "Anything special about the days?", + "step5": "What time(s) of day?", + "step6": "When does the schedule start? When does it end (if ever)?", + "step7": "Reminders and summary" + } + }, + "step1": { + "name": { + "label": "Name", + "placeholder": "e.g. Mounjaro, Ibuprofen, Vitamin D" + }, + "dose": { + "amount": { + "label": "Dose", + "placeholder": "e.g. 5" + }, + "unit": { + "label": "Unit", + "mg": "mg", + "g": "g", + "ml": "ml", + "iu": "IU", + "tablets": "tablets", + "drops": "drops", + "puffs": "puffs", + "sprays": "sprays", + "capsules": "capsules", + "pieces": "pieces", + "other": "other" + } + }, + "naturalLanguage": { + "button": "✨ Describe it", + "placeholderCopy": "Type the medication in your own words and we will pre-fill the wizard." + } + }, + "step2": { + "oneShot": { + "title": "One-time dose", + "description": "A single appointment — flu shot, vaccine, the last dose of a course." + }, + "recurring": { + "title": "Recurring", + "description": "A medication you take on a schedule, daily or otherwise." + } + }, + "step3": { + "helper": "Pick the pattern that matches how often you take it. Sub-options appear once you choose." + }, + "step4": { + "recap": "Here's the cadence you picked. Tap Back if anything looks wrong.", + "oneShotSkipped": "(skipped — one-time dose)" + }, + "step5": { + "helper": "Add one or more times of day. Reminders fire at each entry.", + "oneShotDate": { + "label": "Date of the single dose", + "helper": "We use this date to schedule the reminder and to log the intake." + } + }, + "step6": { + "helper": "The schedule runs from the start date. Leave the end date open if you take it indefinitely." + }, + "step7": { + "reminders": { + "label": "Reminders on", + "description": "Send a push to your configured channels at every scheduled time." + }, + "summary": { + "title": "Summary", + "cadence": { + "daily": "Every day", + "weekdays": "On selected days of the week", + "weekly": "Once a 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" + }, + "times": "at {times}", + "startsOn": "Starts: {date}", + "endsOn": "Ends: {date}", + "noEndDate": "No end date" + } + }, + "nav": { + "back": "Back", + "next": "Next", + "create": "Create medication" + }, + "errors": { + "submitFailed": "Could not create the medication — please retry.", + "fieldRequired": "Required" + } } }, "titration": { diff --git a/messages/fr.json b/messages/fr.json index 67bffdead..a4fe58ec8 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -654,6 +654,205 @@ "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." + }, + "oneShot": { + "section": "Single dose" + }, + "legacyWindow": { + "section": "Reminder window (legacy)", + "help": "Older schedules still use a window pair. New schedules use times of day above — the window stays for backwards compatibility and is dropped in a future release." + } + }, + "create": { + "wizard": { + "header": { + "stepOf": "Step {current} of {total}", + "title": { + "step1": "What's the medication called and what's a single dose?", + "step2": "Is this a one-time dose, or do you take it regularly?", + "step3": "How often?", + "step4": "Anything special about the days?", + "step5": "What time(s) of day?", + "step6": "When does the schedule start? When does it end (if ever)?", + "step7": "Reminders and summary" + } + }, + "step1": { + "name": { + "label": "Name", + "placeholder": "e.g. Mounjaro, Ibuprofen, Vitamin D" + }, + "dose": { + "amount": { + "label": "Dose", + "placeholder": "e.g. 5" + }, + "unit": { + "label": "Unit", + "mg": "mg", + "g": "g", + "ml": "ml", + "iu": "IU", + "tablets": "tablets", + "drops": "drops", + "puffs": "puffs", + "sprays": "sprays", + "capsules": "capsules", + "pieces": "pieces", + "other": "other" + } + }, + "naturalLanguage": { + "button": "✨ Describe it", + "placeholderCopy": "Type the medication in your own words and we will pre-fill the wizard." + } + }, + "step2": { + "oneShot": { + "title": "One-time dose", + "description": "A single appointment — flu shot, vaccine, the last dose of a course." + }, + "recurring": { + "title": "Recurring", + "description": "A medication you take on a schedule, daily or otherwise." + } + }, + "step3": { + "helper": "Pick the pattern that matches how often you take it. Sub-options appear once you choose." + }, + "step4": { + "recap": "Here's the cadence you picked. Tap Back if anything looks wrong.", + "oneShotSkipped": "(skipped — one-time dose)" + }, + "step5": { + "helper": "Add one or more times of day. Reminders fire at each entry.", + "oneShotDate": { + "label": "Date of the single dose", + "helper": "We use this date to schedule the reminder and to log the intake." + } + }, + "step6": { + "helper": "The schedule runs from the start date. Leave the end date open if you take it indefinitely." + }, + "step7": { + "reminders": { + "label": "Reminders on", + "description": "Send a push to your configured channels at every scheduled time." + }, + "summary": { + "title": "Summary", + "cadence": { + "daily": "Every day", + "weekdays": "On selected days of the week", + "weekly": "Once a 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" + }, + "times": "at {times}", + "startsOn": "Starts: {date}", + "endsOn": "Ends: {date}", + "noEndDate": "No end date" + } + }, + "nav": { + "back": "Back", + "next": "Next", + "create": "Create medication" + }, + "errors": { + "submitFailed": "Could not create the medication — please retry.", + "fieldRequired": "Required" + } } }, "titration": { diff --git a/messages/it.json b/messages/it.json index 3d9f1dc4a..6c8973ddc 100644 --- a/messages/it.json +++ b/messages/it.json @@ -654,6 +654,205 @@ "budget": "Budget IA giornaliero raggiunto — riprova domani.", "network": "Impossibile contattare il provider IA — riprova." } + }, + "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." + }, + "oneShot": { + "section": "Single dose" + }, + "legacyWindow": { + "section": "Reminder window (legacy)", + "help": "Older schedules still use a window pair. New schedules use times of day above — the window stays for backwards compatibility and is dropped in a future release." + } + }, + "create": { + "wizard": { + "header": { + "stepOf": "Step {current} of {total}", + "title": { + "step1": "What's the medication called and what's a single dose?", + "step2": "Is this a one-time dose, or do you take it regularly?", + "step3": "How often?", + "step4": "Anything special about the days?", + "step5": "What time(s) of day?", + "step6": "When does the schedule start? When does it end (if ever)?", + "step7": "Reminders and summary" + } + }, + "step1": { + "name": { + "label": "Name", + "placeholder": "e.g. Mounjaro, Ibuprofen, Vitamin D" + }, + "dose": { + "amount": { + "label": "Dose", + "placeholder": "e.g. 5" + }, + "unit": { + "label": "Unit", + "mg": "mg", + "g": "g", + "ml": "ml", + "iu": "IU", + "tablets": "tablets", + "drops": "drops", + "puffs": "puffs", + "sprays": "sprays", + "capsules": "capsules", + "pieces": "pieces", + "other": "other" + } + }, + "naturalLanguage": { + "button": "✨ Describe it", + "placeholderCopy": "Type the medication in your own words and we will pre-fill the wizard." + } + }, + "step2": { + "oneShot": { + "title": "One-time dose", + "description": "A single appointment — flu shot, vaccine, the last dose of a course." + }, + "recurring": { + "title": "Recurring", + "description": "A medication you take on a schedule, daily or otherwise." + } + }, + "step3": { + "helper": "Pick the pattern that matches how often you take it. Sub-options appear once you choose." + }, + "step4": { + "recap": "Here's the cadence you picked. Tap Back if anything looks wrong.", + "oneShotSkipped": "(skipped — one-time dose)" + }, + "step5": { + "helper": "Add one or more times of day. Reminders fire at each entry.", + "oneShotDate": { + "label": "Date of the single dose", + "helper": "We use this date to schedule the reminder and to log the intake." + } + }, + "step6": { + "helper": "The schedule runs from the start date. Leave the end date open if you take it indefinitely." + }, + "step7": { + "reminders": { + "label": "Reminders on", + "description": "Send a push to your configured channels at every scheduled time." + }, + "summary": { + "title": "Summary", + "cadence": { + "daily": "Every day", + "weekdays": "On selected days of the week", + "weekly": "Once a 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" + }, + "times": "at {times}", + "startsOn": "Starts: {date}", + "endsOn": "Ends: {date}", + "noEndDate": "No end date" + } + }, + "nav": { + "back": "Back", + "next": "Next", + "create": "Create medication" + }, + "errors": { + "submitFailed": "Could not create the medication — please retry.", + "fieldRequired": "Required" + } } }, "titration": { diff --git a/messages/pl.json b/messages/pl.json index 21d0877ee..e996dcfd8 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -654,6 +654,205 @@ "budget": "Osiągnięto dzienny limit AI — spróbuj jutro.", "network": "Nie udało się połączyć z dostawcą AI — spróbuj ponownie." } + }, + "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." + }, + "oneShot": { + "section": "Single dose" + }, + "legacyWindow": { + "section": "Reminder window (legacy)", + "help": "Older schedules still use a window pair. New schedules use times of day above — the window stays for backwards compatibility and is dropped in a future release." + } + }, + "create": { + "wizard": { + "header": { + "stepOf": "Step {current} of {total}", + "title": { + "step1": "What's the medication called and what's a single dose?", + "step2": "Is this a one-time dose, or do you take it regularly?", + "step3": "How often?", + "step4": "Anything special about the days?", + "step5": "What time(s) of day?", + "step6": "When does the schedule start? When does it end (if ever)?", + "step7": "Reminders and summary" + } + }, + "step1": { + "name": { + "label": "Name", + "placeholder": "e.g. Mounjaro, Ibuprofen, Vitamin D" + }, + "dose": { + "amount": { + "label": "Dose", + "placeholder": "e.g. 5" + }, + "unit": { + "label": "Unit", + "mg": "mg", + "g": "g", + "ml": "ml", + "iu": "IU", + "tablets": "tablets", + "drops": "drops", + "puffs": "puffs", + "sprays": "sprays", + "capsules": "capsules", + "pieces": "pieces", + "other": "other" + } + }, + "naturalLanguage": { + "button": "✨ Describe it", + "placeholderCopy": "Type the medication in your own words and we will pre-fill the wizard." + } + }, + "step2": { + "oneShot": { + "title": "One-time dose", + "description": "A single appointment — flu shot, vaccine, the last dose of a course." + }, + "recurring": { + "title": "Recurring", + "description": "A medication you take on a schedule, daily or otherwise." + } + }, + "step3": { + "helper": "Pick the pattern that matches how often you take it. Sub-options appear once you choose." + }, + "step4": { + "recap": "Here's the cadence you picked. Tap Back if anything looks wrong.", + "oneShotSkipped": "(skipped — one-time dose)" + }, + "step5": { + "helper": "Add one or more times of day. Reminders fire at each entry.", + "oneShotDate": { + "label": "Date of the single dose", + "helper": "We use this date to schedule the reminder and to log the intake." + } + }, + "step6": { + "helper": "The schedule runs from the start date. Leave the end date open if you take it indefinitely." + }, + "step7": { + "reminders": { + "label": "Reminders on", + "description": "Send a push to your configured channels at every scheduled time." + }, + "summary": { + "title": "Summary", + "cadence": { + "daily": "Every day", + "weekdays": "On selected days of the week", + "weekly": "Once a 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" + }, + "times": "at {times}", + "startsOn": "Starts: {date}", + "endsOn": "Ends: {date}", + "noEndDate": "No end date" + } + }, + "nav": { + "back": "Back", + "next": "Next", + "create": "Create medication" + }, + "errors": { + "submitFailed": "Could not create the medication — please retry.", + "fieldRequired": "Required" + } } }, "titration": { diff --git a/src/components/medications/scheduling/CadencePicker.tsx b/src/components/medications/scheduling/CadencePicker.tsx index 64b498682..6aae641c5 100644 --- a/src/components/medications/scheduling/CadencePicker.tsx +++ b/src/components/medications/scheduling/CadencePicker.tsx @@ -27,7 +27,7 @@ * .kind.everyNMonths — "Every N months on day" * .kind.yearly — "Yearly on date" * .kind.rolling — "Every N days from when I last took it (flexible)" - * .kind.rolling.explainer — "Counts from your last logged intake — pauses if you skip" + * .kind.rollingExplainer — "Counts from your last logged intake — pauses if you skip" * .kind.oneShot — "One-time dose" * .weekdays.label — chip-row aria-label "Days of week" * .weekdays.short.mo|tu|we|th|fr|sa|su — chip abbreviations @@ -401,7 +401,7 @@ function CadenceOption({ className="text-muted-foreground text-xs" data-slot="cadence-rolling-explainer" > - {t(`${i18nPrefix}.kind.rolling.explainer`)} + {t(`${i18nPrefix}.kind.rollingExplainer`)}

)} diff --git a/src/lib/__tests__/i18n-locale-integrity.test.ts b/src/lib/__tests__/i18n-locale-integrity.test.ts index a73a8181f..2b370b686 100644 --- a/src/lib/__tests__/i18n-locale-integrity.test.ts +++ b/src/lib/__tests__/i18n-locale-integrity.test.ts @@ -252,6 +252,12 @@ describe("i18n locale file integrity", () => { "targets.status.normal", "targets.status.optimal", "targets.status.fitness", + // v1.5 medication scheduling — SI-unit abbreviations the wizard + // surfaces in its dose-unit dropdown. The labels are identical + // across every locale (mg / g / ml are universal SI tokens). + "medications.create.wizard.step1.dose.unit.mg", + "medications.create.wizard.step1.dose.unit.g", + "medications.create.wizard.step1.dose.unit.ml", ]); it.each(ALL_LOCALES)("$locale locale has no empty values", ({ path }) => {