跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端国际化实战:i18next 与 react-intl 配置指南

前端国际化的重要性,对比了硬编码文本的错误做法。详细讲解了使用 i18next 和 react-intl 库进行多语言配置的代码示例,并展示了日期和数字格式化的处理方法,帮助开发者构建支持全球用户的国际化应用。

魔尊发布于 2026/4/6更新于 2026/10/22112 浏览

前端国际化实战:i18next 与 react-intl 配置指南

背景

如果应用仅支持单一语言,将难以拓展海外市场。

对于前端开发者而言,构建支持多语言的应用是全球化产品的必要步骤。硬编码文本会导致维护困难且无法扩展。

为什么需要国际化

最近看到一个项目想拓展海外市场,但所有文本都是硬编码在代码里。这限制了应用的适用范围。

硬编码的问题

// 反面教材:硬编码文本
function App() {
  return (
    <div>
      <h1>欢迎来到我的网站</h1>
      <p>这是一个示例应用</p>
      <button>点击我</button>
      <div>
        <h2>产品列表</h2>
        <ul>
          <li>产品 1</li>
          <li>产品 2</li>
          <li>产品 3</li>
        </ul>
      </div>
    </div>
  );
}
export default App;

问题分析: 这种硬编码方式导致维护困难且无法扩展。

推荐方案

1. i18next

// 正确姿势:i18next
// 1. 配置
// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

const resources = {
  zh: {
    translation: {
      welcome: '欢迎来到我的网站',
      description: '这是一个示例应用',
      button: '点击我',
      products: '产品列表',
      product1: '产品 1',
      product2: '产品 2',
      product3: '产品 3'
    }
  },
  en: {
    translation: {
      welcome: 'Welcome to my website',
      description: 'This is a sample application',
      button: 'Click me',
      products: 'Product List',
      product1: 'Product 1',
      product2: 'Product 2',
      product3: 'Product 3'
    }
  }
};

i18n
  .use(initReactI18next)
  .init({
    resources,
    lng: 'zh',
    fallbackLng: 'en',
    interpolation: {
      escapeValue: false
    }
  });

export default i18n;

// 2. 使用
// App.jsx
import React from 'react';
import { useTranslation } from 'react-i18next';

function App() {
  const { t, i18n } = useTranslation();
  const changeLanguage = (lng) => {
    i18n.changeLanguage(lng);
  };
  return (
    <div>
      <div>
        <button onClick={() => changeLanguage('zh')}>中文</button>
        <button onClick={() => changeLanguage('en')}>English</button>
      </div>
      <h1>{t('welcome')}</h1>
      <p>{t('description')}</p>
      <button>{t('button')}</button>
      <div>
        <h2>{t('products')}</h2>
        <ul>
          <li>{t('product1')}</li>
          <li>{t('product2')}</li>
          <li>{t('product3')}</li>
        </ul>
      </div>
    </div>
  );
}
export default App;

// 3. 入口文件
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './i18n';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

2. react-intl

// 正确姿势:react-intl
// 1. 配置
// App.jsx
import React from 'react';
import { IntlProvider, FormattedMessage } from 'react-intl';

const zhMessages = {
  welcome: '欢迎来到我的网站',
  description: '这是一个示例应用',
  button: '点击我',
  products: '产品列表',
  product1: '产品 1',
  product2: '产品 2',
  product3: '产品 3'
};

const enMessages = {
  welcome: 'Welcome to my website',
  description: 'This is a sample application',
  button: 'Click me',
  products: 'Product List',
  product1: 'Product 1',
  product2: 'Product 2',
  product3: 'Product 3'
};

function App() {
  const [locale, setLocale] = React.useState('zh');
  const messages = locale === 'zh' ? zhMessages : enMessages;
  return (
    <IntlProvider locale={locale} messages={messages}>
      <div>
        <div>
          <button onClick={() => setLocale('zh')}>中文</button>
          <button onClick={() => setLocale('en')}>English</button>
        </div>
        <h1><FormattedMessage id="welcome" /></h1>
        <p><FormattedMessage id="description" /></p>
        <button><FormattedMessage id="button" /></button>
        <div>
          <h2><FormattedMessage id="products" /></h2>
          <ul>
            <li><FormattedMessage id="product1" /></li>
            <li><FormattedMessage id="product2" /></li>
            <li><FormattedMessage id="product3" /></li>
          </ul>
        </div>
      </div>
    </IntlProvider>
  );
}
export default App;

3. 日期和数字格式化

// 正确姿势:日期和数字格式化
import React from 'react';
import { useTranslation } from 'react-i18next';

function FormattingExample() {
  const { t, i18n } = useTranslation();
  const formatDate = (date) => {
    return new Intl.DateTimeFormat(i18n.language).format(date);
  };
  const formatNumber = (number) => {
    return new Intl.NumberFormat(i18n.language).format(number);
  };
  return (
    <div>
      <p>{t('currentDate')}: {formatDate(new Date())}</p>
      <p>{t('price')}: {formatNumber(12345.67)}</p>
    </div>
  );
}
export default FormattingExample;

总结: 通过上述方案,可实现应用的全球化支持,让应用在全球范围内都能被理解。

目录

  1. 前端国际化实战:i18next 与 react-intl 配置指南
  2. 背景
  3. 为什么需要国际化
  4. 硬编码的问题
  5. 推荐方案
  6. 1. i18next
  7. 2. react-intl
  8. 3. 日期和数字格式化

更多推荐文章

查看全部
  • SQL Server 与 Access/Excel 数据转换方法
  • 前缀和算法实战:连续数组与矩阵区域和解析
  • Python webbrowser 库:跨平台浏览器控制接口
  • 2023 年电赛 H 题信号分离装置 FPGA 与 STM32 实现方案
  • 无人机 RemoteID 合规指南:ArduRemoteID 开源方案详解
  • Stable Diffusion 之外:三款主流图像生成工具对比
  • Neo4j Desktop 2 本地安装与图数据库实战指南
  • Java NIO 基础原理与服务端开发指南
  • Math-LLaVA:增强多模态大语言模型的数学推理能力
  • Python 2026 发展展望:AI 时代的通用基础设施语言
  • Spring Cloud 优雅实现远程调用 - OpenFeign
  • Java 程序运行机制:编译、类加载、JIT 与执行流程
  • 2025 主流 AI IDE 对比:Trae、Copilot、Windsurf、Cursor 选型指南
  • 百度 Q2 财报发布:大模型与自动驾驶驱动业绩增长
  • Python 自动化办公:使用 python-pptx 批量生成 PPT
  • 第十五届蓝桥杯 Python B 组省赛真题解析
  • Go 语言通道(Channel)核心机制与使用指南
  • CTFShow Web 入门:题目 21-28 爆破解析
  • AI 赋能产品经理:提示词框架与工具实战指南
  • Whisper.cpp 编译指南:如何启用 CUDA 实现 GPU 加速

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online