logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      渲染预处理 (Render Preprocessing)
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      进阶功能
      使用 Rspack
      使用 BFF
      基础用法
      运行时框架
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页资源加载下一页API 参考

      #路由集成

      插件与 Modern.js 路由系统深度集成,支持语言路径前缀和自动路径重定向。

      #启用路径重定向

      当 localePathRedirect 设置为 true 时,插件会自动在 URL 中添加语言前缀,并处理语言切换时的路径重定向。

      配置:

      i18nPlugin({
        localeDetection: {
          localePathRedirect: true,
          languages: ['zh', 'en'],
          fallbackLanguage: 'en',
          // 可选:忽略某些路由的自动重定向
          ignoreRedirectRoutes: ['/api', '/admin'],
        },
      });

      #忽略重定向的路由

      某些路由(如 API 路由、静态资源等)不需要语言前缀,可以使用 ignoreRedirectRoutes 配置来忽略这些路由的自动重定向:

      i18nPlugin({
        localeDetection: {
          localePathRedirect: true,
          languages: ['zh', 'en'],
          fallbackLanguage: 'en',
          // 字符串数组:支持精确匹配和前缀匹配
          ignoreRedirectRoutes: ['/api', '/admin', '/static'],
          // 或使用函数进行更灵活的判断
          ignoreRedirectRoutes: pathname => {
            return pathname.startsWith('/api') || pathname.startsWith('/admin');
          },
        },
      });

      更多详情请参考语言检测文档中的 ignoreRedirectRoutes 配置说明。

      #路由配置

      启用路径重定向后,需要在路由配置中添加 :lang 动态参数。

      #约定式路由

      使用约定式路由时,需要在 routes/ 目录下创建 [lang] 目录来表示语言参数:

      routes/
      ├── [lang]/
      │   ├── layout.tsx    # 布局组件
      │   ├── page.tsx      # 首页
      │   ├── about/
      │   │   └── page.tsx  # About 页面
      │   └── contact/
      │       └── page.tsx  # Contact 页面

      routes/[lang]/layout.tsx:

      import { Outlet } from '@modern-js/runtime/router';
      
      export default function Layout() {
        return <Outlet />;
      }

      routes/[lang]/page.tsx:

      export default function Home() {
        return <div>Home</div>;
      }

      routes/[lang]/about/page.tsx:

      export default function About() {
        return <div>About</div>;
      }

      routes/[lang]/contact/page.tsx:

      export default function Contact() {
        return <div>Contact</div>;
      }

      生成的路由结构:

      /:lang          → Home 页面
      /:lang/about    → About 页面
      /:lang/contact  → Contact 页面

      访问 / 或 /about 时,会自动重定向到 /en 或 /en/about(使用默认语言)。

      #自定义路由

      如果使用自定义路由(modern.routes.ts),需要在路由配置中添加 :lang 动态参数:

      import {
        BrowserRouter,
        Route,
        Routes,
        Outlet,
      } from '@modern-js/runtime/router';
      
      function App() {
        return (
          <BrowserRouter>
            <Routes>
              {/* 添加 :lang 参数 */}
              <Route path=":lang" element={<Outlet />}>
                <Route index element={<Home />} />
                <Route path="about" element={<About />} />
                <Route path="contact" element={<Contact />} />
              </Route>
            </Routes>
          </BrowserRouter>
        );
      }
      Info

      约定式路由会自动根据文件结构生成对应的路由,推荐使用约定式路由。只有在需要特殊路由控制时才使用自定义路由。

      #I18nLink 组件

      I18nLink 组件是 @modern-js/plugin-i18n 提供的链接组件,会自动在路径前添加当前语言前缀。

      #基本用法

      import { I18nLink } from '@modern-js/plugin-i18n/runtime';
      
      function Navigation() {
        return (
          <nav>
            <I18nLink to="/">首页</I18nLink>
            <I18nLink to="/about">关于</I18nLink>
            <I18nLink to="/contact">联系</I18nLink>
          </nav>
        );
      }

      当前语言为 en 时:

      • <I18nLink to="/"> → 实际链接:/en
      • <I18nLink to="/about"> → 实际链接:/en/about

      当前语言为 zh 时:

      • <I18nLink to="/"> → 实际链接:/zh
      • <I18nLink to="/about"> → 实际链接:/zh/about

      #自动添加语言前缀

      I18nLink 会自动处理语言前缀,无需手动添加:

      // ✅ 正确:不需要手动添加语言前缀
      <I18nLink to="/about">关于</I18nLink>
      
      // ❌ 错误:不要手动添加语言前缀
      <I18nLink to="/en/about">关于</I18nLink>

      #Props 说明

      I18nLink 接受所有 Link 组件的 props,并额外支持:

      interface I18nLinkProps {
        /** 目标路径(不需要包含语言前缀) */
        to: string;
        /** 子元素 */
        children: React.ReactNode;
        /** 其他 Link 组件的 props */
        [key: string]: any;
      }

      示例:

      <I18nLink to="/about" replace>
        关于
      </I18nLink>
      
      <I18nLink to="/contact" state={{ from: 'home' }}>
        联系
      </I18nLink>