[NestJS] 다국어 서비스 i18n

Dragon_Tack·2025년 1월 13일

i18n이란?

우선 i18n이 무엇인지 알아야 무엇을 어떻게 왜 작업하는지 알 수 있지 않을까? i18n은 자바스크립트를 위해 작성된 국제화 프레임워크라고 한다. React, Vue, Angular 같은 프런트엔드의 프레임워크뿐만 아니라 Node.js, Deno, Android, IOS, PHP 등 다른 플랫폼에서도 사용할 수 있는 국제화를 도와주는 라이브러리라고 합니다.

i18n을 사용하면 사용자의 언어를 감지할 수 있고 그에 따라 번역본을 보여줄 수 있다. 더 나아가 선택적으로 번역을 캐싱을 할 수도 있다고 한다. 그럼 이제 어떻게 사용을 할 수 있을까?

이로 NestJS를 이용한 다국어 서비스를 위한 모듈을 테스트를 해보겠습니다.

실습

npm i nestjs-i18n

AppModule 설정

import { Module } from '@nestjs/common';
import { AcceptLanguageResolver, HeaderResolver, I18nModule, QueryResolver } from 'nestjs-i18n';
import * as path from 'path';
import { AppController } from './app.controller';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'en',
      loaderOptions: {
        path: path.join(__dirname, '/i18n/'),
        watch: true,
      },
      resolvers: [
        { use: QueryResolver, options: ['lang'] },
        AcceptLanguageResolver,
        new HeaderResolver(['x-lang']),
      ],
    }),

  ],
  controllers: [AppController],

})

export class AppModule { }

JSON 준비

기댓값으로 영어, 한국어, 일본어를 3개로 대표적으로 JSON에 세팅해두었다.

번역 테스트

  @Get('test')
  async getGreeting(@I18n() i18n: I18nContext): Promise<string> {
    return await i18n.t('test.HELLO')
  }

?lang=en

?lang=ko

?lang=jp

Header x-lang jp

Header x-lang ko

Header x-lang en

Conclusion

간단한 테스트를 마치고, Header 혹은 query String에 특정 국가코드를 입력하여 서버단에서 처리할수 있게 되었다. Client에서 국가Locale 정보를 자동으로 인식하여 넘겨준다면, 좋은 자리매김을 할것 같다. 공식문서를 보고 이해가 안되었던 부분이 nest-cli에서 삽질하는데 시간을 좀 소요를 많이 한것같다. 이집트에 계신 Mahmoud Anani님의 도움으로 긴 시간이나마 단축할수 있게 되었다.

참고문헌

profile
고민의 흔적을 늘여놓는 공간

0개의 댓글