Next.js 中使用 i18n 多语言的方法

随着全球化的发展,多语言网站变得越来越普遍,前端开发遇到了多语言处理的难题。在 React 生态中,处理多语言最常用的方案就是 i18n,即国际化。

Next.js 是 React 生态中的一个热门框架,它包含了服务端渲染和静态页面生成等功能,因此也非常适合构建多语言网站。本文将介绍在 Next.js 中如何使用 i18n 处理多语言。

安装 i18n 库

首先,需要安装一个 i18n 库。在 React 生态中 i18next 是较为流行的一个国际化库,它支持多种语言,包括各种浏览器环境和服务端框架。

安装 i18next:

--- ------- -------

配置 i18next

接下来,需要在 Next.js 中配置 i18next。这里先创建一个新的 _app.js 文件,在其中引入 i18next 和 i18next-browser-languageDetector:

------ ----- ---- --------
------ --- ---- -----------
------ ---- ---- ----------
------ ---------------- ---- -----------------------------------

-------- ------- ---------- --------- -- -
  ------ ---------- -------------- ---
-

--------------------- - ----- ------------ -- -
  ----- -------- - ----- --------------------------------
  ------ - ----------- --
--

------ ------- ------

然后配置 i18next 的语言检测器:

---------------------------------
  ---------- -
    --- -
      ------------ -
        -- ----
      --
    --
    --- -
      ------------ -
        -- ----
      --
    --
  --
  ---------- -
    ------ ---------- --------------- -------------
    ------- -----------
  --
---

这里定义了两种语言,英语(en)和中文(zh),并在各自的 translation 中添加了翻译内容,具体的翻译内容会在下面介绍。

代码中的 detection 字段指定了 i18next 的语言检测器。它采用一个检测器数组,检测器数组中的每个元素指定了检测的方式。这里采用了三种检测方式,先在 cookie 中查找语言设置,如果没有则在 localStorage 中查找,最后采用 navigator 的语言设置。

编写 i18n 类型定义

为了方便使用,本例中会定义一个 t 函数,用于快速翻译。下面先添加一个 i18n 类型定义(建议添加到 src/types/i18next.d.ts 中):

------- ------ --------- -
  ------ --------- --------- -
    ------ ------- --------
      ---- ----- - - ---- ------ ------------- ------ --
      ------ ----- ------- ----- - -- - -------------- --------
    -- -------
  -
-

这个类型定义允许 t 函数使用泛型参数,自动获取翻译内容和翻译占位符的类型。

构造 t 函数

本例中采用一个高阶组件 HOC(Higher Order Component)的形式,构造一个 t 函数,用于快速翻译。下面创建一个 withTranslation.tsx 文件:

------ ----- ---- --------
------ ----- - --------- - ---- ----------

------ ----- --------------- - ------- ------- ----
  ---------- ---------------------------
- -- -
  ----- ------------------------ - ------- ------- -- -
    ----- -- --------- - ----- ----- -- ---------- -- ------- ------
    ------ ---------- ---------- ----- ---
  --

  ---------------------------------------- - ----- ----- ---- -- -
    --- -------------
    -- --------------------------- -
      ------------ - ----- -------------------------------
    -

    ------ -
      ----------------
    --
  --

  ------ -------------------------
--

这里定义了一个 withTranslation HOC 函数,它接受一个组件作为参数,并返回一个新的组件。这个新组件会把 t 函数作为一个 props 传递给原有的组件。

其中,getInitialProps 函数是用于 Next.js 的服务端渲染的。如果原有组件定义了 getInitialProps 函数,则需要将它复制到新组件中。

在页面中使用 i18n

现在,在页面中可以使用 t 函数来获取翻译内容。下面创建一个新的页面 pages/index.tsx

------ ----- ---- --------
------ - --------------- - ---- ------------------------------------

--------- ----- -
  -- ----- ------- -- -------
-

----- ---- - -- - -- ------ -- -
  ------ -
    -----
      -----------------------
      -------------------
      ---
        ------------------ -
          ------ --
        ---
      ----
    ------
  --
--

------ ------- ----------------------

在这个页面中,会输出三个翻译内容。t("welcome") 表示输出 welcome 翻译内容,t("intro")t("clickMessage") 同理。t 函数的第二个参数是一个对象,在这里用于传递翻译占位符的值。

现在回到 i18n 的配置:

---------------------------------
  ---------- -
    --- -
      ------------ -
        -------- -------- -- -- ---------
        ------ ----- -- -- -------- -------
        ------------- ---- ------- --------- --------
      --
    --
    --- -
      ------------ -
        -------- -----------
        ------ ------------
        ------------- ----- --------- ----
      --
    --
  --
  ---------- -
    ------ ---------- --------------- -------------
    ------- -----------
  --
---

这里完成了翻译内容的定义。其中,{{count}} 表示翻译占位符。在 t 函数中传递的 { count: 3 } 对应了这个占位符。

总结

本文介绍了在 Next.js 中使用 i18n 处理多语言的方法。通过 i18n,可以轻松地构建多语言网站,并统一管理不同语言版本的页面。i18next 是目前 React 生态中最流行的国际化库,但也可以使用其他库完成同样的任务。

通过本文的介绍,应该已经掌握了 Next.js 中使用 i18n 的基本方法。在实际开发过程中,还需要注意更多细节,例如快速切换语言、多语言 SEO、国际化翻译的最佳实践等。下一步,可以进一步深入学习,并在实际项目中进行尝试。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6458cbf3968c7c53b0b1bda2


