nestjs可以这样简单的配置国际化-灵析社区

养乐多一瓶

前言

国际化问题不论在前端后端都挺常见的,作者目前在写项目,前端在react中配置好了,但是在后端用nestjs时也需要配置,也算是第一次在后端配置吧。为什么要写这篇文章呢,我一般学习nestjs就是搭配着官方文档以及掘金博客学习。但是在官方文档以及掘金中均未找到相关资料。

我们在前端很常见的一个国际化包就是i18n,于是我就去找了一下i18n能不能在nestjs中的使用,最后在npm官网中就找到了这个包

这个包使用起来也是非常的简单,官方文档写的很清楚,这里给大家做个具体步骤实现一下,如果想进一步了解高级用法,大家可以移步到文档地址 (nestjs-i18n.com/guides)。

开始使用

配置项

首先我们需要在nestjs中下载这个包

pnpm install --save nestjs-i18n

默认情况下nestjs-i18n使用I18nJsonLoader加载器类。该加载程序从文件中读取翻译json。 接着我们需要在src目录下面新建一个i18n文件夹,里面存放我们的配置语言,下面是我们的项目目录配置。

package.json
package-lock.json
...
src
└── i18n
    ├── en
    │   ├── events.json
    │   └── test.json
    └── nl
        ├── events.json
        └── test.json

注意点!!!

在项目构建过程中,i18n文件夹不会自动复制到构建后的dist文件夹中。dist为了nestjs能够执行此操作,需要修改nest-cli.json内部的compilerOptions. 下面是我的配置,可以直接copy

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": [
      { "include": "i18n/**/*", "watchAssets": true }
    ]
  }
}

如果采用monorepo架构的项目,还需要额外的配置项

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": [
      {
        "include": "i18n/**/*",
        "watchAssets": true,
        "outDir": "dist/apps/api"
      }
    ]
  }
}

注入模块

配置好之后,我们需要在模块中注入,我们在根模块,也就是app.module中注入为全局的服务,看个人项目需要,你是要直接注入,还是要异步注入,针对两种不同的方式,我这里只做最基本的实现,另外一种大家可以去文档看看,养成看文档的习惯还是有必要的。

import { Module } from '@nestjs/common';
import * as path from 'path';
import {
  AcceptLanguageResolver,
  I18nJsonLoader,
  I18nModule,
  QueryResolver,
} from 'nestjs-i18n';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      loaderOptions: {
        path: path.join(__dirname, '/i18n/'),
        watch: true,
      },
      resolvers: [
        { use: QueryResolver, options: ['lang'] },
        AcceptLanguageResolver,
      ],
    }),
  ],
  controllers: [],
})
export class AppModule {}

解释一下几个api的用法

fallbackLanguage : 配置我们的后备语言,其实就是默认语言,当你没有指定语言的时候,他就会以这种方式解析

loaderOptions : 加载时的配置项,我们前面提到过 默认情况下nestjs-i18n使用I18nJsonLoader加载,所以这个loader里面我们需要配置一些设置,例如配置的语言的目录,还有watch打开后,可以实时加载,其他配置项文档很清楚,这里不说那么多了。

QueryResolver : 用于获取我们请求的当前语言, 在基本的 Web 应用程序中,这是通过Accept-Language标头完成的,在这个包中内置了一组解析器,在QueryResolver中可以解析请求的语言

到这里基本配置完了,让我们来实战一下。

实战demo

首先在i18n文件夹下面新建我们的配置语言


就写了一点点demo数据,大家可自行尝试。

下面我们在service中尝试一下

import { Injectable } from '@nestjs/common';
import { I18nContext, I18nService } from 'nestjs-i18n';
@Injectable()
export class AppService {
  constructor(private readonly i18n: I18nService){}
  getHello(): string {
    return this.i18n.t('test.animals',{ lang:   I18nContext.current().lang });
  }
}

I18nContext.current()可以返回当前的语言,这里表示我们以这种语言来处理数据

当我们fallbackLanguage设置为zh-CN时,我们再来看看

发现按照我们的设置的语言来处理了。

阅读量:264

点赞量:0

收藏量:0