Thursday

19-06-2025 Vol 19

How i18n in Next.js broke my route interceptors (and how I fixed it)

Bagaimana i18n di Next.js Merusak Route Interceptor Saya (Dan Bagaimana Saya Memperbaikinya)

Sebagai pengembang web, kami terus-menerus berusaha untuk membuat aplikasi yang ramah pengguna dan dapat diakses oleh audiens global. Salah satu cara untuk mencapai ini adalah melalui internasionalisasi (i18n), proses merancang dan mengembangkan aplikasi sehingga dapat diadaptasi ke berbagai bahasa dan wilayah tanpa perubahan teknik. Next.js, kerangka kerja React yang populer, menawarkan dukungan bawaan untuk i18n, membuatnya menjadi pilihan yang menarik bagi banyak pengembang.

Namun, seperti banyak hal dalam pengembangan perangkat lunak, mengimplementasikan i18n tidak selalu berjalan mulus. Dalam proyek terbaru, saya menemukan bahwa integrasi i18n di Next.js secara tak terduga merusak route interceptor saya, mekanisme yang kuat untuk mencegat dan memodifikasi rute secara dinamis. Dalam posting blog ini, saya akan berbagi pengalaman saya dengan masalah ini, menjelaskan penyebabnya, dan memberikan solusi langkah demi langkah untuk memperbaikinya. Tujuan saya adalah untuk menyelamatkan Anda dari rasa frustrasi yang sama dan memberdayakan Anda untuk mengatasi tantangan i18n di Next.js dengan percaya diri.

Daftar Isi

  1. Pendahuluan: Mengapa i18n dan Route Interceptor Penting?
  2. Latar Belakang: Proyek Saya dan Implementasi i18n Next.js
  3. Masalah: Route Interceptor Berhenti Bekerja Setelah i18n
  4. Investigasi: Mengapa i18n Mempengaruhi Route Interceptor?
  5. Solusi: Memperbaiki Route Interceptor dengan Strategi Rute Dinamis dan Middleware
  6. Penerapan Langkah-demi-Langkah: Kode dan Contoh Konfigurasi
  7. Pelajaran yang Dipetik: Praktik Terbaik untuk Menggabungkan i18n dan Route Interceptor
  8. Kesimpulan: Menavigasi Tantangan i18n di Next.js
  9. FAQ (Pertanyaan yang Sering Diajukan)

1. Pendahuluan: Mengapa i18n dan Route Interceptor Penting?

Sebelum kita membahas seluk-beluk masalah yang saya hadapi, mari kita tetapkan pemahaman yang jelas tentang mengapa i18n dan route interceptor adalah alat yang berharga dalam pengembangan web modern.

1.1. Pentingnya i18n (Internasionalisasi)

i18n, yang terkadang disingkat sebagai “i18n” karena ada 18 huruf di antara ‘i’ dan ‘n’, adalah proses merancang dan mengembangkan aplikasi web agar dapat diadaptasi ke berbagai bahasa dan wilayah. Ini melibatkan mengadaptasi aplikasi Anda untuk menampilkan teks, format tanggal, mata uang, dan elemen khusus budaya lainnya dengan cara yang bermakna dan relevan bagi pengguna di seluruh dunia.

Mengapa i18n penting? Berikut beberapa alasan utama:

  • Jangkauan Pengguna yang Lebih Luas: i18n memungkinkan Anda menjangkau audiens global, menghilangkan hambatan bahasa dan meningkatkan pengalaman pengguna bagi penutur asli.
  • Peningkatan Keterlibatan Pengguna: Pengguna lebih cenderung berinteraksi dengan aplikasi yang tersedia dalam bahasa mereka, menghasilkan peningkatan keterlibatan dan kepuasan.
  • Keunggulan Kompetitif: Menawarkan dukungan multibahasa dapat menjadi pembeda utama, memberi Anda keunggulan kompetitif di pasar global.
  • SEO yang Lebih Baik: Mengoptimalkan aplikasi Anda untuk berbagai bahasa dapat meningkatkan visibilitas pencarian Anda dan menarik lebih banyak lalu lintas organik.

1.2. Kekuatan Route Interceptor

