实战篇:如何在 NestJS 项目中支持 i18n 国际化本地化

前言

在当今全球化的互联网环境下,为软件添加国际化(Internationalization,通常简称为i18n)支持变得至关重要。NestJS 作为一个现代、功能丰富的 Node.js 框架,提供了强大的国际化机制。本文将指导您如何在 NestJS 项目中实现 i18n 功能。

i18n 是国际化的缩写,数字 18 代表起始字母 "I" 和结束字母 "n" 之间的字母数。在 NestJS 中实现 i18n 意味着您的应用可以支持多种语言,根据用户的偏好显示内容。

实现步骤

一、安装 i18n 依赖

NestJS 确实为 i18n 提供了一个专门的模块。首先,您需要安装相关的依赖:

shell 复制代码
npm install @nestjs/i18n i18next i18next-fs-backend i18next-http-middleware
  • @nestjs/i18n 是 NestJS 的 i18n 核心模块。
  • i18next 是一个流行的 JavaScript i18n 库。
  • i18next-fs-backend 用于 Node.js 文件系统后端。
  • i18next-http-middleware 是处理 HTTP 请求的 i18n 中间件。

二、注册I18n模块

安装完依赖后,您需要在 NestJS 应用程序中配置 i18n 模块。假设您的语言文件存放在项目根目录的 /locales 文件夹下,配置如下:

typescript 复制代码
// app.module.ts
import { Module } from '@nestjs/common';
import { I18nModule, I18nJsonParser } from '@nestjs/i18n';
import * as path from 'path';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      parserOptions: {
        path: path.join(__dirname, '/i18n/'),
      },
      parser: I18nJsonParser,
    }),
    // ... 其他模块
  ],
  // ...
})
export class AppModule {}

在上述配置中,fallbackLanguage 表示如果没有匹配的语言文件,则使用该语言作为后备。parserOptions 中的 path 指定了语言文件的存放路径。parser: I18nJsonParser 使用 JSON 文件解析器。

三、创建语言文件

在 /locales 文件夹中为每种支持的语言创建一个 JSON 文件。例如:

/locales/en.json (英文)

json 复制代码
{
  "GREETING": "Hello"
}

/locales/es.json (西班牙文)

json 复制代码
{
  "GREETING": "Hola"
}

等等。每个文件包含相同的键,但值是翻译后的对应语言文本。

四、使用 i18n 翻译文案

一旦配置和语言文件准备就绪,您就可以在应用程序中使用 @I18n() 装饰器来注入 i18n 服务:

typescript 复制代码
// some.controller.ts
import { Controller, Get } from '@nestjs/common';
import { I18nService, I18nLang } from '@nestjs/i18n';

@Controller('greet')
export class SomeController {
  constructor(private readonly i18n: I18nService) {}

  @Get()
  async getGreeting(@I18nLang() lang: string) {
    const greeting = await this.i18n.translate('GREETING', { lang });
    return greeting;
  }
}

在上述代码中,@I18nLang() 装饰器自动提取当前请求中的语言,然后使用 i18n.translate 函数获取对应语言的翻译文本。返回值是一个问候语,根据请求中的 Accept-Language 头或查询参数的语言。

使用场景

一、使用中间件来确定语言

您可以使用中间件来分析 HTTP 请求并确定用户偏好的语言。i18next-http-middleware 已经提供这样的机制。

在 main.ts 中配置中间件:

typescript 复制代码
// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import i18next from 'i18next';
import middleware from 'i18next-http-middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  i18next.use(middleware.LanguageDetector).init({
    detection: {
      // 配置语言检测的选项
    },
  });

  app.use(middleware.handle(i18next));

  await app.listen(3000);
}
bootstrap();

在这里,我们向 i18next 初始化函数添加了一个语言探测器,并配置了中间件来自动处理语言检测逻辑。

二、提供地区特定的内容

在实际情况中,您可能需要根据用户的地区提供特定的内容。这时,可以通过更复杂的键和语言文件的结构来实现。

例如,您想要提供美国英语和英国英语的不同内容:

/locales/en-US.json

json 复制代码
{
  "SPELLING": "Color"
}

/locales/en-GB.json

json 复制代码
{
  "SPELLING": "Colour"
}

然后,您可以根据提取到的地区码来调用 i18n.translate 方法。

总结

在此,我们通过一个简单的例子展示了 NestJS 如何支持 i18n。重要的步骤包括安装所需要的库,配置 i18n 模块,创建语言文件,并用 i18n 服务来获取正确的翻译文本。国际化是一个连续的过程,并非一次性的任务。随着创建的内容和应用的用户群体的增长,我们需要不断调整和增添翻译文件来适应新的需要。

相关推荐
Dumbness2 小时前
Node 22 下 node --test test/ 报 MODULE_NOT_FOUND:内置测试运行器的文件匹配规则
node.js·测试
Amumu121385 小时前
Node学习: 网络基础概念 + HTTP模块
网络·node.js
sumitrmardy5 小时前
写了一个邮箱验证 API 之后,我才知道的几个 SMTP 冷知识
node.js
zttbee6 小时前
npm install卡顿
前端·npm·node.js
无责任此方_修行中6 小时前
如何不用括号调用 JS 的函数?
前端·javascript·node.js
无责任此方_修行中7 小时前
Deno 的八年:一场没逃出 Node 引力的运行时起义
前端·javascript·node.js
王大师王文峰10 小时前
HTML 入门到进阶:语义化标签、表单与多媒体一篇打通【语义化布局、表单校验、video/audio、Canvas、无障碍与 SEO】
前端·css·node.js·html·css3·jquery·html5
Flynt21 小时前
axios 被投毒半年后,我把 npm 的"安全防线"实测了一遍:最信任的 SHA512 是安慰剂
前端·npm·node.js
T_Wizard1 天前
Windows 下 NVM 踩坑实录:命令找不到、下载超时、C盘爆满、环境冲突一次搞定
node.js
第404号工位1 天前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js