Polish the copy the audit flagged across all six locales

- Singular variants for the bulk-delete toast and confirm dialog
  (measurements + mood); the call sites branch on a count of one.
- Consent confirm buttons shortened so they no longer overflow the
  small button on phones.
- Workouts empty-state CTA is source-neutral instead of assuming an
  iPhone with Apple Health.
- "Pills" is no longer a navigation term in a medication app: DE says
  Navigations-Chips, EN chips, PL chipy; ES/FR/IT subtitles align with
  their own established terms.
- Health-score insufficient hint drops the translationese and fixes the
  pronoun.
- Side-effect tag helper uses the established Stimmungs-Tags term.
- Success toasts that are single fragments lose the terminal period
  (37 keys, all locales).
- Integration pill parked state short enough to survive truncation.
- The iPhone-managed reminder badge carries a short label; the full
  sentence moved to a helper line below instead of clipping mid-word.
This commit is contained in:
Marc-André Bombeck committed 2026-08-14 05:02:49 +02:00
1 parent 1cde353965
commit 487eb6970c
10 files changed
+371 -300

No files matched your search

@@ -625,7 +625,9 @@ export function MeasurementList({
await refetchInactiveDailyReads(queryClient);
clearSelection();
toast.success(
t("measurements.bulkDeleteSuccess", { count: String(deleted) }),
deleted === 1
? t("measurements.bulkDeleteSuccessOne")
: t("measurements.bulkDeleteSuccess", { count: String(deleted) }),
{
action: {
label: t("common.undo"),
@@ -1462,12 +1464,20 @@ export function MeasurementList({
onClear={clearSelection}
onConfirmDelete={onConfirmBulkDelete}
isDeleting={bulkDeleteMutation.isPending}
confirmTitle={t("measurements.bulkDeleteConfirmTitle", {
count: String(selectedOnPage),
})}
confirmBody={t("measurements.bulkDeleteConfirmBody", {
count: String(selectedOnPage),
})}
confirmTitle={
selectedOnPage === 1
? t("measurements.bulkDeleteConfirmTitleOne")
: t("measurements.bulkDeleteConfirmTitle", {
count: String(selectedOnPage),
})
}
confirmBody={
selectedOnPage === 1
? t("measurements.bulkDeleteConfirmBodyOne")
: t("measurements.bulkDeleteConfirmBody", {
count: String(selectedOnPage),
})
}
/>
{/* Pagination */}
@@ -150,14 +150,20 @@ export function NotificationsBody({
{clientManaged ? (
// v1.5.5 §9.6 — iPhone-managed path. The switch is hidden;
// the read-only chip tells the user where the toggle lives.
<p
className="text-foreground text-sm"
// The badge carries a short label only (a full sentence used to
// hard-clip mid-word in the nowrap badge); the sentence moved to
// the helper line below.
<div
className="space-y-1"
data-slot="notifications-client-managed-chip"
>
<Badge variant="outline" className="font-normal">
{t("medications.detail.notifications.clientManagedChip")}
</Badge>
</p>
<p className="text-muted-foreground text-sm">
{t("medications.detail.notifications.clientManagedHint")}
</p>
</div>
) : (
<label
htmlFor={SWITCH_ID}
+24 -11
View File
@@ -394,12 +394,17 @@ export function MoodList({ onAddFirst }: MoodListProps = {}) {
await invalidateKeys(queryClient, moodDependentKeys);
await refetchInactiveDailyReads(queryClient);
clearSelection();
toast.success(t("mood.bulkDeleteSuccess", { count: String(deleted) }), {
action: {
label: t("common.undo"),
onClick: () => void restoreEntries(ids),
toast.success(
deleted === 1
? t("mood.bulkDeleteSuccessOne")
: t("mood.bulkDeleteSuccess", { count: String(deleted) }),
{
action: {
label: t("common.undo"),
onClick: () => void restoreEntries(ids),
},
},
});
);
},
onError: () => {
toast.error(t("mood.bulkDeleteError"));
@@ -955,12 +960,20 @@ export function MoodList({ onAddFirst }: MoodListProps = {}) {
onClear={clearSelection}
onConfirmDelete={onConfirmBulkDelete}
isDeleting={bulkDeleteMutation.isPending}
confirmTitle={t("mood.bulkDeleteConfirmTitle", {
count: String(selectedOnPage),
})}
confirmBody={t("mood.bulkDeleteConfirmBody", {
count: String(selectedOnPage),
})}
confirmTitle={
selectedOnPage === 1
? t("mood.bulkDeleteConfirmTitleOne")
: t("mood.bulkDeleteConfirmTitle", {
count: String(selectedOnPage),
})
}
confirmBody={
selectedOnPage === 1
? t("mood.bulkDeleteConfirmBodyOne")
: t("mood.bulkDeleteConfirmBody", {
count: String(selectedOnPage),
})
}
/>
{/* Pagination */}
@@ -62,7 +62,7 @@ describe("OAuthProviderCard — parked + test + data-link parity", () => {
expect(html).toContain('data-state="parked"');
expect(html).toContain('data-testid="polar-parked-banner"');
expect(html).toContain('data-testid="polar-resume-button"');
expect(html).toContain("reconnect manually");
expect(html).toContain("Paused — reconnect");
// The parked banner uses the same warning treatment as the WHOOP card.
expect(html).toContain("border-warning/30 bg-warning/10");
});