Implementing Internationalization

1. Using Accept-Language Header

HeaderServer Selects
en-USUS English
fr,en;q=0.8French preferred, English fallback
zh-HansSimplified Chinese
None / unsupportedFallback to API default locale

2. Providing Localized Error Messages

Example: Localized Error

// Accept-Language: es
{
  "code": "VALIDATION_FAILED",
  "title": "Validación fallida",
  "errors": [
    {"field": "email", "message": "El correo electrónico es obligatorio"}
  ]
}

3. Implementing Currency Formatting

ApproachRecommendation
API returns raw amount + ISO 4217 code{"amount": 1234.56, "currency": "USD"}
Client formats per localeIntl.NumberFormat (JS)
Decimals as stringAvoid float precision loss

4. Implementing Date/Time Formatting

FieldRecommendation
API representationISO 8601 UTC: 2026-05-15T10:30:00Z
Client formatsIntl.DateTimeFormat
AvoidLocale-specific strings in API responses

5. Using ISO 639 Language Codes

StandardExample
ISO 639-1 (2-letter)en, fr, de
ISO 639-2 (3-letter)eng, fra
BCP 47 (region)en-US, zh-Hans-CN
API recommendationBCP 47 (RFC 5646)

6. Implementing Number Formatting

Locale1234567.89
en-US1,234,567.89
de-DE1.234.567,89
fr-FR1 234 567,89
API ruleSend raw number; client formats

7. Handling Right-to-Left Languages

LanguageDirection
Arabic, Hebrew, Persian, UrduRTL
API fieldOptional "direction": "rtl" hint
ClientApply dir="rtl" on HTML

8. Providing Translated Resource Content

PatternExample
Single field per request locale{"title": "Hola"} based on Accept-Language
Multi-locale object{"title": {"en": "Hello", "es": "Hola"}}
Locale param?locale=es override

9. Using Content-Language Header

HeaderMeaning
Content-Language: en-USResponse is in US English
Content-Language: en, frMulti-language content
Use withVary: Accept-Language for caching

10. Documenting Supported Locales

Doc ElementContent
Supported locales listBCP 47 codes
Default localeUsed when none requested or unsupported
Per-field translation statusWhich fields are localized
Fallback chaine.g. es-MX → es → en