i18n — Internationalization

~20 daq · NestJS · Ilg'or mavzular

Muammodan boshlaylik

Ilovangiz o'sdi. O'zbekiston dan tashqari Rossiya, Germaniya, AQShda ham foydalanuvchilar bor. Har bir foydalanuvchi xato xabarlarni o'z tilida ko'rmoqchi.

Hozirgi kodda:

throw new BadRequestException('Email allaqachon band');

Bu faqat o'zbek tilida. Rus foydalanuvchi ham shu matnni ko'radi.

i18n (internationalization) — ilovani ko'p tilli qilish.


i18n nima?

i18n — "internationalization" so'zining qisqartmasi (i va n orasida 18 ta harf bor).


Hayotiy o'xshatma

Tarjimon. Xuddi tarjimon gapni bir tildan ikkinchisiga o'girganidek, i18n ham matnlarni foydalanuvchi tiliga qarab ko'rsatadi.

Siz kodda errors.EMAIL_TAKEN kalit yozasiz — i18n uni foydalanuvchi tiliga tarjima qiladi.


O'rnatish

npm install nestjs-i18n

Fayl tuzilmasi

src/
  i18n/
    uz/
      errors.json      ← o'zbek tilidagi xato xabarlari
      common.json      ← umumiy matnlar
    ru/
      errors.json
      common.json
    en/
      errors.json
      common.json
  app.module.ts

Tarjima fayllari

// src/i18n/uz/errors.json
{
  "EMAIL_TAKEN": "Email allaqachon band",
  "NOT_FOUND": "Topilmadi",
  "INVALID_PASSWORD": "Noto'g'ri parol"
}
// src/i18n/ru/errors.json
{
  "EMAIL_TAKEN": "Email уже занят",
  "NOT_FOUND": "Не найдено",
  "INVALID_PASSWORD": "Неверный пароль"
}
// src/i18n/en/errors.json
{
  "EMAIL_TAKEN": "Email already taken",
  "NOT_FOUND": "Not found",
  "INVALID_PASSWORD": "Invalid password"
}

AppModule ga ulash

// app.module.ts
import { I18nModule, AcceptLanguageResolver, QueryResolver } from 'nestjs-i18n';
import { join } from 'path';

@Module({
  imports: [
    I18nModule.forRoot({
      fallbackLanguage: 'uz',                        // ← til topilmasa — o'zbek
      loaderOptions: {
        path: join(__dirname, '/i18n/'),             // ← tarjima fayllari qayerda
        watch: true,
      },
      resolvers: [
        { use: QueryResolver, options: ['lang'] },   // ← ?lang=ru
        AcceptLanguageResolver,                       // ← Accept-Language header
      ],
    }),
  ],
})
export class AppModule {}

Serviceda ishlatish

// users/users.service.ts
import { I18nService } from 'nestjs-i18n';

@Injectable()
export class UsersService {
  constructor(private i18n: I18nService) {}

  async create(dto: CreateUserDto) {
    const exists = await this.findByEmail(dto.email);

    if (exists) {
      throw new BadRequestException(
        this.i18n.t('errors.EMAIL_TAKEN'), // ← til avtomatik aniqlanadi
      );
    }

    return this.userRepository.save(dto);
  }
}

Foydalanuvchi Accept-Language: ru header yuborganda — rus tilida xato ko'radi.


O'zgaruvchilar bilan

// uz/common.json
{
  "GREETING": "Salom, {name}!",
  "ITEMS_COUNT": "{count} ta element topildi"
}
this.i18n.t('common.GREETING', { args: { name: 'Ali' } })
// → "Salom, Ali!"

this.i18n.t('common.ITEMS_COUNT', { args: { count: 5 } })
// → "5 ta element topildi"

Tilni qanday aniqlash mumkin

Accept-Language: ru   ← header (brauzer va mobil ilovalar avtomatik yuboradi)
?lang=uz              ← query param

Ko'pincha Accept-Language yetarli — brauzer o'zi yuboradi.


Tez-tez uchraydigan xatolar

1. Tarjima topilmayapti

i18n translation not found: errors.EMAIL_TAKEN

Sababi: Fayl nomi yoki kalit noto'g'ri. Yechim: src/i18n/uz/errors.json da EMAIL_TAKEN kaliti borligini tekshiring. Katta-kichik harf muhim.


2. Til aniqlanmayapti, doim fallback ishlaydi Sababi: Accept-Language header yuborilmayapti. Yechim: ?lang=uz query param bilan sinab ko'ring. Yoki Postman da Accept-Language: ru header qo'shing.


3. __dirname xatosi

Cannot find module '.../i18n'

Sababi: dist/ papkasida i18n papkasi yo'q. Yechim: nest-cli.json da assets ga qo'shing:

{ "assets": [{ "include": "i18n/**/*", "watchAssets": true }] }

Xulosa

  • i18n — matnlarni foydalanuvchi tiliga qarab ko'rsatish
  • Tarjimalar JSON fayllarda: src/i18n/{til}/{fayl}.json
  • this.i18n.t('kalit') — tarjimani olish
  • Til Accept-Language header yoki ?lang= orqali aniqlanadi
  • fallbackLanguage — til topilmasa qaysi tilni ishlatish

Keyingi dars: 48-dars: Email yuborish va User Activation