Language Switcher Situs Ini Cuma Nge-prefix `/en`, Bukan Nerjemahin Slug

Banyak situs dwibahasa punya sistem “slug mapping” table buat nerjemahin URL antar bahasa — satu entri database yang bilang /blog/pindah-ke-astro di Indonesia sama dengan /en/blog/moving-to-astro di Inggris. Situs ini nggak punya itu sama sekali, dan itu keputusan sadar, bukan keterbatasan.
Cara kerjanya
localePath dan alternateLocalePath di src/lib/i18n-url.ts cuma nge-prefix atau nge-strip /en dari path yang lagi aktif. Itu doang — nggak ada lookup table, nggak ada query. Digabung sama i18n routing bawaan Astro (defaultLocale: 'id', prefixDefaultLocale: false), itu udah seluruh logic language switching di situs ini. Isinya cuma belasan baris.
Konsekuensinya
Setiap entri content collection wajib pakai nama file yang sama persis di folder id/ dan en/. src/content/blog/id/pindah-ke-astro.md dan src/content/blog/en/pindah-ke-astro.md harus cocok — kalau enggak, switcher bakal ngelink langsung ke 404. Saya pernah ngerasain ini sendiri: waktu nulis salah satu post soal insiden npm, saya sempet iseng ganti nama file versi Inggrisnya jadi lebih deskriptif, lupa kalau itu bakal misalign sama versi Indonesianya. Language switcher-nya langsung 404 pas dites, dan butuh beberapa menit buat sadar kenapa — bukan bug di kode-nya, tapi disiplin penamaan yang saya sendiri langgar.
Kenapa saya tetep terima trade-off ini
Simplicity. Nggak perlu maintain mapping table terpisah, nggak ada query database, nggak ada API call cuma buat nentuin URL padanan. Cukup disiplin penamaan file, dan itu sesuatu yang bisa saya enforce sendiri tanpa tooling tambahan — nggak ada CI check khusus buat ini, cuma kebiasaan.
Downside yang saya sadar dan belum saya benerin
Kalau suatu saat saya pengen slug English yang beda buat SEO keyword lokal — misalnya slug ID pakai istilah Indonesia, slug EN pakai istilah Inggris yang lebih sering dicari — saya harus refactor sistem ini jadi mapping eksplisit. Itu bukan perubahan kecil, karena berarti nambah satu layer resolusi URL yang sekarang sengaja nggak ada. Belum perlu sekarang karena skala blog masih kecil dan saya lebih milih konsistensi daripada optimasi prematur yang belum tentu kepake.
Constraint sederhana kayak “nama file harus sama” ini keliatan sepele, tapi itu justru yang bikin isi i18n-url.ts cuma belasan baris kode tanpa satupun dependency tambahan. Kalau nanti blog ini beneran butuh SEO slug yang berbeda per bahasa, saya udah tau persis apa yang harus diganti — tapi sampai itu beneran jadi masalah nyata, saya nggak akan buru-buru nambahin kompleksitas yang belum kepake.