`nestjs-i18n` 不适用于 NestJs 项目中的自定义装饰器

问题描述 投票:0回答:1

我已经在 NestJs 中使用

nestjs-i18n
实现了本地化。它正在控制器和服务上工作。 它也在 DTO 级别上工作,但我面临着自定义装饰器
CustomHeaders
RequestHeaderDto
的问题。 它没有抛出任何错误,它只是没有给出正确的消息,它给出了
lang.HELLO|{}

这是我的代码:

// headers.decorator.ts:

import { CustomHeaders } from '../decorators/header.decorator'
import { ExecutionContext, createParamDecorator } from '@nestjs/common'
export const CustomHeaders = createParamDecorator((data: string | undefined, ctx: ExecutionContext) => {
  const req = ctx.switchToHttp().getRequest()
  if (data) {
    return req.headers[data]
  }
  return req.headers
})

//RequestHeaderDto:

import { IsNotEmpty } from 'class-validator'
import { i18nValidationMessage, I18n } from 'nestjs-i18n'

export class RequestHeaderDto {
  @IsNotEmpty({
    message: i18nValidationMessage('lang.HELLO'),
  })
  t_id: number
}

//控制器:

@Get('test')
@UseFilters(new I18nValidationExceptionFilter())
async test(
  @I18n() i18n: any,
  @CustomHeaders() headers: RequestHeaderDto,
): Promise<any> {
    const message = await i18n.t('lang.PRODUCT.NEW',{args: { name: 'Toon' }})
    return message;
}

// Main.ts:

app.useGlobalPipes(new I18nValidationPipe());
  app.useGlobalFilters(new I18nValidationExceptionFilter());

//app.module.ts:

I18nModule.forRootAsync({
      useFactory: (configSrv: NestConfig) => ({
        fallbackLanguage: "en",
        loaderOptions: {
          path: path.join(__dirname, '../i18n/'),
          watch: true,
        },
      }),
      resolvers: [
        { use: QueryResolver, options: ['lang'] },
        new HeaderResolver(['x-lang']),
        AcceptLanguageResolver,
      ],
      inject: [NestConfig],
    })

// src\i18n n\lang.json

{
  "HELLO": "Hello World",
  "PRODUCT": {
    "NEW": "New Product: {name}"
  },
}
nestjs internationalization nestjs-i18n
1个回答
0
投票

经过几个小时的探索、尝试:),我得到了解决方案。 我们可以这样使用

nestjs-i18n

Headers.decorator.ts:

import { CustomHeaders } from '../decorators/header.decorator'
import { ExecutionContext, createParamDecorator } from '@nestjs/common'

export const CustomHeaders = createParamDecorator((data: string | undefined, ctx: ExecutionContext) => {
  const req = ctx.switchToHttp().getRequest()

  console.log('message:', req.i18nService.t('lang.HELLO', { lang: req.i18nLang, args: { fieldName: 'TEST' }, }))

 /** Rest of the codes **
})

控制器没有变化

© www.soinside.com 2019 - 2024. All rights reserved.