Localization & Timezones
Set the display timezone, 12h/24h clock, week start day, and translate UI labels in the dash-mui-scheduler calendar.
---
.. llms_copy::Localization & Timezones
.. toc::
Localization & Timezones
The scheduler can render the same events for users in different timezones and locales without ever touching the event data itself. Four knobs cover almost everything:
displayTimezone— which timezone the grid is drawn in (render-only).preferences.ampm— 12-hour vs 24-hour clock.preferences.weekStartsOn— which weekday a week begins on.localeText— overrides for individual UI label strings.
The most important idea on this page is the data boundary: an event's start / end are ISO strings that you own. Localization changes how those times are *displayed*, not what they *are*.
Display timezone
displayTimezone controls the timezone the calendar grid renders in. It accepts an IANA timezone name like "America/New_York" or "Asia/Tokyo", or one of the special values:
| Value | Meaning | | --- | --- | | "default" | The component's default behavior (the initial value) | | "UTC" | Render everything in UTC | | "locale" | Use the browser's local timezone | | IANA name | Render in that specific zone, e.g. "Europe/Paris" |
.. admonition::displayTimezone is render-only :color: yellow
Changing displayTimezone only changes where event blocks are drawn on the grid. It does not rewrite your events. The ISO strings you pass in stay exactly as they are, and the array the component writes back keeps the same wall-clock / UTC strings. Think of it as a viewport over fixed instants.
How the strings are interpreted matters here:
"2024-01-17T18:00:00Z"— the trailingZmeans UTC. It refers to one fixed
instant, so it lands at different wall-clock positions in New York vs Tokyo.
"2024-01-15T09:00:00"— noZis a wall-clock time with no zone attached.
The example below renders one shared list of events in two calendars — the only difference is displayTimezone. Note how the "Release window (UTC)" event (which uses a Z suffix) shifts between the two grids, while the rest stay put.
.. exec::docs.localization.timezones
```python
File: docs/localization/timezones.py
from dash import html import dash_mantine_components as dmc
import dash_mui_scheduler as dms
One shared set of events. Each start/end is an ISO string.
These carry no trailing "Z", so they are wall-clock times — the same
instant the component then re-renders in whatever displayTimezone is set.
events = [ { "id": "1", "title": "Morning sync", "start": "2024-01-15T09:00:00", "end": "2024-01-15T10:00:00", "color": "blue", }, { "id": "2", "title": "Design review", "start": "2024-01-16T13:00:00", "end": "2024-01-16T14:30:00", "color": "purple", }, { "id": "3", "title": "Release window (UTC)", "start": "2024-01-17T18:00:00Z", "end": "2024-01-17T19:00:00Z", "color": "green", }, ]
Two calendars, identical events, different displayTimezone.
displayTimezone is render-only: it shifts where blocks appear on the grid,
but the underlying event data (the ISO strings above) never changes.
component = dmc.Stack( [ dmc.Text("New York (America/New_York)", fw=600, size="sm"), dms.EventCalendar( id="localization-tz-ny-cal", events=events, defaultView="week", defaultVisibleDate="2024-01-15", displayTimezone="America/New_York", height=560, ), dmc.Text("Tokyo (Asia/Tokyo)", fw=600, size="sm"), dms.EventCalendar( id="localization-tz-tokyo-cal", events=events, defaultView="week", defaultVisibleDate="2024-01-15", displayTimezone="Asia/Tokyo", height=560, ), ], gap="sm", ) ```
12-hour vs 24-hour clock
The clock format lives in preferences.ampm:
ampm=True→ 12-hour clock (2:00 PM).ampm=False→ 24-hour clock (14:00).
Set it via defaultPreferences (uncontrolled, initial value) or preferences (controlled IN+OUT, also readable in a callback). Users can flip it themselves from the preferences menu unless you disable that toggle. See the [Preferences page](/preferences) for the full preferences dict and menu config.
Week start
preferences.weekStartsOn is an integer from 0 to 6 that picks the first day of the week:
| Value | Day | | --- | --- | | 0 | Sunday | | 1 | Monday | | 2 | Tuesday | | 3 | Wednesday | | 4 | Thursday | | 5 | Friday | | 6 | Saturday |
The example below seeds a Monday-first, 24-hour calendar with week numbers via defaultPreferences. Because these are preferences, they apply to the week, month, and agenda layouts consistently.
.. exec::docs.localization.week_start
```python
File: docs/localization/week_start.py
from dash import html
import dash_mui_scheduler as dms
events = [ { "id": "1", "title": "Sprint planning", "start": "2024-01-15T09:00:00", "end": "2024-01-15T10:30:00", "color": "indigo", }, { "id": "2", "title": "Saturday demo", "start": "2024-01-20T11:00:00", "end": "2024-01-20T12:00:00", "color": "amber", }, { "id": "3", "title": "Sunday on-call", "start": "2024-01-21T08:00:00", "end": "2024-01-21T09:00:00", "color": "red", }, ]
weekStartsOn (0 = Sunday … 6 = Saturday) and ampm live inside preferences.
Here defaultPreferences seeds a Monday-first, 24-hour calendar on load.
component = html.Div( dms.EventCalendar( id="localization-week-start-cal", events=events, defaultView="week", defaultVisibleDate="2024-01-15", defaultPreferences={ "weekStartsOn": 1, "ampm": False, "showWeekends": True, "showWeekNumber": True, }, height=560, ) ) ```
.. admonition::Where ampm and weekStartsOn live :color: blue
Both ampm and weekStartsOn are keys *inside* the preferences dict — there are no top-level ampm / weekStartsOn props. Pass them through defaultPreferences={...} or the controlled preferences={...}.
Label overrides
localeText is a dict of overrides for the calendar's built-in UI label strings — button captions, menu items, placeholders, and so on. Pass it as a dict where each value replaces the default text for that key:
``python dms.EventCalendar( id="my-cal", events=events, localeText={ "today": "Aujourd'hui", "week": "Semaine", "month": "Mois", }, ) ``
.. admonition::Only string-valued labels are settable from Python :color: yellow
The MUI X Scheduler's locale text includes both plain strings and *functions* (for example, labels that format a date range). Because props cross the Dash boundary as JSON, only the string-valued keys can be overridden from Python — function-valued entries can't be passed and will fall back to their defaults. Use localeText for static caption text, not for dynamic formatters.
For full locale coverage (including the function-valued formatters), you would provide a translation at the React/JS layer. From Dash, localeText is best treated as a way to retitle the static buttons and menu items.
Timezones and the data you store
Because displayTimezone never edits your events, your storage stays predictable:
- Store events as ISO strings. Add a
Z(or an explicit offset) when a value
is a fixed UTC instant; omit it when it's a floating wall-clock time.
- An event may also carry its own
timezone(IANA) key in its dict to anchor it
to a specific zone independent of the display timezone.
- When the component writes
eventsback after a drag/create/resize, it returns
ISO strings in the same shape — so a round-trip through Dash doesn't silently re-localize your data.
.. admonition::Beta :color: blue
The MUI X Scheduler is in beta. Timezone and locale behavior can change between releases; verify edge cases (DST boundaries, cross-zone all-day events) against your target version.
Component reference
.. kwargs::dash_mui_scheduler.EventCalendar
---
*Source: /localization*
Note for AI agents: This is the static, prerendered view of an interactive Dash application served because we detected a non-JS user agent. Full prose docs:
- /localization/llms.txt — LLM-friendly documentation
- /sitemap.xml
- /robots.txt