Nestjs项目实战 国际化支持与多语言处理

在我们的NestJS项目中需要实现国际化功能,目前遇到几个问题想请教:

  1. 在NestJS中应该如何优雅地配置i18n模块?官方文档提到的@nestjs/i18n是否足够应对多语言需求?

  2. 多语言文件的最佳目录结构是怎样的?JSON和YAML格式哪种更适合大型项目?

  3. 如何在中间件中自动根据请求头切换语言?有没有成熟的拦截器实现方案?

  4. 对于动态内容(如数据库存储的文案),有什么推荐的多语言处理方案?

  5. 在GraphQL接口中要如何传递和解析语言参数?

  6. 项目需要支持20+语言时,性能方面有哪些优化建议?

3 回复

在NestJS项目中实现国际化(i18n)和多语言支持,首先需要安装相关依赖包如[@nestjs](/user/nestjs)/i18n或使用i18next。以下是一个简单实践步骤:

  1. 安装依赖:
    npm install [@nestjs](/user/nestjs)/i18n i18next i18next-http-backend

  2. 创建翻译文件:
    src目录下新建i18n文件夹,存放不同语言的JSON文件,例如en.jsonzh.json

  3. 配置I18n模块:
    app.module.ts中引入I18nModule并配置语言路径:

    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { I18nModule } from '[@nestjs](/user/nestjs)/i18n';
    
    [@Module](/user/Module)({
      imports: [
        I18nModule.forRoot({
          fallbackLanguage: 'en',
          loaderOptions: {
            path: join(__dirname, '/i18n/'),
            watch: true,
          },
        }),
      ],
    })
    export class AppModule {}
    
  4. 在Controller中使用:
    使用@I18n()装饰器获取当前语言环境,并调用翻译键。

    import { Controller, Get, I18n } from '[@nestjs](/user/nestjs)/common';
    import { I18nService } from '[@nestjs](/user/nestjs)/i18n';
    
    [@Controller](/user/Controller)('example')
    export class ExampleController {
      constructor(private readonly i18n: I18nService) {}
    
      @Get()
      async index(@I18n() i18n: any) {
        return { message: i18n.t('greeting') };
      }
    }
    
  5. 根据请求头动态切换语言:
    可以通过拦截器自动根据Accept-Language设置默认语言。

这样,你的NestJS应用就可以支持多种语言了!


在Nestjs项目中实现国际化支持和多语言处理,可以按照以下步骤:

  1. 安装依赖:使用[@nestjs](/user/nestjs)/i18n库来简化国际化处理。运行命令 npm install [@nestjs](/user/nestjs)/i18n i18n

  2. 配置I18nModule:在app.module.ts中导入I18nModule并配置语言文件路径。例如:

    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { I18nModule } from '[@nestjs](/user/nestjs)/i18n';
    
    [@Module](/user/Module)({
      imports: [
        I18nModule.forRoot({
          fallbackLanguage: 'en',
          parser: require('[@nestjs](/user/nestjs)/i18n-parser'),
          parserOptions: {
            path: __dirname + '/i18n/',
          },
        }),
      ],
    })
    export class AppModule {}
    
  3. 创建语言文件:在/i18n目录下创建不同语言的JSON文件,如en.jsonzh.json,内容如下:

    • en.json:
      {"hello": "Hello"}
      
    • zh.json:
      {"hello": "你好"}
      
  4. 使用语言服务:在控制器中注入I18nService,通过translate方法获取翻译文本。例如:

    import { Controller, Get } from '[@nestjs](/user/nestjs)/common';
    import { I18nService } from '[@nestjs](/user/nestjs)/i18n';
    
    [@Controller](/user/Controller)()
    export class AppController {
      constructor(private readonly i18n: I18nService) {}
    
      @Get('greet')
      async greet(@I18n() i18n) {
        return { message: i18n.translate('hello') };
      }
    }
    
  5. 设置语言上下文:可以通过请求头或参数动态切换语言,例如通过请求参数lang=en设置语言。

这样就可以轻松实现多语言支持了!

NestJS 项目实战:国际化与多语言处理

在NestJS中实现国际化(i18n)和多语言支持是开发全球化应用的重要部分。以下是实现方法:

1. 安装所需依赖

npm install nestjs-i18n i18next i18next-http-middleware

2. 基本配置

在AppModule中配置国际化模块:

import { I18nModule } from 'nestjs-i18n';
import * as path from 'path';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      loaderOptions: {
        path: path.join(__dirname, '/i18n/'),
        watch: true,
      },
    }),
  ],
})
export class AppModule {}

3. 创建语言文件

在项目根目录创建 i18n 文件夹,然后为每种语言创建JSON文件:

i18n/
  en.json
  zh.json
  fr.json

示例en.json内容:

{
  "greeting": "Hello",
  "welcome": "Welcome, {{name}}"
}

4. 在控制器中使用

import { I18nService, I18nLang } from 'nestjs-i18n';

@Controller()
export class AppController {
  constructor(private readonly i18n: I18nService) {}

  @Get()
  async getHello(@I18nLang() lang: string) {
    return this.i18n.t('greeting');
  }

  @Get('welcome')
  async getWelcome() {
    return this.i18n.t('welcome', { args: { name: 'John' } });
  }
}

5. 处理语言切换

可以通过以下方式指定语言:

  • 请求头 Accept-Language
  • 查询参数 ?lang=en
  • 路由参数 /en/welcome

6. 高级用法

// 在服务中使用
@Injectable()
export class AppService {
  constructor(private i18n: I18nService) {}

  getMessage(key: string, lang?: string) {
    return this.i18n.t(key, { lang });
  }
}

// 在拦截器中自动处理语言
@Injectable()
export class LanguageInterceptor implements NestInterceptor {
  constructor(private i18n: I18nService) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const request = context.switchToHttp().getRequest();
    const lang = request.headers['accept-language'] || 'en';
    
    return next.handle().pipe(
      map(data => ({
        ...data,
        message: this.i18n.t(data.messageKey, { lang })
      }))
    );
  }
}

最佳实践

  1. 将所有用户界面文本放入语言文件
  2. 避免在代码中硬编码文本
  3. 提供完整的语言上下文
  4. 定期检查未翻译的字符串

这些步骤可以帮助你在NestJS项目中实现完整的国际化支持。

回到顶部