国际化问题不论在前端后端都挺常见的,作者目前在写项目,前端在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
中可以解析请求的语言
到这里基本配置完了,让我们来实战一下。
首先在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