Міжнародна підтримка (i18n) у додатках NestJS

Internationalization, зазвичай скорочене як i18n (де 18 позначає кількість літер між 'i' і 'n'), — це процес розробки програмного забезпечення, щоб його можна було адаптувати до різних мов і регіонів без необхідності вносити зміни в саму програму. У цій статті ми розглянемо, як реалізувати інтернаціоналізацію в додатку NestJS за допомогою пакету nestjs-i18n.

NestJS — це швидко зростаючий фреймворк для створення ефективних і легких в обслуговуванні серверних додатків. Він побудований на TypeScript і використовує потужні можливості сучасного JavaScript, підтримуючи такі розробницькі патерни, як ін'єкція залежностей, модульність та декоратори.

Налаштування проекту

Спочатку давайте створимо новий проект NestJS:

$ npm i -g @nestjs/cli  
$ nest new my-i18n-app  
$ cd my-i18n-app

Встановлення залежностей для інтернаціоналізації

Щоб додати підтримку інтернаціоналізації в наш NestJS додаток, ми скористаємося пакетом nestjs-i18n. Встановимо його разом з необхідними залежностями:

$ npm install nestjs-i18n  
$ npm install @nestjs/config  
$ npm install @nestjs/platform-express  
$ npm install i18next

Налаштування модуля i18n

Налаштуємо AppModule, щоб інтегрувати модуль nestjs-i18n. Відкрийте файл src/app.module.ts і налаштуйте модуль i18n наступним чином:

import { Module } from '@nestjs/common';  
import { I18nModule, I18nJsonParser } from 'nestjs-i18n';  
import * as path from 'path';  

@Module({  
 imports: [  
 // Реєструємо I18nModule  
 I18nModule.forRoot({  
 fallbackLanguage: 'en',  
 parser: I18nJsonParser,  
 parserOptions: {  
 path: path.join(__dirname, '/i18n/'),  
 watch: true,  
 },  
 }),  
 ],  
})  
export class AppModule {}

Тут ми використовуємо модуль I18nModule у нашому AppModule і налаштовуємо його для використання JSON файлів, які зберігаються в директорії src/i18n/, для зберігання перекладів. Переконайтеся, що така директорія існує.

Налаштування перекладів

Створіть директорію з назвою i18n у директорії src і додайте файли перекладів для різних мов. Наприклад, створіть файли en.json і es.json для перекладів на англійську та іспанську мови:

src/i18n/en.json:

{  
 "greeting": "Hello, {{ name }}!"  
}

src/i18n/es.json:

{  
 "greeting": "¡Hola, {{ name }}!"  
}

Використання перекладів у контролерах

Створимо простий контролер для використання наших перекладів. Відкрийте файл src/app.controller.ts і змініть його наступним чином:

import { Controller, Get, Query } from '@nestjs/common';  
import { I18nService, I18nLang } from 'nestjs-i18n';  

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

 @Get('greet')  
 async greet(@I18nLang() lang: string, @Query('name') name: string): Promise {  
 const greeting = await this.i18n.translate('greeting', { lang, args: { name } });  
 return greeting;  
 }  
}

У цьому коді ми створили кінцеву точку greet, яка приймає параметр запиту name і використовує сервіс I18nService для перекладу повідомлення привітання на основі параметра lang. Якщо мова не вказана в запиті, використовується мова за замовчуванням (в нашому випадку англійська).

Тестування додатку

Запустіть додаток:

$ npm run start

Тестуйте кінцеві точки в браузері або за допомогою інструментів типу curl або Postman. Наприклад:

  1. Привітання англійською:
  • http://localhost:3000/greet?name=John
  1. Привітання іспанською:
  • http://localhost:3000/greet?name=John&lang=es

Ви повинні побачити такі відповіді:

  • Англійською: Hello, John!
  • Іспанською: ¡Hola, John!

Висновок

Ми успішно додали інтернаціоналізацію до додатку NestJS за допомогою пакету nestjs-i18n. Цей приклад демонструє, як налаштувати інфраструктуру, визначити переклади та використовувати їх у контролерах.
Правильна підтримка i18n значно покращує досвід користувачів, роблячи ваш додаток доступним для більш широкої аудиторії.

Додаткові ресурси

Щасливого кодування і нехай весь світ має доступ до вашого додатку рідною мовою! 🌐

Перекладено з: Internationalization (i18n) in NestJS Applications

Leave a Reply

Your email address will not be published. Required fields are marked *