Route interceptor, fitur yang tersedia di Next.js App Router, adalah mekanisme yang kuat untuk mencegat dan memodifikasi rute secara dinamis sebelum ditampilkan kepada pengguna. Mereka memungkinkan Anda untuk:

  • Membuat Modal dan Overlay: Tampilkan konten dalam modal atau overlay tanpa mengubah URL.
  • Melaksanakan Otentikasi dan Otorisasi: Verifikasi kredensial pengguna dan kontrol akses ke rute tertentu.
  • Melakukan Pengalihan Dinamis: Alihkan pengguna berdasarkan kondisi tertentu, seperti preferensi bahasa atau peran pengguna.
  • Mengimplementasikan Fitur Lanjutan: Buat pengalaman pengguna unik dengan memodifikasi rute secara dinamis.

Route interceptor memberi Anda fleksibilitas untuk memanipulasi perilaku perutean aplikasi Anda, memungkinkan Anda untuk membangun fitur dan pengalaman pengguna canggih.

2. Latar Belakang: Proyek Saya dan Implementasi i18n Next.js

Untuk memahami masalah yang saya hadapi, penting untuk menyediakan konteks tentang proyek saya dan bagaimana saya mengimplementasikan i18n di Next.js.

2.1. Gambaran Umum Proyek

Saya mengerjakan aplikasi e-commerce yang menampilkan berbagai produk dan memungkinkan pengguna untuk membeli barang secara online. Aplikasi ini dibangun menggunakan Next.js, dan saya memanfaatkan App Router untuk perutean dan pengelolaan tata letak.

Salah satu fitur penting dari aplikasi ini adalah kemampuan untuk menampilkan pratinjau gambar produk dalam modal tanpa menavigasi ke halaman baru. Saya mencapai ini dengan menggunakan route interceptor untuk mencegat rute untuk pratinjau gambar dan merender modal di atas halaman saat ini.

2.2. Implementasi i18n Next.js

Untuk menjangkau audiens global, saya memutuskan untuk mengimplementasikan i18n di aplikasi saya. Next.js menyediakan dukungan bawaan untuk i18n melalui file konfigurasi `next.config.js`. Saya mengonfigurasi aplikasi saya untuk mendukung dua bahasa: Inggris (en) dan Spanyol (es).

Berikut adalah cuplikan dari konfigurasi i18n saya di `next.config.js`:


  // next.config.js
  module.exports = {
    i18n: {
      locales: ['en', 'es'],
      defaultLocale: 'en',
    },
  };
  

Selain mengonfigurasi `next.config.js`, saya menggunakan perpustakaan `next-intl` untuk mengelola terjemahan dan menyediakan peralihan bahasa. `next-intl` menyediakan komponen dan hook yang nyaman untuk mengakses terjemahan dalam komponen Next.js saya.

Dengan i18n diimplementasikan, aplikasi saya berhasil menampilkan konten dalam bahasa Inggris dan Spanyol, berdasarkan preferensi bahasa pengguna.

3. Masalah: Route Interceptor Berhenti Bekerja Setelah i18n

Setelah i18n diintegrasikan ke dalam aplikasi saya, saya perhatikan perilaku yang aneh. Route interceptor, yang sebelumnya bekerja dengan sempurna untuk menampilkan pratinjau gambar produk dalam modal, berhenti berfungsi seperti yang diharapkan.

Ketika saya mencoba membuka pratinjau gambar, alih-alih melihat modal overlay, saya malah dialihkan ke halaman terpisah dengan URL pratinjau gambar. Ini adalah perilaku yang tidak diinginkan, karena saya ingin modal ditampilkan di atas halaman saat ini.

Awalnya, saya bingung dengan apa yang menyebabkan masalah ini. Route interceptor saya telah berfungsi dengan baik sebelum implementasi i18n. Mungkinkah i18n mengganggu mekanisme perutean?

4. Investigasi: Mengapa i18n Mempengaruhi Route Interceptor?

Untuk memahami mengapa i18n merusak route interceptor saya, saya perlu menyelidiki bagaimana Next.js menangani i18n dan bagaimana itu berinteraksi dengan perutean.

