Localization Provider
Defines the locale to use in the temporal components.
View as Markdown| L | M | M | J | V | S | D |
|---|---|---|---|---|---|---|
'use client';
import * as React from 'react';
import { format } from 'date-fns/format';
import { fr } from 'date-fns/locale/fr';
import { LocalizationProvider } from '@base-ui/react/localization-provider';
import { Calendar } from '@base-ui/react/calendar';
import { ChevronLeft, ChevronRight } from 'lucide-react';
import styles from './calendar.module.css';
export default function ExampleCalendar() {
return (
<LocalizationProvider temporalLocale={fr}>
<MyCalendar />
</LocalizationProvider>
);
}
function MyCalendar() {
return (
<Calendar.Root className={styles.Root}>
{({ visibleDate }) => (
<React.Fragment>
<header className={styles.Header}>
<Calendar.DecrementMonth className={styles.DecrementMonth}>
<ChevronLeft />
</Calendar.DecrementMonth>
<span className={styles.HeaderLabel}>
{format(visibleDate, 'MMMM yyyy', { locale: fr })}
</span>
<Calendar.IncrementMonth className={styles.IncrementMonth}>
<ChevronRight />
</Calendar.IncrementMonth>
</header>
<Calendar.DayGrid className={styles.DayGrid}>
<Calendar.DayGridHeader className={styles.DayGridHeader}>
<Calendar.DayGridHeaderRow className={styles.DayGridHeaderRow}>
{(day) => (
<Calendar.DayGridHeaderCell
value={day}
key={day.getTime()}
className={styles.DayGridHeaderCell}
/>
)}
</Calendar.DayGridHeaderRow>
</Calendar.DayGridHeader>
<Calendar.DayGridBody className={styles.DayGridBody}>
{(week) => (
<Calendar.DayGridRow
value={week}
key={week.getTime()}
className={styles.DayGridRow}
>
{(day) => (
<Calendar.DayGridCell
value={day}
key={day.getTime()}
className={styles.DayGridCell}
>
<Calendar.DayButton className={styles.DayButton} />
</Calendar.DayGridCell>
)}
</Calendar.DayGridRow>
)}
</Calendar.DayGridBody>
</Calendar.DayGrid>
</React.Fragment>
)}
</Calendar.Root>
);
}
Anatomy
Import the component plus the date-fns library locale and wrap them around your app.
If every temporal component in your app shares the same locale, you should use the provider once at the root of your application.
Anatomy
import { fr } from 'date-fns/locale/fr';
import { LocalizationProvider } from '@base-ui/react/localization-provider';
<LocalizationProvider temporalLocale={fr}>
{/* Your app or a group of components */}
</LocalizationProvider>Examples
Nesting locales
The <LocalizationProvider> can be nested to change the locale for a part of the application.
This could be useful when you need some temporal components in your application to use a different locale than the rest of your app.
| L | M | M | J | V | S | D |
|---|---|---|---|---|---|---|
| 周 | 周 | 周 | 周 | 周 | 周 | 周 |
|---|---|---|---|---|---|---|
'use client';
import * as React from 'react';
import { format } from 'date-fns/format';
import { fr, zhCN } from 'date-fns/locale';
import { LocalizationProvider, useTemporalLocale } from '@base-ui/react/localization-provider';
import { Calendar } from '@base-ui/react/calendar';
import { ChevronLeft, ChevronRight } from 'lucide-react';
import styles from './calendar.module.css';
import indexStyles from './index.module.css';
export default function NestedLocalizedCalendars() {
return (
<div className={indexStyles.Wrapper}>
<LocalizationProvider temporalLocale={fr}>
<LocalizedCalendar />
<LocalizationProvider temporalLocale={zhCN}>
<LocalizedCalendar />
</LocalizationProvider>
</LocalizationProvider>
</div>
);
}
function LocalizedCalendar() {
const locale = useTemporalLocale();
return (
<Calendar.Root className={styles.Root}>
{({ visibleDate }) => (
<React.Fragment>
<header className={styles.Header}>
<Calendar.DecrementMonth className={styles.DecrementMonth}>
<ChevronLeft />
</Calendar.DecrementMonth>
<span className={styles.HeaderLabel}>
{format(visibleDate, 'MMMM yyyy', { locale })}
</span>
<Calendar.IncrementMonth className={styles.IncrementMonth}>
<ChevronRight />
</Calendar.IncrementMonth>
</header>
<Calendar.DayGrid className={styles.DayGrid}>
<Calendar.DayGridHeader className={styles.DayGridHeader}>
<Calendar.DayGridHeaderRow className={styles.DayGridHeaderRow}>
{(day) => (
<Calendar.DayGridHeaderCell
value={day}
key={day.getTime()}
className={styles.DayGridHeaderCell}
/>
)}
</Calendar.DayGridHeaderRow>
</Calendar.DayGridHeader>
<Calendar.DayGridBody className={styles.DayGridBody}>
{(week) => (
<Calendar.DayGridRow
value={week}
key={week.getTime()}
className={styles.DayGridRow}
>
{(day) => (
<Calendar.DayGridCell
value={day}
key={day.getTime()}
className={styles.DayGridCell}
>
<Calendar.DayButton className={styles.DayButton} />
</Calendar.DayGridCell>
)}
</Calendar.DayGridRow>
)}
</Calendar.DayGridBody>
</Calendar.DayGrid>
</React.Fragment>
)}
</Calendar.Root>
);
}
Start of week
Start of the week is handled by the date library locale. You can override the default start of the week by spreading the locale and setting options.weekStartsOn to a value between 0 (Sunday) and 6 (Saturday).
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
'use client';
import * as React from 'react';
import { format } from 'date-fns/format';
import { enUS } from 'date-fns/locale/en-US';
import type { Day } from 'date-fns';
import { LocalizationProvider } from '@base-ui/react/localization-provider';
import { Calendar } from '@base-ui/react/calendar';
import { ChevronLeft, ChevronRight } from 'lucide-react';
import styles from './calendar.module.css';
import indexStyles from './index.module.css';
const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
export default function StartOfWeekCalendar() {
const [weekStartsOn, setWeekStartsOn] = React.useState<Day>(1);
const locale = React.useMemo(
() => ({ ...enUS, options: { ...enUS.options, weekStartsOn } }),
[weekStartsOn],
);
return (
<div className={indexStyles.Wrapper}>
<label className={indexStyles.Label}>
First day of the week
<select
className={indexStyles.Select}
value={weekStartsOn}
onChange={(event) => setWeekStartsOn(Number(event.target.value) as Day)}
>
{dayNames.map((day, index) => (
<option key={day} value={index}>
{day}
</option>
))}
</select>
</label>
<LocalizationProvider temporalLocale={locale}>
<Calendar.Root className={styles.Root}>
{({ visibleDate }) => (
<React.Fragment>
<header className={styles.Header}>
<Calendar.DecrementMonth className={styles.DecrementMonth}>
<ChevronLeft />
</Calendar.DecrementMonth>
<span className={styles.HeaderLabel}>{format(visibleDate, 'MMMM yyyy')}</span>
<Calendar.IncrementMonth className={styles.IncrementMonth}>
<ChevronRight />
</Calendar.IncrementMonth>
</header>
<Calendar.DayGrid className={styles.DayGrid}>
<Calendar.DayGridHeader className={styles.DayGridHeader}>
<Calendar.DayGridHeaderRow className={styles.DayGridHeaderRow}>
{(day) => (
<Calendar.DayGridHeaderCell
value={day}
key={day.getTime()}
className={styles.DayGridHeaderCell}
/>
)}
</Calendar.DayGridHeaderRow>
</Calendar.DayGridHeader>
<Calendar.DayGridBody className={styles.DayGridBody}>
{(week) => (
<Calendar.DayGridRow
value={week}
key={week.getTime()}
className={styles.DayGridRow}
>
{(day) => (
<Calendar.DayGridCell
value={day}
key={day.getTime()}
className={styles.DayGridCell}
>
<Calendar.DayButton className={styles.DayButton} />
</Calendar.DayGridCell>
)}
</Calendar.DayGridRow>
)}
</Calendar.DayGridBody>
</Calendar.DayGrid>
</React.Fragment>
)}
</Calendar.Root>
</LocalizationProvider>
</div>
);
}
API reference
Prop
Type
Default
temporalLocaleLocaleen-US
- Name
- Description
The locale to use in temporal components.
- Type
Locale | undefined- Default
en-US
childrenReactNode—
- Name
- Type
React.ReactNode