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

自定义目录结构下使用nestjs-i18n的配置与报错排查

关于nestjs-i18n自定义目录结构的问题与解决

问题描述

我的项目结构

root
├── backend (nest cli)
├── frontend
└── shared
    └── translations
        ├── en.json
        ├── no.json
        └── nl.json

nestjs-i18n官方示例结构

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

我想确认是否可以不遵循官方的目录结构,改用自己的shared/translations下按语言单文件存放的方式。目前已在app.module.ts中配置:

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      loaderOptions: {
        path: join(process.cwd(), '../shared/translations'),
        watch: true,
      },
      resolvers: [TenantLanguageResolver],
    }),
  ],
})

但调用const trans = await i18n.t('roles_help_text');时,出现错误:

ERROR [I18nService] Translation "roles_help_text" in "en" does not exist.

解决方案

1. 自定义目录结构完全可行

nestjs-i18n支持自定义翻译文件路径,不需要严格遵循官方的“语言目录+多命名空间文件”结构,直接使用“单语言文件”的存放方式完全可以实现。

2. 错误排查与修复步骤

步骤1:验证路径正确性

先确认配置的路径是否指向正确的目录,可以临时打印路径验证:

import { join } from 'path';

const translationPath = join(process.cwd(), '../shared/translations');
console.log('当前翻译文件路径:', translationPath); // 检查输出是否对应到root/shared/translations目录

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      loaderOptions: {
        path: translationPath,
        watch: true,
      },
      resolvers: [TenantLanguageResolver],
    }),
  ],
})

步骤2:检查翻译文件格式

确保en.json等文件中确实存在roles_help_text键,且JSON格式无语法错误,示例如下:

{
  "roles_help_text": "角色相关帮助文本"
}

步骤3:配置正确的加载器(关键)

默认加载器适配官方的“语言目录+多文件”结构,你的单文件结构需要指定I18nJsonLoader并配置文件匹配规则:

import { I18nModule, I18nJsonLoader } from 'nestjs-i18n';
import { join } from 'path';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      loader: I18nJsonLoader, // 指定单文件加载器
      loaderOptions: {
        path: join(process.cwd(), '../shared/translations'),
        filePattern: '*.json', // 匹配每个语言的单文件
        watch: true,
      },
      resolvers: [TenantLanguageResolver],
    }),
  ],
})

步骤4:确认语言解析器工作正常

检查TenantLanguageResolver是否正确返回了当前语言(比如'en'),如果解析器返回的语言不存在,会自动回退到fallbackLanguage,但如果语言返回正确仍报错,需回到前面步骤再次排查。

内容的提问来源于stack exchange,提问作者Tamzid Oronno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:02:22