4.1. Next.js i18n dan Perutean

Ketika i18n diaktifkan di Next.js, kerangka kerja secara otomatis menambahkan awalan lokal ke setiap rute. Misalnya, jika Anda memiliki rute `/products`, Next.js akan membuat dua versi rute tersebut:

  • `/en/products` (untuk bahasa Inggris)
  • `/es/products` (untuk bahasa Spanyol)

Ini memastikan bahwa setiap bahasa memiliki serangkaian rutenya sendiri, memungkinkan Next.js untuk melayani konten yang benar berdasarkan preferensi bahasa pengguna.

Namun, perilaku ini juga memengaruhi cara route interceptor bekerja. Route interceptor bergantung pada pencocokan pola rute tertentu. Ketika i18n diaktifkan, pola rute yang digunakan oleh route interceptor Anda mungkin tidak lagi cocok dengan rute sebenarnya, karena awalan lokal ditambahkan.

4.2. Masalah dengan Pola Rute

Dalam kasus saya, route interceptor saya dikonfigurasi untuk mencegat rute `/products/[id]/preview`. Namun, dengan i18n diaktifkan, rute sebenarnya menjadi `/en/products/[id]/preview` atau `/es/products/[id]/preview`, tergantung pada bahasa yang dipilih.

Karena pola rute di route interceptor saya tidak cocok dengan rute sebenarnya, route interceptor tidak terpicu, dan modal pratinjau tidak ditampilkan.

5. Solusi: Memperbaiki Route Interceptor dengan Strategi Rute Dinamis dan Middleware

Setelah memahami penyebab masalah, saya dapat mengembangkan solusi untuk memperbaiki route interceptor saya dan memastikannya bekerja dengan baik dengan i18n.

Solusi saya melibatkan dua komponen utama:

  1. Pola Rute Dinamis: Perbarui pola rute di route interceptor Anda untuk memperhitungkan awalan lokal.
  2. Middleware untuk Pengalihan Lokal: Gunakan middleware untuk memastikan bahwa pengguna selalu dialihkan ke rute yang benar berdasarkan preferensi bahasa mereka.

5.1. Pola Rute Dinamis

Untuk memperbaiki masalah pencocokan rute, saya memodifikasi pola rute di route interceptor saya untuk menyertakan segmen bahasa opsional. Saya mencapai ini dengan menggunakan sintaks berikut:


  /([lang])?/products/[id]/preview
  

Pola ini cocok dengan rute dengan atau tanpa awalan bahasa. Segmen `([lang])?` adalah grup penangkap opsional yang cocok dengan kode bahasa (misalnya, `en` atau `es`). Tanda tanya (`?`) menunjukkan bahwa grup ini bersifat opsional.

Dengan memperbarui pola rute, route interceptor saya sekarang dapat mencegat rute `/products/[id]/preview`, `/en/products/[id]/preview`, dan `/es/products/[id]/preview`, memastikan bahwa modal pratinjau ditampilkan dengan benar dalam semua bahasa.

5.2. Middleware untuk Pengalihan Lokal

Untuk memastikan bahwa pengguna selalu dialihkan ke rute yang benar berdasarkan preferensi bahasa mereka, saya menggunakan middleware. Middleware di Next.js memungkinkan Anda untuk mencegat permintaan masuk dan respons sebelum diproses oleh aplikasi Anda.

Saya membuat file middleware (`middleware.js` atau `middleware.ts` di direktori `src`) dan menambahkan kode berikut:


  // middleware.js atau middleware.ts
  import { NextResponse } from 'next/server';
  import type { NextRequest } from 'next/server';

  const PUBLIC_FILE = /\.(.*)$/;

  export function middleware(request: NextRequest) {
    const pathname = request.nextUrl.pathname;

    const isPublicFileRequest =
      PUBLIC_FILE.test(pathname) || pathname.includes('/api/') || pathname.includes('/static/');

    if (
      isPublicFileRequest ||
      pathname.startsWith('/_next') ||
      pathname.includes('/favicon.ico')
    ) {
      return NextResponse.next();
    }

    const cookieLang = request.cookies.get('NEXT_LOCALE')?.value || 'en';

    if (pathname === '/') {
      return NextResponse.redirect(new URL(`/${cookieLang}`, request.url));
    }

    if (!pathname.startsWith(`/${cookieLang}`)) {
      try {
        return NextResponse.redirect(new URL(`/${cookieLang}${pathname}`, request.url));
      } catch (error) {
        console.error("Error redirecting:", error);
        return NextResponse.next(); // Don't break the app
      }
    }

    return NextResponse.next();
  }

  export const config = {
    matcher: ['/((?!_next).*)'],
  };
  

