Locale Redirect
Deserve tidak punya middleware locale redirect. Memilih bahasa dari request dan mengirim pengunjung ke path yang cocok adalah pembacaan singkat satu header diikuti redirect, jadi ia tinggal di rute yang memiliki keputusan itu.
Kenapa Tidak Dibawa
Sebuah locale redirect memeriksa bahasa pilihan pengunjung dan meneruskan path telanjang seperti / ke yang terlokalisasi seperti /en atau /id. Framework sering membawa ini sebagai middleware yang berjalan di setiap request, yang berarti satu aturan untuk seluruh aplikasi dan redirect pada path yang mungkin tak membutuhkannya.
Pilihan bahasa adalah keputusan produk, bukan aturan transport. Locale mana yang ada, apa default-nya, dan apakah cookie menimpa petunjuk browser semuanya berbeda per aplikasi. Membiarkannya di rute menjaga keputusan itu terlihat dan mudah diubah, sejalan dengan bangun di atas platform.
Membaca Preferensi
Browser mengirim daftar bahasanya di header Accept-Language, dibaca lewat ctx.header. Sebuah pencocokan kecil terhadap locale yang didukung aplikasi memberi targetnya, lalu ctx.send.redirect mengirim pengunjung ke sana.
export function GET(ctx: Context): Response {
// Baca petunjuk bahasa browser
const header = ctx.header('accept-language') ?? ''
const supported = ['en', 'id']
// Cocokkan locale didukung atau default
const preferred = header.split(',')[0]?.slice(0, 2) ?? 'en'
const locale = supported.includes(preferred) ? preferred : 'en'
// Kirim ke path terlokalisasi
return ctx.send.redirect(`/${locale}`, 302)
}Sebuah 302 menjaga redirect tetap sementara, jadi kunjungan berikutnya tetap bisa dicocokkan lagi. Untuk perpindahan tetap yang patut di-cache, ctx.send.redirect menerima 301 dan status standar lainnya.
Berbagi Pilihan dengan Rute Berikutnya
Ketika beberapa rute butuh locale yang diresolusi, middleware bisa meresolusinya sekali dan menyimpannya di ctx.state alih-alih redirect, jadi tiap handler membaca nilai yang sama.
router.use(async (ctx, next) => {
// Resolusi locale sekali per request
const header = ctx.header('accept-language') ?? ''
const preferred = header.split(',')[0]?.slice(0, 2) ?? 'en'
// Bagikan ke route handler
ctx.state.locale = ['en', 'id'].includes(preferred) ? preferred : 'en'
return await next()
})
await router.serve(8000)Bentuk redirect mengirim pengunjung ke URL terlokalisasi, sementara bentuk state menjaga satu URL dan mengoper locale ke dalam. Keduanya tinggal di file rute polos, jadi aturannya ada di mana bahasa penting dan tak di tempat lain.