Multi-Language (i18n) Implementation
JSONB-based multi-language system supporting 14 languages with dynamic language switching.Implementation: Phase 3-5 complete. Backend API localization with query parameter-based language selection.
Supported Languages
English
en - English (Required fallback)Vietnamese
vi - Tiếng ViệtJapanese
ja - 日本語Chinese
zh - 中文Korean
ko - 한국어Thai
th - ภาษาไทยIndonesian
id - Bahasa IndonesiaFrench
fr - FrançaisGerman
de - DeutschSpanish
es - EspañolLao
lo - ພາສາລາວKhmer
km - ខ្មែរBurmese
my - မြန်မာFilipino
fil - Wikang TagalogArchitecture
Data Storage (Database Layer)
Translatable fields stored as JSONB in PostgreSQL with English as required fallback:Implementation Stack
- Backend (NestJS)
- Frontend (Next.js)
Files:
backend/src/common/utils/i18n.util.ts- Translation utilitiesbackend/src/common/decorators/language.decorator.ts- Language decoratorbackend/src/common/interceptors/language.interceptor.ts- Language interceptor
Service & Staff Localization
Services Module
Endpoint Examples
- Services
- Staff
- Settings
Utility Functions
Core Functions
createTranslatedField()
createTranslatedField()
Creates and validates translated field. Requires English (en) translation.
getLocalizedField()
getLocalizedField()
Extracts localized string from translated field. Falls back to English if language not available.
localizeObject()
localizeObject()
Localizes specific fields in a single object. Returns new object with localized values.
localizeArray()
localizeArray()
Localizes specific fields in array of objects. Used for list endpoints.
Additional Utilities
- Validation
- Helpers
API Response Format
Services Endpoint
name and description are localized strings, not JSONB objects.Staff Endpoint
Implementation Patterns
Service Method Pattern
All GET endpoints follow this pattern:Controller Pattern
Frontend Integration
API Client Usage
Response Handling
Frontend receives localized strings directly (no translation needed):Database Schema
- Service Table
- Staff Table
Best Practices
1
Always Include English
Every translatable field must have English (en) as fallback
2
Use Type Safety
Use
SupportedLanguage type for language parameters3
Normalize Input
Use
normalizeLanguageCode() before validation4
Validate Languages
Check with
isSupportedLanguage() before using5
Localize on Response
Apply localization in service methods, not controllers
6
Test Fallbacks
Verify English fallback works for missing translations
Error Handling
The system handles edge cases gracefully:Project Roadmap
Development timeline
Code Standards
Coding conventions
API Reference
API endpoints
Back to Home
Return to homepage