Middleware ini melakukan hal berikut:

  • Mencegat Setiap Permintaan: Ini mencegat setiap permintaan masuk ke aplikasi.
  • Memeriksa Kode Bahasa: Ini memeriksa cookie untuk melihat apakah pengguna telah memilih bahasa. Jika tidak, itu menggunakan bahasa default (Inggris).
  • Mengarahkan Ulang ke Rute Lokal: Jika rute saat ini tidak memiliki awalan bahasa, itu mengarahkan ulang pengguna ke rute yang sesuai dengan awalan bahasa.

Dengan menggunakan middleware, saya memastikan bahwa pengguna selalu dialihkan ke rute yang benar berdasarkan preferensi bahasa mereka, terlepas dari bagaimana mereka menavigasi ke aplikasi.

6. Penerapan Langkah-demi-Langkah: Kode dan Contoh Konfigurasi

Sekarang mari kita lihat lebih dekat langkah-langkah spesifik yang terlibat dalam menerapkan solusi yang dijelaskan di atas.

6.1. Memperbarui Route Interceptor

Untuk memperbarui route interceptor, Anda perlu memodifikasi pola rute di file `route.js` atau `route.ts` Anda. Berikut adalah contoh bagaimana Anda dapat melakukannya:


  // app/products/[id]/preview/route.js atau route.ts
  export async function GET(request, { params }) {
    const { id } = params;
    const searchParams = request.nextUrl.searchParams;
    const productId = searchParams.get('productId');

    // Logika untuk mendapatkan data pratinjau gambar berdasarkan ID produk
    const previewImage = await getPreviewImage(productId);

    return Response.json({ image: previewImage });
  }
  

Dalam contoh ini, kami menggunakan parameter `params` untuk mengakses ID produk dari rute dan parameter pencarian (`searchParams`) untuk mendapatkan ID produk yang sebenarnya.

Pastikan untuk memperbarui jalur file sesuai dengan struktur proyek Anda.

6.2. Mengonfigurasi Middleware

Untuk mengonfigurasi middleware, buat file bernama `middleware.js` atau `middleware.ts` di direktori `src` aplikasi Next.js Anda. Tempelkan kode yang diberikan di bagian 5.2 ke dalam file ini.

File `middleware.js` atau `middleware.ts` harus berada di direktori `src` di root proyek Next.js Anda.

6.3. next.config.js (Konfigurasi Tambahan)

Pastikan `next.config.js` Anda berisi konfigurasi i18n yang diperlukan.


  // next.config.js
  const nextConfig = {
    reactStrictMode: true,
    i18n: {
      locales: ['en', 'es'],
      defaultLocale: 'en',
      localeDetection: true,
    },
  }

  module.exports = nextConfig
  

Perhatikan bahwa `localeDetection` diatur ke `true`. Ini membantu Next.js untuk secara otomatis mendeteksi bahasa yang disukai pengguna berdasarkan header `Accept-Language`.

7. Pelajaran yang Dipetik: Praktik Terbaik untuk Menggabungkan i18n dan Route Interceptor

