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

前端国际化实战:i18next 与 react-intl 使用指南

前端国际化是拓展海外市场的必要步骤。硬编码文本会导致维护困难且无法适配多语言环境。文章介绍了两种主流解决方案:i18next 和 react-intl。通过配置资源文件实现多语言切换,利用 Hook 或 Provider 组件获取翻译内容。此外还涉及日期和数字的本地化格式化方法,确保应用在全球范围内具备一致的用户体验。

zhang发布于 2026/4/9更新于 2026/10/26107 浏览

前端国际化实战: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

// 配置
// 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;
// 使用
// 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;
// 入口文件
// 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

// 配置
// 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. 1. i18next
  6. 2. react-intl
  7. 3. 日期和数字格式化

更多推荐文章

查看全部
  • 基于 AI 辅助快速开发 MC.JS WEBMC 1.8.8 移动端插件实践
  • Java 反射机制核心逻辑与面试考点
  • GitHub 基础入门:账号注册与 SSH 密钥配置详解
  • C++ 双指针算法实战:有效三角形个数与和为 S 的两个数字
  • uv 多版本 Python 安装与管理使用指南
  • OpenClaw 接入自定义模型并通过 WebUI 完成智能操作
  • Spring Security 与 Apache Shiro 对比及核心概念
  • 基于 Scrapling 为 AI Agent 配置网页爬虫技能指南
  • AI 如何打破产品经理的能力壁垒,让更多人都能参与
  • 基于大语言模型的需求依赖检测新方法:LEREDD 的高精度与鲁棒性
  • Web Components 实战:从原生 API 到跨框架复用
  • 搞懂 HTML、CSS 和 JavaScript 的分工关系
  • 宇树 G1 机器人二次开发:基于 FAST_LIO 的建图与配置实战
  • 顺序栈与两栈共享空间的C语言实现
  • 前端拖拽排序实现详解:从原理到实践
  • QGIS 插件获取 Maxar 全球高分辨率遥感影像(0.3-0.5 米)
  • 用 FastAPI 搭一个 SSE MCP 服务
  • OpenClaw 搜索工具辨析与实战:web_search、tavily-search 和 web_fetch
  • Mac 系统安装与配置 Python 3.x 环境指南
  • JavaScript Promise 完整指南

相关免费在线工具

  • 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