我已经在 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-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 **
})
控制器没有变化