You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nestjs使用nestjs-i18n时自定义异常过滤器国际化失效问题

问题原因及解决方案

你遇到的翻译直接返回key的问题,由以下几个常见配置错误导致,按顺序排查即可解决:

1. 翻译文件未被正确打包到运行目录

Nest默认编译时只会把.ts文件打包到dist目录,你存放在src下的i18n json文件不会被自动复制,导致运行时找不到翻译资源,直接返回key。

解决方法:

修改nest-cli.json配置,添加assets规则让i18n文件在编译时自动复制到dist:

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": ["i18n/**/*"],
    "watchAssets": true // 开发模式下修改翻译文件自动同步
  }
}

2. 翻译文件结构或命名不匹配

你调用的key是message.Unauthorized,需要严格匹配翻译文件的目录、文件名和内部key结构。

要求的目录结构:

src/
├── i18n/
│   ├── en/
│   │   └── message.json
│   └── fr/
│       └── message.json

fr/message.json 内容示例:

{
  "Unauthorized": "Vous n'êtes pas autorisé à accéder à cette ressource"
}

3. 异常过滤器依赖注入配置错误

你注册全局异常过滤器时直接使用useClass,但过滤器依赖I18nService,这种注册方式不会触发Nest的依赖注入,导致I18nService实例异常,无法正常加载翻译。

解决方法:

修改app.module.ts中全局过滤器的注册逻辑,用useFactory手动注入依赖:

providers: [
  AppService,
  {
    provide: APP_FILTER,
    useClass: NotFoundExceptionFilter,
  },
  {
    provide: APP_FILTER,
    useFactory: (i18n: I18nService) => new HttpExceptionFilter(i18n),
    inject: [I18nService]
  }
]

可选优化:动态获取请求语言

你当前写死了lang: 'fr',如果需要根据请求参数、请求头自动适配语言,可以直接用I18nContext获取当前请求的上下文翻译实例:

import { I18nContext } from 'nestjs-i18n';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter<HttpException> {
  async catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const i18n = I18nContext.current(host);
    const message = await i18n.t('message.Unauthorized');

    response.status(403).send({
      status: 6,
      message: message,
      data: null
    });
  }
}

内容的提问来源于stack exchange,提问作者Abhishek Chaniyara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:39:03