Nodejs Nestjs国际化插件@nestjs/i18n的使用

Nodejs Nestjs国际化插件@nestjs/i18n的使用
[@nestjs](/user/nestjs)/i18n 是一个用于在 NestJS 应用程序中实现国际化(i18n)的插件。下面是如何使用这个插件的一些基本步骤和示例代码。

安装

首先,你需要安装 [@nestjs](/user/nestjs)/i18n 和相关依赖:

npm install [@nestjs](/user/nestjs)/i18n i18n

配置

在你的 NestJS 项目中,创建一个配置文件来设置 i18n。例如,你可以在 app.module.ts 中进行如下配置:

import { Module } from '[@nestjs](/user/nestjs)/common';
import { APP_INTERCEPTOR } from '[@nestjs](/user/nestjs)/core';
import { I18nJsonParser, I18nModule, I18nJsonParserOptions } from '[@nestjs](/user/nestjs)/i18n';

@Module({
  imports: [
    I18nModule.forRootAsync({
      useFactory: () => ({
        fallbackLanguage: 'en',
        parser: I18nJsonParser,
        parserOptions: {
          path: join(__dirname, '/i18n/'),
        } as I18nJsonParserOptions,
      }),
    }),
  ],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: I18nInterceptor,
    },
  ],
})
export class AppModule {}

这里我们设置了默认的语言为英文 (en),并且指定了翻译文件的路径。

创建翻译文件

在你的项目中创建一个 i18n 文件夹,并在其中为每种语言创建 JSON 文件。例如:

  • i18n/en.json
  • i18n/es.json

这些文件应该包含键值对,比如:

en.json

{
  "welcome": "Welcome to our app!"
}

es.json

{
  "welcome": "Bienvenido a nuestra aplicación!"
}

使用翻译

现在你可以在控制器或服务中使用翻译了。你可以通过构造函数注入 I18nService 来获取当前的语言环境,并使用它来访问翻译:

import { Controller, Get } from '[@nestjs](/user/nestjs)/common';
import { I18nService } from '[@nestjs](/user/nestjs)/i18n';

@Controller('example')
export class ExampleController {
  constructor(private readonly i18n: I18nService) {}

  @Get()
  getExample() {
    const welcomeMessage = this.i18n.translate('welcome');
    return { message: welcomeMessage };
  }
}

自定义拦截器

如果你希望在每个响应中自动包含语言信息,可以创建一个自定义拦截器。例如:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '[@nestjs](/user/nestjs)/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { I18nService } from '[@nestjs](/user/nestjs)/i18n';

@Injectable()
export class I18nInterceptor implements NestInterceptor {
  constructor(private readonly i18n: I18nService) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      map(data => ({
        ...data,
        i18n: this.i18n.getLangs(),
      })),
    );
  }
}

然后在 AppModule 中注册这个拦截器:

providers: [
  {
    provide: APP_INTERCEPTOR,
    useClass: I18nInterceptor,
  },
],

这样,每次请求都会返回当前支持的语言列表。

以上就是使用 [@nestjs](/user/nestjs)/i18n 插件的基本方法。


3 回复

当然,要让@nestjs/i18n在你的NestJS项目中翩翩起舞,你需要跳几步优雅的代码舞步:

  1. 安装:首先,确保你已经安装了[@nestjs](/user/nestjs)/i18n和必要的依赖。你可以通过运行npm install [@nestjs](/user/nestjs)/i18n i18n来完成这一步。

  2. 配置:接下来,在你的AppModule里引入I18nModule。你可以这样配置它:

    [@Module](/user/Module)({
      imports: [
        I18nModule.forRoot({
          fallbackLanguage: 'en',
        }),
      ],
    })
    export class AppModule {}
    
  3. 使用:现在,你可以在控制器或服务中注入I18nService来使用它。例如:

    [@Controller](/user/Controller)('example')
    export class ExampleController {
      constructor(private readonly i18n: I18nService) {}
    
      @Get()
      async getTranslatedMessage(@Query('lang') lang: string) {
        return this.i18n.translate('message.welcome', { lang });
      }
    }
    
  4. 享受:现在,你可以根据请求的语言环境返回不同的翻译文本了!

记得调整路径和文件名以匹配你的项目结构。祝你在多语言世界的探险愉快!


@nestjs/i18n 是一个用于 NestJS 项目的国际化插件,它简化了多语言支持的过程。下面是如何使用 @nestjs/i18n 的步骤和一些基本示例。

安装依赖

首先,你需要安装必要的依赖包:

npm install @nestjs/i18n i18n

配置模块

接下来,在你的应用模块中导入并配置 I18nModule。这里以一个简单的模块为例:

import { Module } from '@nestjs/common';
import { I18nModule, I18nJsonParser } from '@nestjs/i18n';

@Module({
  imports: [
    I18nModule.forRoot({
      parser: I18nJsonParser,
      parserOptions: {
        path: path.join(__dirname, '/i18n/'), // 本地化文件路径
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

创建翻译文件

创建一个 i18n 文件夹,并在其中为每种语言创建 JSON 文件。例如,en.jsonzh-cn.json 文件:

en.json

{
  "welcome": "Welcome to our app!"
}

zh-cn.json

{
  "welcome": "欢迎来到我们的应用!"
}

在服务或控制器中使用

现在你可以在你的服务或控制器中注入 I18nService 来获取翻译文本:

import { Controller, Get } from '@nestjs/common';
import { I18nService } from '@nestjs/i18n';

@Controller('example')
export class ExampleController {
  constructor(private readonly i18n: I18nService) {}

  @Get('greet')
  greet(@Req() request): string {
    return this.i18n.translate('welcome', { lang: request.lang });
  }
}

设置语言

为了使上述代码正常工作,你需要设置请求的语言环境。可以通过中间件来实现这一点。这里提供一个简单的中间件示例:

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LanguageMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    const lang = req.query.lang || 'en'; // 根据需要从查询参数、cookie 或其他地方获取语言
    req['lang'] = lang;
    next();
  }
}

然后将其注册到你的应用程序中:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LanguageMiddleware } from './middleware/language.middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(new LanguageMiddleware());
  await app.listen(3000);
}
bootstrap();

以上就是使用 @nestjs/i18n 进行国际化的基本步骤。通过这些步骤,你可以轻松地为你的 NestJS 应用添加多语言支持。

@nestjs/i18n 是基于 NestJS 的国际化解决方案。首先安装此插件及依赖:

npm install @nestjs/i18n i18n

在模块中导入 I18nModule 并配置路径:

import { I18nModule } from '@nestjs/i18n';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      path: join(__dirname, '/i18n/{{lng}}/{{ns}}.json'),
    }),
  ],
})
export class AppModule {}

控制器中使用 @I18n(), @I18nContext() 装饰器获取翻译内容:

import { Get, Controller } from '@nestjs/common';
import { I18n, I18nContext } from '@nestjs/i18n';

@Controller('example')
export class ExampleController {
  @Get()
  get(@I18n() i18n: I18nContext) {
    return i18n.t('hello');
  }
}

确保你的 JSON 文件已准备好,并位于指定路径。

回到顶部