Ajukan pertanyaan Anda dan dapatkan ringkasan dokumen dengan merujuk halaman ini dan penyedia AI pilihan Anda
Riwayat Versi
- "Versi awal"v9.5.1026/9/2026
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
Cara Menginternasionalisasi Aplikasi Next.js Anda Menggunakan Lingui pada Tahun 2026
Daftar Isi
Apa itu Lingui?
Lingui adalah pustaka i18n yang dibangun di sekitar makro dan ekstraksi pesan. Anda menulis teks sumber di dalam komponen Anda ( t`Hello` , <Trans>Hello</Trans>), lingui extract mengumpulkan setiap pesan ke dalam katalog (file PO secara default), dan sebuah loader mengompilasinya menjadi JavaScript yang ringkas. Pesan menggunakan format ICU MessageFormat, dan Lingui mendukung React Server Components di App Router.
Panduan ini menyiapkan Lingui dalam proyek Next.js 16 App Router, dengan:
- Makro yang dikompilasi oleh SWC, sehingga Turbopack tetap mempertahankan kecepatannya.
- Server dan Client Components berbagi API
TransdanuseLinguiyang sama. - Perutean lokal (locale routing) melalui
proxy.ts:/aboutuntuk lokal default,/fr/aboutuntuk lokal lainnya, serta deteksi bahasa pada kunjungan pertama. - Rendering statis untuk setiap lokal dengan
generateStaticParams. - SEO multibahasa yang lengkap:
generateMetadatayang diterjemahkan, canonical,hreflangdenganx-default, Open Graph locales, JSON-LD,sitemap.ts,robots.ts, dan halaman 404 yang dilokalkan.
Mencari pustaka lain? Lihat panduan next-intl, panduan next-i18next, atau panduan Next.js + Intlayer.
Menggunakan TanStack Start? Lihat panduan TanStack Start + Lingui. Ingin membandingkan pustaka? Baca Lingui vs Intlayer dan next-i18next vs next-intl vs Intlayer.
Apa yang Dikatakan Tolok Ukur (Benchmark) Mengenai Lingui di Next.js
Tolok ukur i18n menjalankan aplikasi Next.js 10 halaman dan 10 lokal yang sama dengan setiap pustaka utama dan mengukur apa yang sebenarnya diunduh oleh peramban.
Pemuatan JSON dinamis
Memuat terjemahan secara lambat saat runtime
JSON cakupan (namespacing)
Namespace terjemahan per halaman
Tolok Ukur Performa I18n
Apa metrik ini?
Total ukuran kompresi gzip dari bundel pustaka internasionalisasi. Ini hanya mencakup penyedia dan logika pengambilan konten setelah tree-shaking dan minifikasi.
Mengapa ini penting?
Ukuran pustaka yang lebih kecil mengurangi muatan JavaScript awal, yang mengarah pada waktu unduh dan eksekusi yang lebih cepat pada klien.
Lihat sebagai
Angka-angka penting untuk @lingui/core@6.6.0 di Next.js 16, diukur pada 2026-09-26 (gzip):
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Pengaturan | Ukuran pustaka | JS per halaman | Kebocoran lokal lain | Kebocoran halaman lain |
|---|---|---|---|---|
| Tanpa i18n (aplikasi dasar) | - | 141.0 KB | 0% | 0% |
| Lingui, satu katalog per lokal | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (kompatibel) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (Intlayer natif) | 4.9 KB | 141.5 KB | 0% | 0% |
Poin penting yang perlu diperhatikan:
- Satu katalog per lokal masih membocorkan pesan halaman lain ke penyedia (provider) klien. Simpan teks sebanyak mungkin di Server Components, yang mengirimkan HTML hasil render, bukan katalog pesan.
- Runtime Lingui berbobot ~72 KB gzip. Adaptor kompatibilitas
@intlayer/linguimemangkas ukuran runtime menjadi ~11 KB, tetapi dalam tolok ukur ini pengaturan kompatibilitas Next.js masih mengirimkan seluruh katalog ke halaman. API bawaannext-intlayeradalah pengaturan yang tetap berada pada ukuran aplikasi dasar.
Lihat data selengkapnya: Laporan tolok ukur Next.js, dan repositori tolok ukur.
Perbandingan Fitur di Next.js
Perbandingan Lingui dengan next-intl dan Intlayer pada fitur-fitur yang biasanya dibutuhkan oleh proyek Next.js App Router:
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Fitur | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| Terjemahan dekat dengan komponen | ✅ Konten ditempatkan bersama setiap komponen | ⚠️ Teks sumber dalam komponen, katalog terpusat | ❌ JSON terpusat |
| Integrasi TypeScript | ✅ Tipe ketat yang dibuat otomatis | ⚠️ Makro memiliki tipe, katalog pesan tidak | ✅ Bagus, melalui augmentasi AppConfig |
| Deteksi terjemahan yang hilang | ✅ Kesalahan TypeScript dan peringatan saat build | ⚠️ Fallback runtime ke teks sumber | ⚠️ Fallback runtime |
| Konten kaya (JSX, Markdown) | ✅ Dukungan langsung | ✅ JSX di dalam <Trans>, tidak ada Markdown | ⚠️ Tag melalui t.rich, tidak ada Markdown |
| Terjemahan AI | ✅ Menggunakan penyedia dan kunci API Anda sendiri, dengan konteks aplikasi | ❌ Tidak | ❌ Tidak |
| Editor visual / CMS | ✅ Editor visual lokal + CMS opsional | ❌ Melalui platform eksternal | ❌ Melalui platform eksternal |
| Perutean terlokalisasi | ✅ Bawaan | ❌ Tulis proxy.ts Anda sendiri | ✅ Segmen [locale] bawaan |
| Pluralisasi | ✅ Berbasis enumerasi | ✅ ICU, makro <Plural> | ✅ ICU |
| Format konten | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Melalui format: "icu" | ✅ Natif | ✅ Natif |
| Pembantu SEO (hreflang, sitemap) | ✅ Pembantu metadata, sitemap, dan robots.txt | ❌ Manual | ✅ Bagus |
| Server Components | ✅ Akses langsung di Server Component apa pun | ⚠️ setI18n di setiap layout dan page | ⚠️ await getTranslations() per komponen |
| Tree-shaking per komponen | ✅ Pada saat build (Babel / SWC) | ⚠️ Satu katalog per lokal, ekstraktor per halaman masih eksperimental | ⚠️ Manual, dengan pick() per rute |
| Ukuran runtime (gzip, benchmark) | 4.9 KB | 72.1 KB | 14.7 KB |
| Terjemahan hilang di CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Tidak tersedia secara bawaan |
| Ekosistem / komunitas | ⚠️ Lebih kecil, berkembang pesat | ✅ Matang | ✅ Besar |
Ukuran runtime bersumber dari Tolok ukur Next.js. Untuk pembahasan mendalam, baca Lingui vs Intlayer.
Panduan Next.js lainnya: next-intl, next-i18next, dan Intlayer.
Praktik Terbaik yang Harus Anda Ikuti
- Tetapkan
langdandirpada tag<html>di dalam layout[locale]. - Utamakan Server Components untuk teks: komponen ini merender HTML di server dan tidak memerlukan katalog pesan di sisi klien.
- Panggil
initLingui(locale)di setiap layout dan page. Layout tidak merender ulang saat navigasi, sehingga sebuah halaman tidak dapat mengandalkan layout-nya untuk menyetel lokal. - Pertahankan satu URL per lokal dan lakukan pra-render setiap lokal dengan
generateStaticParams. - Terjemahkan metadata Anda di dalam
generateMetadata, lengkap dengancanonical,hreflang, danx-default. - Buat sitemap dan robots.txt multibahasa dengan konvensi
sitemap.tsdanrobots.ts. - Gunakan tautan nyata untuk pengalih bahasa, agar mesin perayap (crawler) dapat menemukan setiap versi bahasa.
- Jalankan
lingui extractdi CI agar pesan baru tidak pernah terkirim ke produksi dalam keadaan belum diterjemahkan.
Lihat panduan kami tentang internasionalisasi dan SEO, panduan hreflang, dan perbandingan SEO multibahasa Next.js.
Panduan Langkah demi Langkah untuk Menyiapkan Lingui di Aplikasi Next.js
Berikut adalah struktur proyek yang akan kita buat:
Salin kode ke clipboard
Instal Dependensi
bashSalin kodeSalin kode ke clipboard
- @lingui/core / @lingui/react: runtime,
I18nProvider,setI18nuntuk Server Components, serta makro (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin: mengompilasi makro di dalam pipeline Next.js SWC.
- @lingui/loader: mengompilasi katalog
.posaat diimpor, sehinggalingui compiletidak diperlukan. - @lingui/cli:
lingui extractuntuk mengumpulkan pesan ke dalam katalog.
@lingui/swc-pluginadalah plugin WebAssembly yang terikat pada versi SWC Next.js. Jika build gagal setelah pembaruan Next.js, perbarui plugin ke versi yang terdaftar kompatibel di README-nya.- @lingui/core / @lingui/react: runtime,
Pusatkan Konfigurasi Lokal Anda
Satu file menentukan lokal dan fungsi pembantu URL. Perutean, metadata, sitemap, dan Lingui semuanya membaca dari file ini.
src/i18n/config.tsSalin kodeSalin kode ke clipboard
Konfigurasikan Lingui dan Next.js
lingui.config.tsSalin kodeSalin kode ke clipboard
Plugin SWC mengompilasi makro, dan loader mengompilasi file
.po, baik untuk Turbopack (default di Next.js 16) maupun webpack:next.config.tsSalin kodeSalin kode ke clipboard
Tambahkan skrip ekstraksi:
package.jsonSalin kodeSalin kode ke clipboard
Muat Katalog dan Buat Instance Server
Server Components tidak memiliki React context, sehingga Lingui menyediakan
setI18nuntuk mendaftarkan instance pada render saat ini. Modul ini memuat setiap katalog satu kali per proses server dan membuat satu instanceI18nper lokal. Modul ini bersifatserver-only: katalog dari lokal lain tidak akan pernah masuk ke dalam bundel klien.src/i18n/appRouterI18n.tsSalin kodeSalin kode ke clipboard
src/i18n/initLingui.tsSalin kodeSalin kode ke clipboard
Agar TypeScript mengenali impor
.po, deklarasikan modul ini satu kali:src/i18n/po.d.tsSalin kodeSalin kode ke clipboard
Buat Provider Klien
Client Components membaca terjemahan dari React context. Provider menerima katalog dari lokal aktif dari layout server, dan membuat instance-nya sendiri satu kali.
src/components/LinguiClientProvider.tsxSalin kodeSalin kode ke clipboard
Definisikan Rute Lokal Dinamis
Segmen
[locale]menampung root layout.generateStaticParamsmelakukan pra-render setiap lokal saat waktu build, dandynamicParams = falsemengembalikan respons 404 untuk setiap awalan lainnya.src/app/[locale]/layout.tsxSalin kodeSalin kode ke clipboard
Provider klien menerima seluruh katalog dari lokal aktif. Inilah yang diukur oleh tolok ukur sebagai "kebocoran halaman lain". Menyimpan teks di Server Components akan membatasi apa yang benar-benar dibutuhkan oleh klien. Untuk aplikasi besar, ekstraktor per halaman eksperimental Lingui (
experimental.extractordilingui.config.ts) dapat membagi katalog berdasarkan titik masuk (entry point).Gunakan Terjemahan di Server Components
Server Components menggunakan makro yang sama dengan Client Components.
initLinguijuga harus dijalankan di halaman, karena layout tidak merender ulang saat berpindah antar halaman di dalamnya.src/app/[locale]/about/page.tsxSalin kodeSalin kode ke clipboard
Gunakan Terjemahan di Client Components
Client Components menggunakan impor yang sama. Makro membaca instance dari
LinguiClientProvider.src/components/Counter.tsxSalin kodeSalin kode ke clipboard
Ekstrak dan Terjemahkan Pesan Anda
Jalankan ekstraksi. Lingui menulis setiap pesan yang ditemukan di
srcke dalam setiap katalog lokal:bashSalin kodeSalin kode ke clipboard
Kemudian terjemahkan nilai
msgstrpada setiap entri:src/locales/fr/messages.poSalin kodeSalin kode ke clipboard
src/locales/es/messages.poSalin kodeSalin kode ke clipboard
Placeholder
<0>menjaga posisi elemen JSX dari<Trans>, sehingga penerjemah dapat memindahkannya tanpa merusak markup.Siapkan Proxy untuk Perutean Lokal
OpsionalNext.js 16 mengubah nama
middleware.tsmenjadiproxy.ts. Proxy menerapkan strategi awalan "sesuai kebutuhan" (as-needed):/fr/aboutdisajikan sebagaimana adanya;/en/aboutmengalihkan ke/about, sehingga lokal default memiliki satu URL tunggal;/aboutditulis ulang secara internal ke/en/about, tanpa mengubah URL;- kunjungan pertama ke
/mengalihkan ke bahasa yang diinginkan (cookie terlebih dahulu, kemudianAccept-Language).
src/i18n/negotiateLocale.tsSalin kodeSalin kode ke clipboard
src/proxy.tsSalin kodeSalin kode ke clipboard
Ubah Bahasa Konten Anda
OpsionalusePathnamemengembalikan URL yang dilihat oleh peramban (/aboutatau/fr/about). Hapus lokal, lalu bangun tautan untuk setiap bahasa. Pengalih bahasa merender tautan nyata, sehingga mesin perayap dapat menjangkau setiap versi bahasa, dan cookie akan mengingat pilihan eksplisit tersebut.src/components/LocaleSwitcher.tsxSalin kodeSalin kode ke clipboard
Bangun Komponen LocalizedLink
Opsionalsrc/components/LocalizedLink.tsxSalin kodeSalin kode ke clipboard
Komponen ini juga berfungsi dari Server Components karena dirender di dalam
LinguiClientProvider:tsxSalin kodeSalin kode ke clipboard
Internasionalisasi Metadata Anda
OpsionalSetiap versi bahasa dapat memiliki peringkat SEO mandiri, asalkan setiap halaman menyediakan:
titledandescriptionyang diterjemahkan;- URL kanonikal yang mengarah ke dirinya sendiri;
- satu alternatif
hreflangper lokal, ditambahx-default; locale,alternateLocale, danurlpada Open Graph;- JSON-LD dengan
inLanguage.
generateMetadataberjalan di luar React tree, sehingga menggunakan instance server secara langsung dengan makromsg:src/i18n/metadata.tsSalin kodeSalin kode ke clipboard
src/app/[locale]/about/page.tsxSalin kodeSalin kode ke clipboard
JSON-LD dirender oleh halaman itu sendiri. File halaman hanya boleh mengekspor bidang Next.js, jadi simpan komponen ini di filenya sendiri:
src/components/WebPageJsonLd.tsxSalin kodeSalin kode ke clipboard
src/app/[locale]/about/page.tsxSalin kodeSalin kode ke clipboard
Internasionalisasi Sitemap Anda
OpsionalKonvensi
sitemap.tsmendukungalternates.languages, yang dirender Next.js sebagai alternatifxhtml:link. Daftarkan setiap URL dari setiap lokal:src/app/sitemap.tsSalin kodeSalin kode ke clipboard
Internasionalisasi robots.txt Anda
OpsionalRute privat ada di setiap bahasa, sehingga
disallowharus mencakup setiap jalur terlokalisasi:src/app/robots.tsSalin kodeSalin kode ke clipboard
Tangani Halaman 404 Terlokalisasi
Opsionalnot-found.tsxdirender di dalam layout[locale], sehingga memiliki akses ke provider klien. Rute catch-all mengarahkan jalur yang tidak dikenal di dalam lokal ke file tersebut. Next.js menambahkannoindexke respons 404 secara otomatis.src/app/[locale]/not-found.tsxSalin kodeSalin kode ke clipboard
src/app/[locale]/[...rest]/page.tsxSalin kodeSalin kode ke clipboard
Akses Lokal di Server Actions
OpsionalServer Actions tidak menerima parameter rute. Pendekatan yang paling andal adalah mengirimkan lokal bersama formulir, dari halaman yang mengetahuinya:
src/app/[locale]/contact/page.tsxSalin kodeSalin kode ke clipboard
src/app/actions/sendContactMessage.tsSalin kodeSalin kode ke clipboard
Pertahankan Makro Anda, Pangkas Runtime dengan Intlayer
OpsionalAdaptor kompatibilitas
@intlayer/linguimempertahankan kode sumber Anda tanpa perubahan: makro dikompilasi seperti sebelumnya, dan panggilani18n._(),useLingui(), serta<Trans>yang dihasilkan dilayani oleh kamus Intlayer. Dalam tolok ukur Next.js, ukuran runtime turun dari ~72.1 KB menjadi ~10.7 KB gzip.Pada Next.js, adaptor ini dihubungkan dengan membuat alias
@lingui/coredan@lingui/reactke@intlayer/linguidinext.config.ts(webpack dan Turbopack), dan membungkus konfigurasi denganwithIntlayerdarinext-intlayer/server. Pertahankan@lingui/swc-pluginagar makro tetap dikompilasi terlebih dahulu. Konfigurasi lengkap ada di panduan kompatibilitas Lingui.Seperti yang ditunjukkan tabel tolok ukur, adaptor ini mengurangi ukuran runtime tetapi belum mengurangi katalog yang dikirimkan ke setiap halaman di Next.js. Adaptor ini paling tepat digunakan sebagai jembatan migrasi: setelah berjalan, pindahkan komponen satu per satu ke API bawaan
useIntlayer, yang hanya mengirimkan konten yang dirender oleh masing-masing komponen. Lihat panduan Next.js + Intlayer, Lingui vs @intlayer/lingui, dan semua adaptor kompatibilitas.Otomatiskan Terjemahan Anda Menggunakan Intlayer
OpsionalLingui mengekstrak pesan, tetapi mengisi puluhan katalog secara manual adalah proses yang paling memakan waktu. Intlayer bersifat gratis dan sumber terbuka (open source), dan perkakasnya bekerja berdampingan dengan Lingui:
- Terjemahkan dengan AI menggunakan kunci API dan penyedia Anda sendiri. Lihat pengisian otomatis (auto fill) dan CLI.
- Pertahankan file PO Anda sebagai sumber kebenaran tunggal dengan plugin sinkronisasi PO.
- Uji terjemahan yang hilang di CI. Lihat menguji terjemahan Anda.
- Audit situs Anda yang telah di-deploy untuk memeriksa
hreflangyang hilang, canonical yang salah, dan kebocoran lokal dengan perintah scan.
Pertanyaan yang Sering Diajukan
Ya. @lingui/react mendukung React Server Components. Server Components mendaftarkan instance dengan setI18n dari @lingui/react/server, Client Components membacanya dari I18nProvider, dan keduanya menggunakan makro Trans serta useLingui yang sama.
Server Components tidak memiliki context, sehingga instance didaftarkan per render. Layout dipertahankan di seluruh navigasi dan tidak merender ulang, sehingga halaman tidak dapat mengandalkan layout untuk menyetel lokal. Memanggil initLingui(locale) di bagian atas setiap layout dan page membuat keduanya tetap independen.
Gunakan @lingui/swc-plugin. Plugin ini mempertahankan pipeline SWC dan Turbopack. Menambahkan konfigurasi Babel akan menonaktifkan SWC di Next.js dan memperlambat proses build. Satu-satunya batasan adalah memastikan versi plugin tetap kompatibel dengan versi SWC dari rilis Next.js Anda.
Dapatkan instance server dengan getI18nInstance(locale) dan terjemahkan deskriptor yang dideklarasikan dengan makro msg: i18n._(msg`About us`). Kembalikan alternates.canonical, alternates.languages dengan x-default, dan openGraph.locale. Langkah 13 menyediakan helper yang dapat digunakan kembali.
Tolok ukur mengukur ukuran runtime ~72 KB gzip. Dengan satu katalog per lokal, ukuran halaman adalah ~145 KB dibandingkan 141 KB tanpa i18n, tetapi setiap halaman masih menerima pesan dari halaman lain melalui penyedia klien.
Lingui cocok untuk tim yang suka menulis teks sumber langsung di dalam komponen dan bekerja dengan file PO serta penerjemah. next-intl cocok untuk tim yang lebih memilih katalog JSON dan API t("key") yang terintegrasi erat dengan Next.js. next-i18next membawa ekosistem plugin i18next. Lihat next-i18next vs next-intl vs Intlayer dan Tolok ukur Next.js.
Komentar
Belum ada komentar. Jadilah yang pertama membagikan pemikiran Anda.