猜你喜欢

  • Vue.js 中配置路由的方法

    在 Vue.js 中,路由是一个非常重要的概念。它允许我们创建单页应用(SPA),即在页面不刷新的情况下,根据用户的操作动态改变页面内容,实现良好的用户体验。下面,本文将详细介绍 Vue.js 中配置...

    1 年前
  • 利用 Webpack 构建同构化的 SPA 应用

    前言 随着前端应用逐渐复杂,单页面应用(Single-page Application,SPA)已逐渐成为前端界的主流。而同构化(Isomorphic JavaScript)则被认为是最优秀的 SPA...

    1 年前
  • 如何在 LESS 中使用垂直居中

    在前端开发中,有时候需要将一个元素的内容垂直居中,这在页面布局的过程中是非常常见的需求。不同的浏览器对于垂直居中的支持也不同,因此在这篇文章中,我们将介绍如何在 LESS 中使用垂直居中的方法,以确保...

    1 年前
  • SASS 中的常见问题集锦

    SASS 是一种 CSS 预处理器,它让我们可以使用变量、嵌套、函数等高级语法来简化 CSS 编写。不过,在我们的使用过程中,也会遇到一些常见的问题。这篇文章就来给大家总结一下 SASS 中常见的问题...

    1 年前
  • PWA 应用如何支持 W3C 的在线翻译 API

    PWA (Progressive Web App) 是一种利用 Web 技术实现类似原生应用的交互体验的应用。W3C (World Wide Web Consortium) 的在线翻译 API 可以帮...

    1 年前
  • Redux 在 React+Webpack 项目中的使用

    前言 React 和 Redux 都是前端开发中非常流行的工具库,它们能够帮助我们更轻松地构建大型 Web 应用。本文将介绍如何在 React 和 Webpack 项目中使用 Redux,本文假设你已...

    1 年前
  • Sequelize 如何使用 Op.notIRegexp?

    什么是 Sequelize? Sequelize 是一种基于 Node.js 的 ORM(Object Relational Mapping)框架,为开发人员提供了一种方便的方式来访问数据库。

    1 年前
  • Next.js 中如何设置通用布局

    引言 Next.js 是基于 React 的一个服务器端渲染框架,它可以让我们很容易地创建出良好的用户体验和 SEO 友好的网站。对于一个复杂的应用程序而言,通用布局是非常重要的。

    1 年前
  • Custom Elements 实现弹窗组件

    前言 在前端开发中,弹窗组件可以说是非常常见的一个功能。但是,大多数情况下我们要么使用第三方的弹窗插件,要么自己手写一些基础的弹窗组件。这些做法都有一定的局限性,比如第三方弹窗插件可能并不符合我们的实...

    1 年前
  • Koa2 实现文件上传限制

    文件上传是 web 开发中比较常见的功能之一,但是因为上传的文件容易引起安全问题,因此需要在服务器端做出一些限制。在 Koa2 中实现文件上传限制比较简单,本文就来介绍一下具体实现的方法。

    1 年前
  • Fastify 如何实现 Socket.IO

    前言 随着 Web 应用的普及和前后端分离的趋势,越来越多的开发者开始使用 Socket.IO 来实现实时通信。Fastify 是一个快速、低开销、基于插件的 Node.js Web 框架,它提供了有...

    1 年前
  • 使用 Hapi.js 和 JWT 实现单点登录

    使用 Hapi.js 和 JWT 实现单点登录 在现代 web 应用程序中,单点登录(Single Sign-On,SSO)是必须的功能,它使得用户可以在不同应用程序间进行无缝的转换,同时也极大地提高...

    1 年前
  • Mongoose 中的嵌套文档详解

    在 Node.js 开发中,Mongoose 是一个非常流行的 MongoDB 对象模型工具。在 Mongoose 中,除了支持文档的增、删、改、查操作之外,还支持嵌套文档操作。

    1 年前
  • MongoDB 中解决 WiredTiger 引擎的存储空间问题

    在使用 MongoDB 数据库的过程中,我们有时会遇到存储空间不足的问题。这个问题通常出现在使用 WiredTiger 存储引擎的情况下,因为 WiredTiger 会对数据进行压缩,从而导致磁盘空间...

    1 年前
  • 在 ES11 中使用 Proxy 实现多种具有类似行为的对象

    随着 JavaScript 的发展,开发者们希望能够创建具有类似行为的对象。传统的创建对象的方式使得我们难以有效地实现这个目标,但是 ES6 引入了 Proxy 对象,为我们提供了强大的工具来进行代理...

    1 年前
  • 如何在 Deno 中创建自定义模块

    Deno 是一个基于 V8 引擎构建的安全 TypeScript 运行时环境,它提供了一些内置的模块,但在开发过程中,我们可能需要自己编写一些自定义模块以满足业务需求。

    1 年前
  • 深入理解 JavaScript Closure

    什么是闭包? 在 JavaScript 中,闭包是指一个函数能够访问其他函数内部变量的能力,即便这些变量不在该函数的作用域中。闭包的实现依赖于 JavaScript 的词法作用域,即变量在编写代码时所...

    1 年前
  • 使用 OpenAPI 规范进行 RESTful API 的设计

    RESTful API 已经成为了现代 Web 应用中传输数据的标准方式。它基于 HTTP 协议,并使用轻量的 JSON 或 XML 格式来传输数据。但是,设计 RESTful API 并不是一项简单...

    1 年前
  • RxJS 操作符:take 和 takeLast

    在 RxJS 中,除了常见的 filter、map、reduce 等操作符,还有一些非常实用的操作符,例如 take 和 takeLast。这两个操作符用于限制 observable 流中的数据数量,...

    1 年前
  • Cypress 如何生成可视化数据报告?

    前言 Cypress 是一个针对现代 web 浏览器进行的端到端测试库。它使用了像 Mocha、Chai 和 Sinon.js 等现代化测试工具,且构建了一个非常简单的 API 来进行集成测试。

    1 年前

相关推荐

    暂无文章