You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LocalizationProvider中动态设置adapterLocale适配当前区域?

动态适配系统/浏览器区域设置修改AdapterDayjs的locale

要让adapterLocale自动适配当前用户的区域语言,你可以通过以下步骤实现:

  • 获取当前区域语言:利用浏览器提供的navigator.language(或navigator.languages[0],优先取用户设置的多语言列表第一项)获取当前的区域标识,比如de、fr、zh-CN等。
  • 动态导入对应Dayjs locale:避免一次性导入所有语言包造成体积冗余,根据获取到的区域标识动态导入对应的Dayjs locale模块。
  • 注册并应用locale:将导入的locale注册到Dayjs,再把区域标识传给LocalizationProvider的adapterLocale属性。

完整示例代码

import { useState, useEffect } from 'react';
import { LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import dayjs from 'dayjs';

const LocaleAwareDateProvider = ({ children }) => {
  const [adapterLocale, setAdapterLocale] = useState('en'); // 默认 fallback 为英语

  useEffect(() => {
    // 获取浏览器首选区域语言
    const userLocale = navigator.languages?.[0] || navigator.language || 'en';
    // 提取语言代码(比如从 zh-CN 中取出 zh),适配Dayjs的locale命名规则
    const baseLocale = userLocale.split('-')[0];

    // 动态导入并注册对应的Dayjs locale
    import(`dayjs/locale/${baseLocale}`)
      .then((localeModule) => {
        dayjs.locale(baseLocale);
        setAdapterLocale(baseLocale);
      })
      .catch(() => {
        // 若当前语言不被Dayjs支持, fallback到英语
        dayjs.locale('en');
        setAdapterLocale('en');
      });
  }, []);

  return (
    <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={adapterLocale}>
      {children}
    </LocalizationProvider>
  );
};

// 使用方式
const App = () => {
  return (
    <LocaleAwareDateProvider>
      {/* 你的应用组件 */}
    </LocaleAwareDateProvider>
  );
};

export default App;

关键说明

  • 区域语言提取:navigator.language返回的可能是带地区的标识(如zh-CN),而Dayjs的locale文件大多是纯语言代码(如zh),所以通过split('-')[0]提取基础语言代码,适配Dayjs的命名规则。
  • 动态导入优化:动态导入只会加载用户当前区域对应的语言包,有效减少打包体积。
  • 错误处理:如果用户的区域语言没有对应的Dayjs locale包,会自动 fallback到英语,避免报错。

内容的提问来源于stack exchange,提问作者Osman Mamun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:42:09