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
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页基础概念下一页配置说明

      #快速开始

      本指南将帮助你快速在 Modern.js 项目中集成国际化功能。

      #安装插件

      首先,安装必要的依赖:

      pnpm add @modern-js/plugin-i18n i18next react-i18next
      Info

      i18next 和 react-i18next 是 peer dependencies,需要手动安装。

      #基础配置

      #在 modern.config.ts 中注册插件

      import { appTools, defineConfig } from '@modern-js/app-tools';
      import { i18nPlugin } from '@modern-js/plugin-i18n';
      
      export default defineConfig({
        server: {
          publicDir: './locales', // 必需:指定资源文件目录
        },
        plugins: [
          appTools(),
          i18nPlugin({
            localeDetection: {
              localePathRedirect: true, // 启用路径重定向
              languages: ['zh', 'en'], // 支持的语言列表
              fallbackLanguage: 'en', // 默认语言
            },
            backend: {
              enabled: true, // 启用后端资源加载
              // loadPath 默认为 '/locales/{{lng}}/{{ns}}.json',通常无需修改
              // 注意:你也可以省略 'enabled',只需配置 'loadPath' 或 'addPath',
              // 或者完全省略 backend 配置,让插件自动检测 locales 目录
            },
          }),
        ],
      });
      Info

      server.publicDir 是必需配置,用于指定资源文件的实际存放位置。即使使用默认的 loadPath 路径,也需要配置此项。

      #在 src/modern.runtime.ts 中配置运行时选项

      创建 src/modern.runtime.ts 文件并配置 i18n 运行时选项:

      import { defineRuntimeConfig } from '@modern-js/runtime';
      import i18next from 'i18next';
      
      // 建议创建一个新的 i18next 实例,避免使用全局默认实例
      const i18nInstance = i18next.createInstance();
      
      export default defineRuntimeConfig({
        i18n: {
          i18nInstance: i18nInstance,
          initOptions: {
            fallbackLng: 'en',
            supportedLngs: ['zh', 'en'],
          },
        },
      });
      Info

      modern.runtime.ts 是运行时配置文件,用于配置 i18next 的初始化选项。即使是最基础的配置,也建议创建此文件以确保插件正常工作。

      建议使用 i18next.createInstance() 创建一个新的实例,而不是直接使用默认导出的 i18next,这样可以避免全局状态污染,并确保每个应用都有独立的 i18n 实例。

      #创建语言资源文件

      在项目根目录创建 locales 文件夹,并按语言组织资源文件:

      locales/
      ├── en/
      │   └── translation.json
      └── zh/
          └── translation.json

      locales/en/translation.json:

      {
        "hello": "Hello",
        "world": "World",
        "welcome": "Welcome to Modern.js"
      }

      locales/zh/translation.json:

      {
        "hello": "你好",
        "world": "世界",
        "welcome": "欢迎使用 Modern.js"
      }

      #在组件中使用

      import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
      import { useTranslation } from 'react-i18next';
      
      function App() {
        const { language, changeLanguage, supportedLanguages } = useModernI18n();
        const { t } = useTranslation();
      
        return (
          <div>
            <h1>{t('welcome')}</h1>
            <p>当前语言: {language}</p>
            <div>
              {supportedLanguages.map(lang => (
                <button
                  key={lang}
                  onClick={() => changeLanguage(lang)}
                  disabled={lang === language}
                >
                  {lang}
                </button>
              ))}
            </div>
          </div>
        );
      }
      
      export default App;

      #下一步

      • 了解详细的配置说明
      • 学习语言检测的多种方式
      • 查看资源加载的配置选项