diff --git a/src/components/day/day-date-picker.tsx b/src/components/day/day-date-picker.tsx
index eda77a736..b6c61ba0e 100644
--- a/src/components/day/day-date-picker.tsx
+++ b/src/components/day/day-date-picker.tsx
@@ -5,7 +5,7 @@ import { useRef, useState } from "react";
import { Button } from "@/components/ui/button";
import { Calendar, CalendarDayButton } from "@/components/ui/calendar";
import { ResponsiveSheet } from "@/components/ui/responsive-sheet";
-import { resolveDateFnsLocale } from "@/components/ui/date-field";
+import { resolveDateFnsLocale } from "@/components/ui/calendar-locale";
import {
Popover,
PopoverContent,
diff --git a/src/components/ui/calendar-locale.ts b/src/components/ui/calendar-locale.ts
new file mode 100644
index 000000000..138686267
--- /dev/null
+++ b/src/components/ui/calendar-locale.ts
@@ -0,0 +1,29 @@
+import { de, enUS, es, fr, it, ko, pl } from "date-fns/locale";
+import type { Locale as DateFnsLocale } from "date-fns";
+
+import type { Locale } from "@/lib/i18n/config";
+
+/**
+ * Map the app locale → the date-fns locale so the calendar's month / weekday
+ * names match the UI language. Defaults to enUS for anything unmapped.
+ * Imported only by the calendars, which load on demand, so the seven
+ * locales never ride a page's first load.
+ */
+export function resolveDateFnsLocale(locale: Locale): DateFnsLocale {
+ switch (locale) {
+ case "de":
+ return de;
+ case "es":
+ return es;
+ case "fr":
+ return fr;
+ case "it":
+ return it;
+ case "pl":
+ return pl;
+ case "ko":
+ return ko;
+ default:
+ return enUS;
+ }
+}
diff --git a/src/components/ui/date-field-calendar.tsx b/src/components/ui/date-field-calendar.tsx
new file mode 100644
index 000000000..9ee496761
--- /dev/null
+++ b/src/components/ui/date-field-calendar.tsx
@@ -0,0 +1,40 @@
+"use client";
+
+import type { Matcher } from "react-day-picker";
+
+import { Calendar } from "@/components/ui/calendar";
+import type { Locale } from "@/lib/i18n/config";
+
+import { resolveDateFnsLocale } from "./calendar-locale";
+
+/**
+ * `DateField`'s single-day calendar, in its own module so the field can
+ * load it on demand (`date-field.tsx`). Takes the app locale and resolves
+ * the date-fns one here, beside react-day-picker, so neither rides the
+ * field.
+ */
+export function DateFieldCalendar({
+ appLocale,
+ selected,
+ onSelect,
+ disabled,
+ defaultMonth,
+}: {
+ appLocale: Locale;
+ selected: Date | undefined;
+ onSelect: (date: Date | undefined) => void;
+ disabled: Matcher[] | undefined;
+ defaultMonth: Date;
+}) {
+ return (
+