Setelah mengatasi tantangan i18n dan route interceptor, saya belajar beberapa pelajaran berharga yang ingin saya bagikan dengan Anda. Berikut adalah beberapa praktik terbaik untuk menggabungkan i18n dan route interceptor di Next.js:

  • Rencanakan i18n dari Awal: Jika Anda tahu bahwa Anda akan membutuhkan dukungan multibahasa di aplikasi Anda, rencanakan i18n dari awal. Ini akan membantu Anda menghindari masalah di masa mendatang.
  • Gunakan Pola Rute Dinamis: Ketika bekerja dengan route interceptor dan i18n, gunakan pola rute dinamis untuk memperhitungkan awalan bahasa.
  • Manfaatkan Middleware: Gunakan middleware untuk mengelola pengalihan bahasa dan memastikan bahwa pengguna selalu dialihkan ke rute yang benar.
  • Uji Secara Menyeluruh: Uji aplikasi Anda secara menyeluruh dalam semua bahasa yang didukung untuk memastikan bahwa i18n dan route interceptor bekerja seperti yang diharapkan.
  • Konsultasikan Dokumentasi: Merujuk ke dokumentasi resmi Next.js dan perpustakaan i18n yang Anda gunakan untuk praktik terbaik dan panduan pemecahan masalah.

8. Kesimpulan: Menavigasi Tantangan i18n di Next.js

Mengimplementasikan i18n di Next.js dapat menjadi tantangan, terutama ketika dikombinasikan dengan fitur-fitur canggih seperti route interceptor. Namun, dengan pemahaman yang jelas tentang bagaimana Next.js menangani i18n dan dengan menerapkan solusi yang tepat, Anda dapat mengatasi tantangan ini dan membangun aplikasi web global yang dapat diakses.

Dalam posting blog ini, saya telah berbagi pengalaman saya dengan bagaimana i18n di Next.js merusak route interceptor saya dan bagaimana saya memperbaikinya. Saya harap bahwa wawasan dan solusi yang saya berikan akan membantu Anda menghindari rasa frustrasi yang sama dan memberdayakan Anda untuk mengintegrasikan i18n ke dalam aplikasi Next.js Anda dengan percaya diri.

Ingatlah untuk merencanakan i18n dari awal, menggunakan pola rute dinamis, memanfaatkan middleware, dan menguji aplikasi Anda secara menyeluruh. Dengan mengikuti praktik terbaik ini, Anda dapat memastikan bahwa aplikasi Anda ramah pengguna dan dapat diakses oleh audiens global.

9. FAQ (Pertanyaan yang Sering Diajukan)

Berikut adalah beberapa pertanyaan yang sering diajukan tentang i18n dan route interceptor di Next.js:

  1. T: Bagaimana cara mengonfigurasi i18n di Next.js?

    J: Anda dapat mengonfigurasi i18n di Next.js dengan menambahkan konfigurasi `i18n` ke file `next.config.js` Anda. Anda perlu menentukan lokal yang didukung dan lokal default.

  2. T: Bagaimana cara mengakses lokal saat ini dalam komponen Next.js?

    J: Anda dapat mengakses lokal saat ini di komponen Next.js menggunakan hook `useRouter` dari `next/router` atau dengan menggunakan perpustakaan i18n khusus seperti `next-intl` yang menyediakan hook khusus untuk mengakses terjemahan dan informasi lokal.

  3. T: Bagaimana cara membuat rute khusus bahasa di Next.js?

    J: Next.js secara otomatis membuat rute khusus bahasa saat i18n diaktifkan. Misalnya, jika Anda memiliki rute `/products` dan mendukung bahasa Inggris (en) dan Spanyol (es), Next.js akan membuat rute `/en/products` dan `/es/products`.

  4. T: Bagaimana cara mengelola terjemahan di Next.js?

    J: Ada beberapa cara untuk mengelola terjemahan di Next.js. Anda dapat menggunakan file JSON, perpustakaan i18n, atau layanan terjemahan berbasis cloud. Pilih metode yang paling sesuai dengan kebutuhan dan preferensi Anda.

  5. T: Apa saja tantangan umum dalam mengimplementasikan i18n di Next.js?

    J: Beberapa tantangan umum dalam mengimplementasikan i18n di Next.js termasuk menangani format tanggal dan mata uang, menerjemahkan konten dinamis, dan mengelola pengalihan bahasa.

  6. T: Apakah ada perpustakaan atau alat yang dapat membantu dengan i18n di Next.js?

    J: Ya, ada beberapa perpustakaan dan alat yang tersedia yang dapat membantu dengan i18n di Next.js, seperti `next-intl`, `react-i18next`, dan `FormatJS`.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *