Ajukan pertanyaan Anda dan dapatkan ringkasan dokumen dengan merujuk halaman ini dan penyedia AI pilihan Anda
Riwayat Versi
- "Perbarui penggunaan API useIntlayer Solid ke akses properti langsung"v8.9.04/5/2026
- "Tambahkan perintah init"v7.5.930/12/2025
- "Menambahkan penyebutan `x-default` dalam objek `alternates`"v7.0.61/11/2025
- "Riwayat awal"v7.0.029/6/2025
Konten halaman ini diterjemahkan menggunakan AI.
Lihat versi terakhir dari konten aslinya dalam bahasa InggrisIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Terjemahkan situs web Next.js 16 Anda menggunakan Intlayer | Internasionalisasi (i18n)
Lihat Template Aplikasi di GitHub.
Daftar Isi
Mengapa Intlayer dibandingkan alternatif?
Dibandingkan dengan solusi utama seperti next-intl atau i18next, Intlayer adalah solusi yang hadir dengan pengoptimalan terintegrasi seperti:
Intlayer dioptimalkan untuk bekerja dengan Komponen Server untuk rendering yang efisien dan sepenuhnya kompatibel dengan Turbopack. Itu tidak memblokir rendering statis dan menawarkan middleware serta semua fitur yang diperlukan untuk penskalaan internasionalisasi (i18n).
Intlayer kompatibel dengan Next.js 12, 13, 14, 15, dan 16. Jika Anda menggunakan Next.js Pages Router, Anda dapat merujuk ke [panduan] ini(/id/doc/environment/nextjs/next-with-page-router). Perutean lokal berguna untuk SEO, ukuran bundle, dan kinerja. Jika Anda tidak membutuhkannya, Anda dapat merujuk ke [panduan] ini(/id/doc/environment/nextjs/no-locale-path). Untuk Next.js 12, 13, 14, dan 15 dengan App Router, lihat [panduan] ini(/id/doc/environment/nextjs/14).
Daripada memuat file JSON berukuran besar ke halaman Anda, muat saja konten yang diperlukan. Intlayer membantu mengurangi ukuran bundle dan halaman Anda hingga 50%.
Mencakup konten aplikasi Anda memfasilitasi pemeliharaan untuk aplikasi berskala besar. Anda dapat menduplikasi atau menghapus satu folder fitur tanpa beban mental untuk meninjau seluruh basis kode konten Anda. Selain itu, Intlayer diketik sepenuhnya untuk memastikan keakuratan konten Anda.
Menempatkan konten bersama mengurangi konteks yang diperlukan dengan Model Bahasa Besar (LLM). Intlayer juga dilengkapi dengan serangkaian alat, seperti CLI untuk menguji terjemahan yang hilang,LSP, MCP, dan agent skill, untuk menjadikan pengalaman pengembang (DX) lebih lancar bagi agen AI.
Gunakan otomatisasi untuk menerjemahkan dalam saluran CI/CD Anda menggunakan LLM pilihan Anda dengan biaya penyedia AI Anda. Intlayer juga menawarkan compiler untuk mengotomatiskan ekstraksi konten, serta platform web untuk membantu menerjemahkan di latar belakang.
Menghubungkan file JSON berukuran besar ke komponen dapat menyebabkan masalah kinerja dan reaktivitas. Intlayer mengoptimalkan pemuatan konten Anda pada waktu pembuatan.
Lebih dari sekedar solusi i18n, Intlayer menyediakan editor visual yang dihosting sendiri dan CMS lengkap untuk membantu Anda mengelola konten multibahasa secara real-time, membuat kolaborasi dengan penerjemah, copywriter, dan anggota tim lainnya menjadi lancar. Konten dapat disimpan secara lokal dan/atau jarak jauh.
Panduan Langkah demi Langkah untuk Mengatur Intlayer di Aplikasi Next.js
Instalasi Dependensi
Instal paket yang diperlukan menggunakan npm:
bashSalin kodeSalin kode ke clipboard
npm install intlayer next-intlayernpx intlayer initintlayer
Paket inti yang menyediakan alat internasionalisasi untuk manajemen konfigurasi, terjemahan, deklarasi konten, transpile, dan perintah CLI.
next-intlayer
Paket yang mengintegrasikan Intlayer dengan Next.js. Paket ini menyediakan context providers dan hooks untuk internasionalisasi Next.js. Selain itu, paket ini juga menyertakan plugin Next.js untuk mengintegrasikan Intlayer dengan Webpack atau Turbopack, serta proxy untuk mendeteksi locale pilihan pengguna, mengelola cookie, dan menangani pengalihan URL.
Konfigurasikan Proyek Anda
Berikut adalah struktur akhir yang akan kita buat:
bashSalin kodeSalin kode ke clipboard
.├── src│ ├── app│ │ ├── [locale]│ │ │ ├── layout.tsx # Layout locale untuk provider Intlayer│ │ │ ├── page.content.ts│ │ │ └── page.tsx│ │ └── layout.tsx # Layout root untuk gaya dan provider global│ ├── components│ │ ├── client-component-example.content.ts│ │ ├── ClientComponentExample.tsx│ │ ├── LocaleSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── proxy.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonJika Anda tidak menginginkan locale routing, intlayer dapat digunakan sebagai provider / hook sederhana. Lihat panduan ini untuk detail lebih lanjut.
Buat file konfigurasi untuk mengatur bahasa aplikasi Anda:
intlayer.config.tsSalin kodeSalin kode ke clipboard
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Locale lain Anda ], defaultLocale: Locales.ENGLISH, }, }; export default config;Melalui file konfigurasi ini, Anda dapat mengatur URL yang dilokalkan, pengalihan proxy, nama cookie, lokasi dan ekstensi deklarasi konten Anda, menonaktifkan log Intlayer di konsol, dan lainnya. Untuk daftar lengkap parameter yang tersedia, lihat dokumentasi konfigurasi.
Integrasikan Intlayer dalam Konfigurasi Next.js Anda
Konfigurasikan setup Next.js Anda untuk menggunakan Intlayer:
next.config.tsSalin kodeSalin kode ke clipboard
import type { NextConfig } from "next"; import { withIntlayer } from "next-intlayer/server"; const nextConfig: NextConfig = { /* opsi konfigurasi di sini */ }; export default withIntlayer(nextConfig);Plugin Next.js
withIntlayer()digunakan untuk mengintegrasikan Intlayer dengan Next.js. Plugin ini memastikan pembuatan file deklarasi konten dan memantau file tersebut dalam mode pengembangan. Plugin ini mendefinisikan variabel lingkungan Intlayer dalam lingkungan Webpack atau Turbopack. Selain itu, plugin ini menyediakan alias untuk mengoptimalkan performa dan memastikan kompatibilitas dengan komponen server.Fungsi
withIntlayer()adalah fungsi promise. Fungsi ini memungkinkan persiapan kamus intlayer sebelum proses build dimulai. Jika Anda ingin menggunakannya bersama plugin lain, Anda dapat menggunakanawait. Contoh:tsSalin kodeSalin kode ke clipboard
const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Jika Anda ingin menggunakannya secara sinkron, Anda dapat menggunakan fungsi
withIntlayerSync(). Contoh:tsSalin kodeSalin kode ke clipboard
const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Intlayer secara otomatis mendeteksi apakah proyek Anda menggunakan webpack atau Turbopack berdasarkan flag baris perintah
--webpack,--turbo, atau--turbopack, serta versi Next.js Anda saat ini.Sejak
next>=16, jika Anda menggunakan Rspack, Anda harus secara eksplisit memaksa Intlayer untuk menggunakan konfigurasi webpack dengan menonaktifkan Turbopack:tsSalin kodeSalin kode ke clipboard
withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));Definisikan Rute Locale Dinamis
Hapus semua dari
RootLayoutdan ganti dengan kode berikut:src/app/layout.tsxSalin kodeSalin kode ke clipboard
import type { PropsWithChildren, FC } from "react"; import "./globals.css"; const RootLayout: FC<PropsWithChildren> = ({ children }) => ( // Anda masih dapat membungkus children dengan provider lain, seperti `next-themes`, `react-query`, `framer-motion`, dll. <>{children}</> ); export default RootLayout;Menjaga komponen
RootLayouttetap kosong memungkinkan untuk mengatur atributlangdandirpada tag<html>.Untuk mengimplementasikan routing dinamis, sediakan jalur untuk locale dengan menambahkan layout baru di direktori
[locale]Anda:src/app/[locale]/layout.tsxSalin kodeSalin kode ke clipboard
import { type NextLayoutIntlayer, IntlayerClientProvider } from "next-intlayer"; import { Inter } from "next/font/google"; import { getHTMLTextDir } from "intlayer"; const inter = Inter({ subsets: ["latin"] }); const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { const { locale } = await params; return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body className={inter.className}> <IntlayerClientProvider locale={locale}> {children} </IntlayerClientProvider> </body> </html> ); }; export default LocaleLayout;Segmen jalur
[locale]digunakan untuk menentukan locale. Contoh:/en-US/aboutakan merujuk keen-USdan/fr/aboutkefr.Pada tahap ini, Anda akan menemui error:
Error: Missing <html> and <body> tags in the root layout.. Ini diharapkan karena file/app/page.tsxtidak lagi digunakan dan dapat dihapus. Sebagai gantinya, segmen path[locale]akan mengaktifkan halaman/app/[locale]/page.tsx. Akibatnya, halaman akan dapat diakses melalui path seperti/en,/fr,/esdi browser Anda. Untuk mengatur locale default sebagai halaman root, lihat pengaturanproxypada langkah 7.Kemudian, implementasikan fungsi
generateStaticParamsdi Layout aplikasi Anda.src/app/[locale]/layout.tsxSalin kodeSalin kode ke clipboard
export { generateStaticParams } from "next-intlayer"; // Baris yang harus ditambahkan const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { /*... Sisa kode */ }; export default LocaleLayout;generateStaticParamsmemastikan bahwa aplikasi Anda membangun terlebih dahulu halaman-halaman yang diperlukan untuk semua lokal, mengurangi komputasi saat runtime dan meningkatkan pengalaman pengguna. Untuk detail lebih lanjut, lihat dokumentasi Next.js tentang generateStaticParams.Intlayer bekerja dengan
export const dynamic = 'force-static';untuk memastikan bahwa halaman-halaman dibangun terlebih dahulu untuk semua lokal.Deklarasikan Konten Anda
Buat dan kelola deklarasi konten Anda untuk menyimpan terjemahan:
src/app/[locale]/page.content.tsSalin kodeSalin kode ke clipboard
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;Deklarasi konten Anda dapat didefinisikan di mana saja dalam aplikasi Anda selama sudah dimasukkan ke dalam direktori
contentDir(secara default,./src). Dan sesuai dengan ekstensi file deklarasi konten (secara default,.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Untuk detail lebih lanjut, lihat dokumentasi deklarasi konten.
Memanfaatkan Konten dalam Kode Anda
Akses kamus konten Anda di seluruh aplikasi:
src/app/[locale]/page.tsxSalin kodeSalin kode ke clipboard
import type { FC } from "react"; import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type NextPageIntlayer } from "next-intlayer"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPageIntlayer = async ({ params }) => { const { locale } = await params; return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProviderdigunakan untuk menyediakan locale ke komponen sisi klien. Ini dapat ditempatkan di komponen induk mana pun, termasuk layout. Namun, menempatkannya di layout sangat disarankan karena Next.js membagikan kode layout di seluruh halaman, sehingga menjadi lebih efisien. Dengan menggunakanIntlayerClientProviderdi layout, Anda menghindari inisialisasi ulang untuk setiap halaman, meningkatkan kinerja dan menjaga konteks lokalisasi yang konsisten di seluruh aplikasi Anda.IntlayerServerProviderdigunakan untuk menyediakan locale ke anak server. Ini tidak dapat ditempatkan di layout.Layout dan halaman tidak dapat berbagi konteks server yang sama karena sistem konteks server didasarkan pada penyimpanan data per permintaan (melalui mekanisme cache React), yang menyebabkan setiap "konteks" dibuat ulang untuk segmen aplikasi yang berbeda. Menempatkan provider di layout bersama akan memecah isolasi ini, sehingga mencegah propagasi nilai konteks server yang benar ke komponen server Anda.
src/components/ClientComponentExample.tsxSalin kodeSalin kode ke clipboard
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // Membuat deklarasi konten terkait return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/ServerComponentExample.tsxSalin kodeSalin kode ke clipboard
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Membuat deklarasi konten terkait return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Jika Anda ingin menggunakan konten Anda dalam atribut
string, sepertialt,title,href,aria-label, dll., Anda harus memanggil nilai fungsi tersebut, seperti:htmlSalin kodeSalin kode ke clipboard
<img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />Untuk mempelajari lebih lanjut tentang hook
useIntlayer, lihat dokumentasi.Jika aplikasi Anda sudah ada, Anda dapat menggunakan Intlayer Compiler secara kombinasi dengan perintah extract untuk mengonversi ribuan komponen dalam satu detik.
Konfigurasikan Proxy untuk Deteksi Locale
OpsionalAtur proxy untuk mendeteksi locale yang dipilih pengguna:
src/proxy.tsSalin kodeSalin kode ke clipboard
export { intlayerProxy as proxy } from "next-intlayer/proxy"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };intlayerProxydigunakan untuk mendeteksi locale pilihan pengguna dan mengarahkan mereka ke URL yang sesuai seperti yang ditentukan dalam konfigurasi. Selain itu, ini memungkinkan penyimpanan locale pilihan pengguna dalam cookie.Jika Anda perlu menggabungkan beberapa proxy bersama-sama (misalnya,
intlayerProxydengan otentikasi atau proxy kustom), Intlayer sekarang menyediakan helper yang disebutmultipleProxies.tsSalin kodeSalin kode ke clipboard
import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);Internasionalisasi metadata Anda
OpsionalJika Anda ingin menginternasionalisasi metadata Anda, seperti judul halaman Anda, Anda dapat menggunakan fungsi
generateMetadatayang disediakan oleh Next.js. Di dalamnya, Anda dapat mengambil konten dari fungsigetIntlayeruntuk menerjemahkan metadata Anda.src/app/[locale]/metadata.content.tsSalin kodeSalin kode ke clipboard
import { type Dictionary, t } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "page-metadata", content: { title: t({ en: "Create Next App", fr: "Créer une application Next.js", es: "Crear una aplicación Next.js", }), description: t({ en: "Generated by create next app", fr: "Généré par create next app", es: "Generado por create next app", }), }, } satisfies Dictionary<Metadata>; export default metadataContent;src/app/[locale]/layout.tsx or src/app/[locale]/page.tsxSalin kodeSalin kode ke clipboard
import { getIntlayer, getMultilingualUrls } from "intlayer"; import type { Metadata } from "next"; import type { LocalPromiseParams } from "next-intlayer"; export const generateMetadata = async ({ params, }: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const metadata = getIntlayer("page-metadata", locale); /** * Menghasilkan objek yang berisi semua url untuk setiap locale. * * Contoh: * ```ts * getMultilingualUrls('/about'); * * // Mengembalikan * // { * // en: '/about', * // fr: '/fr/about', * // es: '/es/about', * // } * ``` */ const multilingualUrls = getMultilingualUrls("/"); const localizedUrl = multilingualUrls[locale as keyof typeof multilingualUrls]; return { ...metadata, alternates: { canonical: localizedUrl, languages: { ...multilingualUrls, "x-default": "/" }, }, openGraph: { url: localizedUrl, }, }; }; // ... Sisa kodePerhatikan bahwa fungsi
getIntlayeryang diimpor darinext-intlayermengembalikan konten Anda yang dibungkus dalam sebuahIntlayerNode, memungkinkan integrasi dengan editor visual. Sebaliknya, fungsigetIntlayeryang diimpor dariintlayermengembalikan konten Anda secara langsung tanpa properti tambahan.Sebagai alternatif, Anda dapat menggunakan fungsi
getTranslationuntuk mendeklarasikan metadata Anda. Namun, menggunakan file deklarasi konten disarankan untuk mengotomatisasi terjemahan metadata Anda dan mengeksternalisasi konten pada suatu saat.src/app/[locale]/layout.tsx or src/app/[locale]/page.tsxSalin kodeSalin kode ke clipboard
import { type IConfigLocales, getTranslation, getMultilingualUrls, } from "intlayer"; import type { Metadata } from "next"; import type { LocalPromiseParams } from "next-intlayer"; export const generateMetadata = async ({ params, }: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale); return { title: t<string>({ en: "My title", fr: "Mon titre", es: "Mi título", }), description: t({ en: "My description", fr: "Ma description", es: "Mi descripción", }), }; }; // ... Sisa kodePelajari lebih lanjut tentang optimasi metadata di dokumentasi resmi Next.js.
Internasionalisasi sitemap.xml dan robots.txt Anda
OpsionalUntuk menginternasionalisasi
sitemap.xmldanrobots.txtAnda, Anda dapat menggunakan fungsigetMultilingualUrlsyang disediakan oleh Intlayer. Fungsi ini memungkinkan Anda untuk menghasilkan URL multibahasa untuk sitemap Anda.src/app/sitemap.tsSalin kodeSalin kode ke clipboard
import { getMultilingualUrls } from "intlayer"; import type { MetadataRoute } from "next"; const sitemap = (): MetadataRoute.Sitemap => [ { url: "https://example.com", alternates: { languages: { ...getMultilingualUrls("https://example.com"), "x-default": "https://example.com", }, }, }, { url: "https://example.com/login", alternates: { languages: { ...getMultilingualUrls("https://example.com/login"), "x-default": "https://example.com/login", }, }, }, { url: "https://example.com/register", alternates: { languages: { ...getMultilingualUrls("https://example.com/register"), "x-default": "https://example.com/register", }, }, }, ]; export default sitemap;src/app/robots.tsSalin kodeSalin kode ke clipboard
import type { MetadataRoute } from "next"; import { getMultilingualUrls } from "intlayer"; const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]); const robots = (): MetadataRoute.Robots => ({ rules: { userAgent: "*", allow: ["/"], disallow: getAllMultilingualUrls(["/login", "/register"]), }, host: "https://example.com", sitemap: `https://example.com/sitemap.xml`, }); export default robots;Pelajari lebih lanjut tentang optimasi sitemap di dokumentasi resmi Next.js. Pelajari lebih lanjut tentang optimasi robots.txt di dokumentasi resmi Next.js.
Ubah bahasa konten Anda
OpsionalUntuk mengubah bahasa konten Anda di Next.js, cara yang direkomendasikan adalah menggunakan komponen
Linkuntuk mengarahkan pengguna ke halaman yang sesuai dengan lokal yang diinginkan. KomponenLinkmemungkinkan prefetching halaman, yang membantu menghindari pemuatan ulang halaman secara penuh.src/components/LocaleSwitcher.tsxSalin kodeSalin kode ke clipboard
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "next-intlayer"; import Link from "next/link"; export const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <Link href={getLocalizedUrl(pathWithoutLocale, localeItem)} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} replace // Akan memastikan tombol "kembali" pada browser akan mengarahkan ke halaman sebelumnya > <span> {/* Lokal - misalnya FR */} {localeItem} </span> <span> {/* Bahasa dalam Lokal sendiri - misalnya Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Bahasa dalam Lokal saat ini - misalnya Francés dengan lokal saat ini disetel ke Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Bahasa dalam Bahasa Inggris - misalnya French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </Link> ))} </div> </div> ); };Cara alternatif adalah menggunakan fungsi
setLocaleyang disediakan oleh hookuseLocale. Fungsi ini tidak akan memungkinkan prefetching halaman. Lihat dokumentasiuseLocalehook untuk detail lebih lanjut.Anda juga dapat mengatur fungsi pada opsi
onLocaleChangeuntuk memicu fungsi kustom saat locale berubah.src/components/LocaleSwitcher.tsxSalin kodeSalin kode ke clipboard
"use client";import { useRouter } from "next/navigation";import { useLocale } from "next-intlayer";import { getLocalizedUrl } from "intlayer";// ... Sisa kodeconst router = useRouter();const { setLocale } = useLocale({ onLocaleChange: (locale) => { router.push(getLocalizedUrl(pathWithoutLocale, locale)); },});return ( <button onClick={() => setLocale(Locales.FRENCH)}> Ganti ke Bahasa Perancis </button>);Referensi dokumentasi:
useLocalehookgetLocaleNamehookgetLocalizedUrlhookgetHTMLTextDirhook- atribut
hrefLang - atribut
lang - atribut
dir - atribut
aria-current
Ekstrak konten komponen Anda
OpsionalJika Anda memiliki basis kode yang ada, mengubah ribuan file bisa memakan waktu lama.
Untuk memudahkan proses ini, Intlayer mengusulkan compiler / extractor untuk mengubah komponen Anda dan mengekstrak kontennya.
Untuk mengaturnya, Anda dapat menambahkan bagian
compilerdi fileintlayer.config.tsAnda:intlayer.config.tsSalin kodeSalin kode ke clipboard
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... Sisa konfigurasi Anda compiler: { /** * Menunjukkan apakah compiler harus diaktifkan. */ enabled: true, /** * Menentukan jalur file output */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * Menunjukkan apakah komponen harus disimpan setelah diubah. Dengan begitu, compiler dapat dijalankan satu kali saja untuk mengubah aplikasi, lalu dapat dihapus. */ saveComponents: false, /** * Prefiks kunci kamus */ dictionaryKeyPrefix: "", }, }; export default config;Jalankan extractor untuk mengubah komponen Anda dan mengekstrak kontennya
bashSalin kodeSalin kode ke clipboard
npx intlayer extractMembuat Komponen Link yang Dilokalkan
OpsionalUntuk memastikan navigasi aplikasi Anda menghormati lokal saat ini, Anda dapat membuat komponen
Linkkustom. Komponen ini secara otomatis menambahkan awalan bahasa saat ini pada URL internal, sehingga. Misalnya, ketika pengguna berbahasa Prancis mengklik tautan ke halaman "Tentang", mereka akan diarahkan ke/fr/aboutalih-alih/about.Perilaku ini berguna untuk beberapa alasan:
- SEO dan Pengalaman Pengguna: URL yang dilokalkan membantu mesin pencari mengindeks halaman spesifik bahasa dengan benar dan menyediakan konten kepada pengguna dalam bahasa pilihan mereka.
- Konsistensi: Dengan menggunakan tautan yang dilokalkan di seluruh aplikasi Anda, Anda menjamin navigasi tetap dalam lokal saat ini, mencegah perubahan bahasa yang tidak diinginkan.
- Pemeliharaan: Memusatkan logika lokalisasi dalam satu komponen menyederhanakan pengelolaan URL, sehingga basis kode Anda lebih mudah dipelihara dan diperluas seiring pertumbuhan aplikasi Anda.
Berikut adalah implementasi komponen
Linkyang dilokalisasi dalam TypeScript:src/components/Link.tsxSalin kodeSalin kode ke clipboard
"use client"; import { getLocalizedUrl } from "intlayer"; import NextLink, { type LinkProps as NextLinkProps } from "next/link"; import { useLocale } from "next-intlayer"; import type { PropsWithChildren, FC } from "react"; /** * Fungsi utilitas untuk memeriksa apakah URL yang diberikan bersifat eksternal. * Jika URL dimulai dengan http:// atau https://, maka dianggap eksternal. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * Komponen Link kustom yang menyesuaikan atribut href berdasarkan locale saat ini. * Untuk tautan internal, menggunakan `getLocalizedUrl` untuk menambahkan prefix locale pada URL (misalnya, /fr/about). * Ini memastikan navigasi tetap dalam konteks locale yang sama. */ export const Link: FC<PropsWithChildren<NextLinkProps>> = ({ href, children, ...props }) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // Jika tautan bersifat internal dan href valid diberikan, dapatkan URL yang sudah dilokalisasi. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} {...props}> {children} </NextLink> ); };Cara Kerjanya
Mendeteksi Tautan Eksternal:
Fungsi pembantucheckIsExternalLinkmenentukan apakah sebuah URL bersifat eksternal. Tautan eksternal dibiarkan tidak berubah karena tidak memerlukan lokalisasi.Mengambil Locale Saat Ini:
HookuseLocalemenyediakan locale saat ini (misalnya,fruntuk bahasa Prancis).Melokalisasi URL:
Untuk tautan internal (yaitu, non-eksternal),getLocalizedUrldigunakan untuk secara otomatis menambahkan awalan URL dengan locale saat ini. Ini berarti jika pengguna Anda menggunakan bahasa Prancis, meneruskan/aboutsebagaihrefakan mengubahnya menjadi/fr/about.Mengembalikan Tautan:
Komponen mengembalikan elemen<a>dengan URL yang dilokalkan, memastikan bahwa navigasi konsisten dengan locale tersebut.
Dengan mengintegrasikan komponen
Linkini di seluruh aplikasi, Anda mempertahankan pengalaman pengguna yang koheren dan sadar bahasa sambil juga mendapatkan manfaat dari peningkatan SEO dan kegunaan.