15. Internasionalisasi (i18n)

Ringkasan

Aplikasi memiliki Framework Multi-Bahasa (i18n) berbasis cookie yang mendukung Bahasa Indonesia (ID) dan Bahasa Inggris (EN) dengan nol kedipan hidrasi layout (*FOUC-free*) saat Server-Side Rendering (SSR).


Cara Kerja

Preferensi bahasa disimpan di dalam cookie bernama locale (locale=en atau locale=id).

mermaid
sequenceDiagram
    autonumber
    actor User
    participant Switcher as Komponen LocaleSwitcher
    participant Cookie as Document Cookie (locale=id)
    participant Layout as Root Layout (layout.tsx)
    participant I18nCtx as I18nProvider Context
    
    User->>Switcher: Beralih Bahasa (ID <-> EN)
    Switcher->>Cookie: Atur cookie "locale=id; path=/; max-age=31536000"
    Switcher->>Switcher: Reload halaman di dalam Transisi React
    Layout->>Cookie: Baca cookie di Server Component saat halaman dimuat
    Layout->>I18nCtx: Oper initialLocale={locale} ke I18nProvider
    I18nCtx-->>User: Render halaman terjemahan penuh di sisi Server!

Pencarian Terjemahan Server (src/lib/i18n.ts)

typescript
export function getTranslation(locale: string | undefined, path: string): any {
  const selectedLocale = (locale === "en" || locale === "id" ? locale : "id") as Locale;
  const dict = translations[selectedLocale];

  const keys = path.split(".");
  let result: any = dict;

  for (const key of keys) {
    if (result && typeof result === "object" && key in result) {
      result = result[key];
    } else {
      return path;
    }
  }

  return result !== undefined && result !== null ? result : path;
}

Berkas Terkait

  • src/lib/i18n.ts — Helper pencarian kunci terjemahan server
  • src/context/i18n-context.tsx — Provider Context React & hook useTranslation
  • src/components/locale-switcher.tsx — Komponen tombol switcher bahasa
  • src/locales/en.ts — Kamus terjemahan Bahasa Inggris
  • src/locales/id.ts — Kamus terjemahan Bahasa Indonesia