i18n(meds): localise the v1.5 scheduling surface across six locales

Populates messages/{de,en}.json with native copy for every key the
new picker primitives, the wizard, the edit-form refactor, and the
plain-language summary consume. The remaining four locales ship the
English fallback for v1.5.0; native polish lands in a follow-up.

CadencePicker rolling-explainer key flipped to `kind.rollingExplainer`
so the i18n resolver can return both the rolling label and its
explainer (the original `kind.rolling.explainer` path collided with
the `kind.rolling` string leaf — JSON cannot host both shapes on the
same prefix). Adds the dose-unit SI tokens (mg / g / ml) to the
placeholder-allowlist in the locale-integrity guard since those
labels are intentionally identical across every locale.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc-André BombeckandClaude Opus 4.7 committed 2026-05-28 09:31:15 +02:00
1 parent 1bdbc2106f
commit 030e97906c
8 files changed
+1202 -2

No files matched your search

+199
View File
@@ -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": {
+199
View File
@@ -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": {
+199
View File
@@ -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": {
+199
View File
@@ -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": {
+199
View File
@@ -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": {
+199
View File
@@ -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": {
@@ -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`)}
</p>
</div>
)}
@@ -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 }) => {