Ajukan pertanyaan Anda dan dapatkan ringkasan dokumen dengan merujuk halaman ini dan penyedia AI pilihan Anda
Konten halaman ini diterjemahkan menggunakan AI.
Lihat versi terakhir dari konten aslinya dalam bahasa InggrisJika Anda memiliki ide untuk meningkatkan dokumentasi ini, silakan berkontribusi dengan mengajukan pull request di GitHub.
Tautan GitHub ke dokumentasiSalin Markdown dokumentasi ke clipboard
next-intl VS Intlayer | Tolok Ukur Internasionalisasi (i18n) React & Next.js
next-intl adalah pilihan default untuk i18n di Next.js App Router saat ini: integrasi routing yang erat, dukungan penuh ICU MessageFormat, dan pengalaman pengembang yang akrab bagi siapa saja yang terbiasa dengan sistem i18n klasik.
Intlayer memikirkan ulang masalah ini dari dasar: tidak ada kamus terpusat, tidak perlu mencocokkan namespace dengan route secara manual. Konten dideklarasikan tepat di sebelah komponen, dan kompiler build-time hanya membundel apa yang benar-benar dibutuhkan oleh setiap halaman.
Artikel ini membandingkan keduanya berdasarkan data dari Benchmark Bloom, sebuah rangkaian pengujian sumber terbuka yang membangun aplikasi yang sama dengan masing-masing pustaka dan mencatat apa yang sebenarnya diunduh serta dieksekusi oleh peramban.
tl;dr:next-intlmenambahkan setidaknya +12.6 KB gzip di setiap halaman hanya untuk runtime-nya, dan membocorkan ~90% string halaman lain dalam pengaturan standarnya (staticdandynamic). Menghilangkan kebocoran tersebut mengharuskan pemisahan katalog ke dalam namespace dan memilihnya secara manual per halaman, sebuah pekerjaan rumit yang dihindari banyak tim. Sebaliknya, kompilerIntlayermenjamin kebocoran 0%, komponen 3x lebih kecil, dan hanya +0.3 KB di atas aplikasi dasar tanpa konfigurasi manual tambahan.
Ringkasan
- next-intl - Standar komunitas Next.js. Kamus JSON terpusat per bahasa, dukungan penuh ICU MessageFormat, dan integrasi mendalam dengan penanganan permintaan serta routing Next.js.
- Intlayer - Model konten yang berpusat pada komponen. File
.content.tsberada tepat di sebelah komponennya, kompiler build-time melakukan tree-shaking dan lazy loading per komponen dan per lokal, serta menghasilkan tipe TypeScript yang ketat secara otomatis.
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
Lencana diperbarui secara otomatis.
Perbandingan fitur berdampingan
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Fitur | Intlayer (react-intlayer / next-intlayer) | next-intl (next-intl / use-intl) |
|---|---|---|
| Terjemahan dekat komponen | ✅ Ya, .content.ts berada di samping setiap komponen | ❌ Kamus JSON terpusat di folder messages/ |
| Integrasi TypeScript | ✅ Tipe ketat dihasilkan otomatis dari konten | ⚠️ Didukung lewat konfigurasi manual global.d.ts |
| Deteksi terjemahan yang hilang | ✅ Error TypeScript + error/peringatan saat build | ⚠️ Runtime mengembalikan kunci atau melempar error tergantung konfigurasi |
| Konten kaya (JSX / Markdown / komponen) | ✅ Dukungan langsung | ⚠️ Melalui t.rich() dengan pemetaan komponen |
| Dukungan ICU MessageFormat | ⚠️ Sedang dikembangkan | ✅ Ya, dukungan penuh ICU |
| Komponen server sinkron | ✅ useIntlayer dari next-intlayer/server bekerja di komponen server turunan | ❌ Memerlukan penerusan terjemahan melalui props dari server asinkron |
| Tree-shaking | ✅ Otomatis per komponen dan per lokal | ⚠️ Memerlukan pemisahan namespace manual dan penggunaan pick() |
| Pemuatan lambat (Lazy loading) | ✅ Satu baris konfigurasi (importMode: 'dynamic') | ⚠️ Memerlukan impor dinamis manual di getRequestConfig |
| Visual Editor / CMS | ✅ Visual Editor gratis + CMS opsional | ❌ Tidak ada |
| Terjemahan bertenaga AI | ✅ Terintegrasi, menggunakan kunci API Anda sendiri | ❌ Tidak ada |
| Server MCP & Keterampilan Agen | ✅ Ya | ❌ Tidak ada |
Tolok ukur
Apa yang diukur
Rangkaian pengujian Benchmark Bloom membangun aplikasi yang sama dengan setiap pustaka: 10 halaman (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), 10 lokal (en, fr, es, de, it, pt, zh, ja, ko, ru), komponen identik, dan konten identik. Halaman diukur dalam en dan fr. Setiap pustaka diuji hingga empat strategi pemuatan:
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Strategi | Deskripsi | Siapa yang menggunakan |
|---|---|---|
| static | Semua lokal dan semua halaman dibundel bersama di awal | Prototipe cepat, kode hasil AI |
| dynamic | Hanya lokal aktif yang dimuat, tetapi semua halaman sekaligus | Mayoritas proyek |
| scoped-static | Namespace per rute, tanpa lazy loading | Jarang |
| scoped-dynamic | Namespace per rute + lazy loading. Hanya halaman aktif pada lokal aktif yang dikirim | Aplikasi dengan anggaran kinerja ketat |
Intlayer tidak memerlukan varian "scoped": kompiler otomatis membatasi konten per komponen, sehingga baris static dan dynamic sudah ter-scope secara bawaan.
Untuk setiap build, pengujian mencatat:
- Ukuran pustaka (Lib size): ukuran gzip dari komponen kosong yang hanya mengimpor pustaka i18n.
- JS Halaman (Page JS): JavaScript gzip terunduh per halaman.
- % kebocoran lokal (Locale leak %): proporsi string yang bukan milik lokal yang sedang aktif.
- % kebocoran halaman (Page leak %): proporsi string yang bukan milik halaman yang sedang diakses.
- Rata-rata komponen (Component avg): ukuran gzip rata-rata dari setiap komponen yang dikompilasi terisolasi.
- Reaktivitas E2E: waktu antara pergantian lokal hingga pembaruan
html[lang]di DOM. - Hidrasi: durasi fase hidrasi React.
Angka di bawah ini berasal dari pengujian bertanggal 2026-09-12 dengannext-intl4.14.2 danintlayer9.5.1.
Hasil pada Next.js (App Router)
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Pustaka | Strategi | Ukuran Lib (gz) | Rata-rata JS Halaman (gz) | Bocor Lokal | Bocor Halaman | Rata-rata Komponen (gz) | Reaktivitas E2E | Hidrasi |
|---|---|---|---|---|---|---|---|---|
| base (tanpa i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
next-intl | static | 14.7 KB | 153.6 KB | 4.2% | 89.8% | 21.8 KB | 16.0 ms | 14.7 ms |
next-intl | dynamic | 14.7 KB | 153.6 KB | 9.7% | 89.9% | 21.8 KB | 15.6 ms | 14.8 ms |
next-intl | scoped-static | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 80.1 KB | 17.9 ms | 17.4 ms |
next-intl | scoped-dynamic | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 22.9 KB | 17.8 ms | 16.8 ms |
next-intlayer | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
next-intlayer | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
@intlayer/next-intl (kompat) | static | 8.0 KB | 147.5 KB | 0.0% | 0.0% | 8.1 KB | 14.5 ms | 12.8 ms |
@intlayer/next-intl (kompat) | dynamic | 8.0 KB | 148.7 KB | 0.0% | 0.0% | 8.1 KB | 11.7 ms | 12.8 ms |
Cara membaca hasil
- Biaya runtime. Aplikasi dasar berukuran 141.0 KB per halaman.
next-intlmeningkatkannya menjadi 153.6 KB (+12.6 KB gzip di setiap halaman), sedangkan Intlayer hanya 141.3 KB (+0.3 KB). - Kebocoran. Dalam pengaturan yang paling sering digunakan (
staticdandynamic),next-intlmengirimkan ~90% string halaman lain di setiap halaman, karena seluruhen.jsonmasuk ke penyedia klien. Menghilangkannya membutuhkan pekerjaan pemisahan manual yang teliti. Intlayer langsung 0% secara otomatis. - Ukuran komponen. Komponen yang memanggil
useTranslations()menghasilkan rata-rata 21.8 KB; komponen yang sama denganuseIntlayer()hanya 6.9 KB.
Hasil pada TanStack Start (use-intl)
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Pustaka | Strategi | Ukuran Lib (gz) | Rata-rata JS Halaman (gz) | Bocor Lokal | Bocor Halaman | Rata-rata Komponen (gz) | Reaktivitas E2E |
|---|---|---|---|---|---|---|---|
| base (tanpa i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms |
use-intl | static | 14.1 KB | 179.8 KB | 50.0% | 89.8% | 76.0 KB | 6.7 ms |
use-intl | dynamic | 14.1 KB | 119.4 KB | 0.0% | 89.8% | 75.9 KB | 7.0 ms |
use-intl | scoped-static | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 20.9 ms |
use-intl | scoped-dynamic | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 13.3 ms |
intlayer | static | 5.0 KB | 125.8 KB | 50.0% | 0.0% | 8.1 KB | 3.2 ms |
intlayer | dynamic | 5.0 KB | 118.6 KB | 0.0% | 0.0% | 6.3 KB | 3.6 ms |
@intlayer/use-intl (kompat) | dynamic | 7.3 KB | 129.7 KB | 0.0% | 0.0% | 9.3 KB | 8.7 ms |
Cara membaca hasil
- Pengaturan sederhana
use-intlmengirimkan 68.8 KB lebih banyak JS per halaman dibandingkan aplikasi dasar. - Dalam mode
dynamic,use-intlmencapai 119.4 KB, namun masih membawa 89.8% kebocoran halaman. - Perbedaan arsitektur sangat terlihat pada ukuran komponen: 76-87 KB pada
use-intlberbanding 6-8 KB pada Intlayer. - Pergantian lokal 2x-4x lebih cepat dengan Intlayer (3 ms vs 7-21 ms).
Mengapa ada perbedaan? Katalog terpusat vs kamus terkompilasi
next-intl mengikuti model klasik: satu JSON per lokal, dimuat dalam getRequestConfig, diteruskan ke NextIntlClientProvider, dan dibaca lewat t("namespace.key").
Salin kode ke clipboard
Runtime tidak dapat memprediksi kunci apa yang akan digunakan halaman, sehingga mengirimkan seluruh katalog adalah langkah paling aman.
Intlayer membalikkan model tersebut. Konten dideklarasikan langsung di sebelah komponen:
Salin kode ke clipboard
Saat build, kompiler melihat komponen mana yang mengimpor kamus mana, dan hanya membundel kamus tersebut untuk lokal yang aktif.
Untuk mendapatkan angka pada barisdynamic, aturdictionary.importMode: 'dynamic'diintlayer.config.ts. Lihat panduan optimasi bundle.
Pengalaman pengembang
Komponen klien
next-intl
Salin kode ke clipboard
Salin kode ke clipboard
Intlayer
Salin kode ke clipboard
Salin kode ke clipboard
Komponen server sinkron
Elemen UI bersama (navbar, footer, kartu) sering kali merupakan komponen server yang dirender sebagai anak dari komponen klien, sehingga tidak boleh bersifat async.
next-intl
Salin kode ke clipboard
Intlayer
Salin kode ke clipboard
Metadata
next-intl
Salin kode ke clipboard
Intlayer
Salin kode ke clipboard
Pertahankan API next-intl, dapatkan hasil Intlayer
Anda tidak perlu menulis ulang komponen untuk mendapatkan angka performa di atas. Paket @intlayer/next-intl adalah adaptor siap pakai: ia mempertahankan useTranslations, getTranslations, useFormatter, t.rich(), dan bentuk jamak ICU, sambil menyajikannya dari kamus Intlayer yang dikompilasi oleh kompiler Intlayer.
Salin kode ke clipboard
Dalam pengujian, build kompatibilitas dari aplikasi yang sama turun dari 153.6 KB ke 147.5 KB per halaman, ukuran komponen turun dari 21.8 KB ke 8.1 KB, dan kebocoran halaman turun dari ~90% ke 0%, tanpa mengubah kode aplikasi. File messages/{locale}.json yang ada dapat tetap menjadi sumber data utama melalui plugin sinkronisasi JSON.
Lihat panduan migrasi next-intl untuk langkah-langkah detailnya.
Kapan harus memilih yang mana?
- Pilih next-intl jika Anda menginginkan standar komunitas Next.js yang luas, sangat bergantung pada ICU MessageFormat, aplikasi Anda berskala kecil hingga menengah, atau Anda terintegrasi dengan platform penerjemahan eksternal (Crowdin, Phrase, Lokalise...).
- Pilih Intlayer jika Anda menginginkan konten dengan cakupan komponen, TypeScript yang ketat, deteksi error kunci yang hilang saat build, tree-shaking dan lazy loading tanpa konfigurasi, komponen server sinkron, dan alat redaksi bawaan (Visual Editor, CMS, terjemahan AI, server MCP).
- Pilih
@intlayer/next-intljika Anda sudah menggunakannext-intldan ingin peningkatan ukuran bundle tanpa menulis ulang aplikasi.
Perbandingan terkait
- i18next vs Intlayer (tolok ukur yang sama)
- Lingui vs Intlayer (tolok ukur yang sama)
- Tolok ukur vue-i18n vs Intlayer (tolok ukur yang sama)
- next-i18next vs next-intl vs Intlayer
- Apakah next-intl sudah ketinggalan zaman?
Bintang GitHub
Bintang GitHub adalah indikator kuat dari popularitas proyek, kepercayaan komunitas, dan prospek jangka panjang.
Kesimpulan
next-intl adalah pustaka yang solid dan dirawat dengan baik, dan pengujian mengonfirmasi bahwa pustaka ini merupakan pilihan yang baik di Next.js. Namun model katalog terpusat membebankan setiap optimasi kepada pengembang: pengaturan sederhana membocorkan sekitar 90% konten halaman lain, dan runtime-nya sendiri berbiaya +12.6 KB gzip pada setiap halaman.
Intlayer memindahkan semua pekerjaan itu ke kompiler. Kamus per komponen, lazy loading per lokal, dan pembersihan konten yang tidak terpakai adalah output build otomatis. Hasilnya pada aplikasi yang sama: +0.3 KB per halaman, 0% kebocoran, komponen 3x lebih kecil, dan pergantian lokal 2x-4x lebih cepat pada TanStack Start.
Semua data mentah, aplikasi pengujian, dan skrip tersedia di repositori Benchmark Bloom. Anda dapat menjalankannya sendiri.
Lihat dokumen 'Mengapa Intlayer?' untuk detail lebih lanjut.
Komentar
Belum ada komentar. Jadilah yang pertama membagikan pemikiran Anda.
