i18n — Internationalization
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-Languageheader yoki?lang=orqali aniqlanadi fallbackLanguage— til topilmasa qaysi tilni ishlatish
Keyingi dars: 48-dars: Email yuborish va User Activation