Arsitekturnya
/en/blog/hello ← locale default, tetap berprefix (lebih bersih daripada kasus khusus)
/ru/blog/hello
/zh/blog/hello
/ja/blog/hello
/de/blog/hello
Tiga bagian yang bergerak:
- Dictionary — satu JSON per locale, bentuk identik, diketik
Record<Locale, typeof en>sehingga TypeScript berteriak saat ada key yang bergeser. - Route dinamis —
src/pages/[locale]/...dengangetStaticPaths()yang mengembalikan semua locale. - Content fallback — tulis post sekali di
en/, render di bawah semua locale sampai terjemahannya ada.
Trik type yang menyelamatkanmu
export type Locale = "en" | "ru" | "zh" | "ja" | "de";
const dictionaries: Record<Locale, typeof en> = { en, ru, zh, ja, de };
typeof en adalah schema-nya. Tambahkan key ke en.json dan build akan gagal sampai keempat dictionary lain menyusul.
Jangan lupakan head
<link rel="alternate" hreflang="..."> untuk tiap locale plus x-default, canonical per halaman, dan path yang diturunkan dari Astro.url. Search engine menghargai plumbing yang membosankan.