BerandaSandboxShowcaseAplikasiDokumentasiBlog
    • EnglishInggris
      EN
    • русскийRusia
      RU
    • 日本語Jepang
      JA
    • françaisPrancis
      FR
    • 한국어Korea
      KO
    • 中文Tionghoa
      ZH
    • españolSpanyol
      ES
    • DeutschJerman
      DE
    • العربيةArab
      AR
    • italianoItalia
      IT
    • British EnglishInggris (Britania)
      EN-GB
    • portuguêsPortugis
      PT
    • हिन्दीHindi
      HI
    • TürkçeTurki
      TR
    • polskiPolski
      PL
    • IndonesiaIndonesia
      ID
    • Tiếng ViệtVietnam
      VI
    • українськаUkraina
      UK
    /
    Filter dokumen berdasarkan framework
    Alt+←
    Mengapa Intlayer?
    Mulai
    Konsep
    • Bagaimana Intlayer bekerja
    • Konfigurasi
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Editor visual
    • CMS
    • Integrasi CI/CD
    • TerjemahanPluralPenumeraanKondisiJenis kelaminPenambahanBerkasNestingMarkdownHTMLPengambilan fungsi
    • File untuk setiap lokal
    • Kompilator
    • Pengisian otomatis
    • Pengujian
    • Optimasi paket
    Lingkungan
    • Next.js 14 dan App Router
      Next.js 15
      Next.js tanpa locale URL
      Next.js dan Page Router
      Compiler
    • Tanstack Start Solid
    • Astro dan React
      Astro dan Svelte
      Astro dan Vue
      Astro dan Solid
      Astro dan Preact
      Astro dan Lit
      Astro dan Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt dan Vue
    • Vite dan Solid
    • SvelteKit
    • Vite dan Preact
    • Vite dan Vanilla JS
    • Vite dan Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native dan Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx dan React
    Plugins
    • JSON
    • gettext (.po)
    Ekstensi VS Code
    Agen
    • Server MCP
    • Keahlian agen
    Rilis
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Ajukan pertanyaan
    1. Documentation
    2. Lingkungan
    3. Next.js
    Dibuat:2024-12-06Terakhir diperbarui:2026-05-06
    Lihat template aplikasi di GitHub

    Halaman ini memiliki template aplikasi yang tersedia.

    Lihat aplikasi showcase

    Halaman ini menautkan ke demo langsung template.

    Tonton tutorial video

    Halaman ini memiliki tutorial video yang tersedia.

    Referensikan dokumen ini ke asisten AI favorit Anda
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Ajukan pertanyaan Anda dan dapatkan ringkasan dokumen dengan merujuk halaman ini dan penyedia AI pilihan Anda

    Riwayat Versi

    1. "Perbarui penggunaan API useIntlayer Solid ke akses properti langsung"
      v8.9.04/5/2026
    2. "Tambahkan perintah init"
      v7.5.930/12/2025
    3. "Menambahkan penyebutan `x-default` dalam objek `alternates`"
      v7.0.61/11/2025
    4. "Riwayat awal"
      v7.0.029/6/2025

    Konten halaman ini diterjemahkan menggunakan AI.

    Lihat versi terakhir dari konten aslinya dalam bahasa Inggris
    Sunting dokumen ini

    Jika Anda memiliki ide untuk meningkatkan dokumentasi ini, silakan berkontribusi dengan mengajukan pull request di GitHub.

    Tautan GitHub ke dokumentasi
    Salin

    Salin Markdown dokumentasi ke clipboard

    Terjemahkan situs web Next.js 16 Anda menggunakan Intlayer | Internasionalisasi (i18n)

    www.youtube.com
    ide.intlayer.org
    intlayer-next-16-template.vercel.app

    Lihat Template Aplikasi di GitHub.

    Daftar Isi

    Apa itu Intlayer?

    Intlayer adalah perpustakaan internasionalisasi (i18n) sumber terbuka yang inovatif, dirancang untuk menyederhanakan dukungan multibahasa dalam aplikasi web modern. Intlayer terintegrasi mulus dengan kerangka kerja terbaru Next.js 16, termasuk App Router yang kuat. Ini dioptimalkan untuk bekerja dengan Server Components agar rendering lebih efisien dan sepenuhnya kompatibel dengan Turbopack.

    Dengan Intlayer, Anda dapat:

    • Mengelola terjemahan dengan mudah menggunakan kamus deklaratif pada tingkat komponen.
    • Melokalkan metadata, rute, dan konten secara dinamis.
    • Mengakses terjemahan di komponen sisi klien dan sisi server.
    • Memastikan dukungan TypeScript dengan tipe yang dihasilkan secara otomatis, meningkatkan autocompletion dan deteksi kesalahan.
    • Manfaatkan fitur canggih, seperti deteksi dan pengalihan locale secara dinamis.

    Intlayer kompatibel dengan Next.js 12, 13, 14, dan 16. Jika Anda menggunakan Next.js Page Router, Anda dapat merujuk ke panduan ini. Perutean lokal berguna untuk SEO, ukuran bundel, dan performa. Jika Anda tidak memerlukannya, Anda dapat merujuk ke panduan ini. Untuk Next.js 12, 13, 14 dengan App Router, lihat panduan ini.


    Panduan Langkah demi Langkah untuk Mengatur Intlayer di Aplikasi Next.js

    Langkah 1: Instalasi Dependensi

    Instal paket yang diperlukan menggunakan npm:

    bash
    Salin kode

    Salin kode ke clipboard

    npm install intlayer next-intlayernpx intlayer init
    • intlayer

      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.

    Langkah 2: Konfigurasikan Proyek Anda

    Berikut adalah struktur akhir yang akan kita buat:

    bash
    Salin kode

    Salin 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.json
    Jika 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.ts
    Salin kode

    Salin 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.

    Langkah 3: Integrasikan Intlayer dalam Konfigurasi Next.js Anda

    Konfigurasikan setup Next.js Anda untuk menggunakan Intlayer:

    next.config.ts
    Salin kode

    Salin 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 menggunakan await. Contoh:

    ts
    Salin kode

    Salin 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:

    ts
    Salin kode

    Salin 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:

    ts
    Salin kode

    Salin kode ke clipboard

    withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));

    Langkah 4: Definisikan Rute Locale Dinamis

    Hapus semua dari RootLayout dan ganti dengan kode berikut:

    src/app/layout.tsx
    Salin kode

    Salin 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 RootLayout tetap kosong memungkinkan untuk mengatur atribut lang dan dir pada tag <html>.

    Untuk mengimplementasikan routing dinamis, sediakan jalur untuk locale dengan menambahkan layout baru di direktori [locale] Anda:

    src/app/[locale]/layout.tsx
    Salin kode

    Salin 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/about akan merujuk ke en-US dan /fr/about ke fr.
    Pada tahap ini, Anda akan menemui error: Error: Missing <html> and <body> tags in the root layout.. Ini diharapkan karena file /app/page.tsx tidak 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, /es di browser Anda. Untuk mengatur locale default sebagai halaman root, lihat pengaturan proxy pada langkah 7.

    Kemudian, implementasikan fungsi generateStaticParams di Layout aplikasi Anda.

    src/app/[locale]/layout.tsx
    Salin kode

    Salin kode ke clipboard

    export { generateStaticParams } from "next-intlayer"; // Baris yang harus ditambahkan
    
    const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
      /*... Sisa kode */
    };
    
    export default LocaleLayout;
    generateStaticParams memastikan 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.

    Langkah 5: Deklarasikan Konten Anda

    Buat dan kelola deklarasi konten Anda untuk menyimpan terjemahan:

    src/app/[locale]/page.content.ts
    Salin kode

    Salin 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}).
    Untuk detail lebih lanjut, lihat dokumentasi deklarasi konten.

    Langkah 6: Memanfaatkan Konten dalam Kode Anda

    Akses kamus konten Anda di seluruh aplikasi:

    src/app/[locale]/page.tsx
    Salin kode

    Salin 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;
    • IntlayerClientProvider digunakan 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 menggunakan IntlayerClientProvider di layout, Anda menghindari inisialisasi ulang untuk setiap halaman, meningkatkan kinerja dan menjaga konteks lokalisasi yang konsisten di seluruh aplikasi Anda.
    • IntlayerServerProvider digunakan 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.tsx
    Salin kode

    Salin 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.tsx
    Salin kode

    Salin 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, seperti alt, title, href, aria-label, dll., Anda harus memanggil nilai fungsi tersebut, seperti:
    html
    Salin kode

    Salin 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.

    (Opsional) Langkah 7: Konfigurasikan Proxy untuk Deteksi Locale

    Atur proxy untuk mendeteksi locale yang dipilih pengguna:

    src/proxy.ts
    Salin kode

    Salin 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).*)",
    };
    intlayerProxy digunakan 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, intlayerProxy dengan otentikasi atau proxy kustom), Intlayer sekarang menyediakan helper yang disebut multipleProxies.
    ts
    Salin kode

    Salin kode ke clipboard

    import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);

    (Opsional) Langkah 8: Internasionalisasi metadata Anda

    Jika Anda ingin menginternasionalisasi metadata Anda, seperti judul halaman Anda, Anda dapat menggunakan fungsi generateMetadata yang disediakan oleh Next.js. Di dalamnya, Anda dapat mengambil konten dari fungsi getIntlayer untuk menerjemahkan metadata Anda.

    src/app/[locale]/metadata.content.ts
    Salin kode

    Salin 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.tsx
    Salin kode

    Salin 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 kode
    Perhatikan bahwa fungsi getIntlayer yang diimpor dari next-intlayer mengembalikan konten Anda yang dibungkus dalam sebuah IntlayerNode, memungkinkan integrasi dengan editor visual. Sebaliknya, fungsi getIntlayer yang diimpor dari intlayer mengembalikan konten Anda secara langsung tanpa properti tambahan.

    Sebagai alternatif, Anda dapat menggunakan fungsi getTranslation untuk 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.tsx
    Salin kode

    Salin 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 kode
    Pelajari lebih lanjut tentang optimasi metadata di dokumentasi resmi Next.js.

    (Opsional) Langkah 9: Internasionalisasi sitemap.xml dan robots.txt Anda

    Untuk menginternasionalisasi sitemap.xml dan robots.txt Anda, Anda dapat menggunakan fungsi getMultilingualUrls yang disediakan oleh Intlayer. Fungsi ini memungkinkan Anda untuk menghasilkan URL multibahasa untuk sitemap Anda.

    src/app/sitemap.ts
    Salin kode

    Salin 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.ts
    Salin kode

    Salin 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.

    (Opsional) Langkah 10: Ubah bahasa konten Anda

    Untuk mengubah bahasa konten Anda di Next.js, cara yang direkomendasikan adalah menggunakan komponen Link untuk mengarahkan pengguna ke halaman yang sesuai dengan lokal yang diinginkan. Komponen Link memungkinkan prefetching halaman, yang membantu menghindari pemuatan ulang halaman secara penuh.

    src/components/LocaleSwitcher.tsx
    Salin kode

    Salin 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 setLocale yang disediakan oleh hook useLocale. Fungsi ini tidak akan memungkinkan prefetching halaman. Lihat dokumentasi useLocale hook untuk detail lebih lanjut.
    Anda juga dapat mengatur fungsi pada opsi onLocaleChange untuk memicu fungsi kustom saat locale berubah.
    src/components/LocaleSwitcher.tsx
    Salin kode

    Salin 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:

    • useLocale hook
    • getLocaleName hook
    • getLocalizedUrl hook
    • getHTMLTextDir hook
    • atribut hrefLang
    • atribut lang
    • atribut dir
    • atribut aria-current

    (Opsional) Langkah 1 : Ekstrak konten komponen Anda

    Jika 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 compiler di file intlayer.config.ts Anda:

    intlayer.config.ts
    Salin kode

    Salin 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

    bash
    Salin kode

    Salin kode ke clipboard

    npx intlayer extract
    bash
    Salin kode

    Salin kode ke clipboard

    npm install @intlayer/babel --save-dev
    babel.config.js
    Salin kode

    Salin kode ke clipboard

    const { intlayerExtractBabelPlugin, getExtractPluginOptions,} = require("@intlayer/babel");module.exports = { presets: ["next/babel"], plugins: [   // Ekstrak konten dari komponen ke dalam kamus   [intlayerExtractBabelPlugin, getExtractPluginOptions()], ],};
    bash
    Salin kode

    Salin kode ke clipboard

    npm run build # Atau npm run dev

    (Opsional) Langkah 11: Membuat Komponen Link yang Dilokalkan

    Untuk memastikan navigasi aplikasi Anda menghormati lokal saat ini, Anda dapat membuat komponen Link kustom. 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/about alih-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 Link yang dilokalisasi dalam TypeScript:

    src/components/Link.tsx
    Salin kode

    Salin 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 pembantu checkIsExternalLink menentukan apakah sebuah URL bersifat eksternal. Tautan eksternal dibiarkan tidak berubah karena tidak memerlukan lokalisasi.

    • Mengambil Locale Saat Ini:
      Hook useLocale menyediakan locale saat ini (misalnya, fr untuk bahasa Prancis).

    • Melokalisasi URL:
      Untuk tautan internal (yaitu, non-eksternal), getLocalizedUrl digunakan untuk secara otomatis menambahkan awalan URL dengan locale saat ini. Ini berarti jika pengguna Anda menggunakan bahasa Prancis, meneruskan /about sebagai href akan mengubahnya menjadi /fr/about.

    • Mengembalikan Tautan:
      Komponen mengembalikan elemen <a> dengan URL yang dilokalkan, memastikan bahwa navigasi konsisten dengan locale tersebut.

    Dengan mengintegrasikan komponen Link ini di seluruh aplikasi, Anda mempertahankan pengalaman pengguna yang koheren dan sadar bahasa sambil juga mendapatkan manfaat dari peningkatan SEO dan kegunaan.

    Optimasi paket
    Next.js 14 dan App Router
    Alt+→

    Di halaman ini

      Diskusi bersifat anonim dan ditinjau secara berkala untuk mengatasi masalah umum. Jangan ragu untuk berbagi ide fitur, masukan tentang dokumentasi, atau apa pun yang terkait dengan Intlayer, kami menggunakan masukan ini untuk membentuk peta jalan dan meningkatkan produk.

      npm install intlayer next-intlayernpx intlayer init
      .├── 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.json
      const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;
      const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;
      withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));
      <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)}" />
      import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);
      "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>);
      npx intlayer extract
      npm install @intlayer/babel --save-dev
      const { intlayerExtractBabelPlugin, getExtractPluginOptions,} = require("@intlayer/babel");module.exports = { presets: ["next/babel"], plugins: [   // Ekstrak konten dari komponen ke dalam kamus   [intlayerExtractBabelPlugin, getExtractPluginOptions()], ],};
      npm run build # Atau npm run dev