Creation:2025-04-18Last update:2026-05-31

    Terjemahkan situs web Vite dan Preact Anda menggunakan Intlayer | Internasionalisasi (i18n)

    www.youtube.com

    Daftar Isi

    Mengapa Intlayer dibandingkan alternatif?

    Dibandingkan dengan solusi utama seperti preact-i18n atau i18next, Intlayer adalah solusi yang hadir dengan pengoptimalan terintegrasi seperti:

    Intlayer dioptimalkan untuk bekerja sempurna dengan Preact dengan menawarkan pelingkupan konten tingkat komponen, terjemahan yang lambat dimuat, dan semua fitur yang diperlukan untuk meningkatkan internasionalisasi (i18n).

    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 dalam Aplikasi Vite dan Preact

    Lihat Template Aplikasi di GitHub.

    1. Instalasi Dependensi

      Instal paket yang diperlukan menggunakan npm:

      bash
      npm install intlayer preact-intlayernpm install vite-intlayer --save-devnpx intlayer init
      • intlayer

        Paket inti yang menyediakan alat internasionalisasi untuk manajemen konfigurasi, terjemahan, deklarasi konten, kompilasi, và perintah CLI.

      • preact-intlayer

        Paket yang mengintegrasikan Intlayer dengan aplikasi Preact. Ini menyediakan context providers dan hooks untuk internasionalisasi Preact.

      • vite-intlayer

        Termasuk plugin Vite untuk mengintegrasikan Intlayer dengan Vite bundler, serta middleware untuk mendeteksi locale yang dipilih pengguna, mengelola cookie, dan menangani pengalihan URL.

    2. Konfigurasi proyek Anda

      Buat file konfigurasi untuk mengatur bahasa aplikasi Anda:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [
            Locales.ENGLISH,
            Locales.FRENCH,
            Locales.SPANISH,
            // Locale lain milik Anda
          ],
          defaultLocale: Locales.ENGLISH,
        },
        routing: {
          mode: "prefix-no-default", // Default: prefix semua locale kecuali locale default
          storage: ["cookie", "header"], // Default: simpan locale di cookie dan deteksi dari header
        },
      };
      
      export default config;
      Melalui file konfigurasi ini, Anda dapat mengatur URL yang dilokalkan, mode routing, opsi penyimpanan, nama cookie, lokasi dan ekstensi deklarasi konten Anda, menonaktifkan log Intlayer di konsol, dan lainnya. Untuk daftar lengkap parameter yang tersedia, lihat dokumentasi konfigurasi.
    3. Integrasikan Intlayer dalam Konfigurasi Vite Anda

      Tambahkan plugin intlayer ke trong konfigurasi Anda.

      vite.config.ts
      import { defineConfig } from "vite";
      import preact from "@preact/preset-vite";
      import { intlayer } from "vite-intlayer";
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [preact(), intlayer()],
      });
      Plugin Vite intlayer() digunakan untuk mengintegrasikan Intlayer dengan Vite. Plugin ini memastikan pembuatan file deklarasi konten dan memantau file tersebut dalam mode pengembangan. Plugin ini juga mendefinisikan variabel lingkungan Intlayer di dalam aplikasi Vite. Selain itu, plugin ini menyediakan alias untuk mengoptimalkan performa.
    4. Deklarasikan Konten Anda

      Buat dan kelola deklarasi konten Anda untuk menyimpan terjemahan:

      src/app.content.tsx
      import { t, type Dictionary } from "intlayer";
      import type { ComponentChildren } from "preact";
      
      const appContent = {
        key: "app",
        content: {
          viteLogo: t({
            en: "Vite logo",
            fr: "Logo Vite",
            es: "Logo Vite",
          }),
          preactLogo: t({
            en: "Preact logo",
            fr: "Logo Preact",
            es: "Logo Preact",
          }),
      
          title: "Vite + Preact",
      
          count: t({
            en: "count is ",
            fr: "le compte est ",
            es: "el recuento es ",
          }),
      
          edit: t<ComponentChildren>({
            en: (
              <>
                Edit <code>src/app.tsx</code> and save to test HMR
              </>
            ),
            fr: (
              <>
                Éditez <code>src/app.tsx</code> et enregistrez pour tester HMR
              </>
            ),
            es: (
              <>
                Edita <code>src/app.tsx</code> y guarda para probar HMR
              </>
            ),
          }),
      
          readTheDocs: t({
            en: "Click on the Vite and Preact logos to learn more",
            fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
            es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
          }),
        },
      } satisfies Dictionary;
      
      export default appContent;
      Deklarasi konten Anda dapat didefinisikan di mana saja dalam aplikasi Anda selama sudah dimasukkan ke trong 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.
      Jika file konten Anda menyertakan kode TSX, Anda mungkin perlu mengimpor import { h } from "preact"; hoặc đảm bảo pragma JSX Anda sudah diatur dengan benar untuk Preact.
    5. Gunakan Intlayer dalam Kode Anda

      Akses kamus konten Anda di seluruh aplikasi:

      src/app.tsx
      import { useState } from "preact/hooks";
      import type { FunctionalComponent } from "preact";
      import preactLogo from "./assets/preact.svg"; // Mengasumsikan Anda memiliki preact.svg
      import viteLogo from "/vite.svg";
      import "./app.css"; // Mengasumsikan file CSS Anda bernama app.css
      import { IntlayerProvider, useIntlayer } from "preact-intlayer";
      
      const AppContent: FunctionalComponent = () => {
        const [count, setCount] = useState(0);
        const content = useIntlayer("app");
      
        return (
          <>
            <div>
              <a href="https://vitejs.dev" target="_blank">
                <img src={viteLogo} class="logo" alt={content.viteLogo.value} />
              </a>
              <a href="https://preactjs.com" target="_blank">
                <img
                  src={preactLogo}
                  class="logo preact"
                  alt={content.preactLogo.value}
                />
              </a>
            </div>
            <h1>{content.title}</h1>
            <div class="card">
              <button onClick={() => setCount((count) => count + 1)}>
                {content.count}
                {count}
              </button>
              <p>{content.edit}</p>
            </div>
            {/* Konten Markdown */}
            <div>{content.myMarkdownContent}</div>
      
            {/* Konten HTML */}
            <div>{content.myHtmlContent}</div>
      
            <p class="read-the-docs">{content.readTheDocs}</p>
          </>
        );
      };
      
      const App: FunctionalComponent = () => (
        <IntlayerProvider>
          <AppContent />
        </IntlayerProvider>
      );
      
      export default App;
      Jika Anda ingin menggunakan konten Anda dalam atribut string, seperti alt, title, href, aria-label, dll., Anda harus memanggil nilai fungsi tersebut, seperti:
      html
      <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)}" />
      Catatan: Dalam Preact, className biasanya ditulis sebagai class.
      Untuk mempelajari lebih lanjut tentang hook useIntlayer, lihat dokumentasi (API-nya serupa untuk preact-intlayer).
      Jika aplikasi Anda sudah ada, Anda dapat menggunakan Intlayer Compiler secara kombinasi dengan perintah extract untuk mengonversi ribuan komponen dalam satu detik.
    6. Ubah bahasa konten Anda

      Opsional

      Untuk mengubah bahasa konten Anda, Anda dapat menggunakan fungsi setLocale yang disediakan oleh hook useLocale. Fungsi ini memungkinkan Anda để thiết lập locale ứng dụng và cập nhật nội dung tương ứng.

      src/components/LocaleSwitcher.tsx
      import type { FunctionalComponent } from "preact";
      import { Locales } from "intlayer";
      import { useLocale } from "preact-intlayer";
      
      const LocaleSwitcher: FunctionalComponent = () => {
        const { setLocale } = useLocale();
      
        return (
          <button onClick={() => setLocale(Locales.ENGLISH)}>
            Ubah Bahasa ke Bahasa Inggris
          </button>
        );
      };
      
      export default LocaleSwitcher;
      Để tìm hiểu thêm về hook useLocale, hãy tham khảo tài liệu (API serupa cho preact-intlayer).
    7. Tambahkan Perutean yang Dilokalkan ke aplikasi Anda

      Opsional

      Tujuan dari langkah ini adalah untuk membuat rute unik cho mỗi ngôn ngữ. Điều này hữu ích cho SEO và các URL thân thiện với SEO. Ví dụ:

      plaintext
      - https://example.com/about- https://example.com/es/about- https://example.com/fr/about
      Secara default, rute tidak diberi awalan cho locale mặc định. Nếu bạn muốn thêm tiền tố cho locale mặc định, bạn có thể đặt tùy chọn routing.mode thành "prefix-all" trong cấu hình của mình. Xem tài liệu cấu hình để biết thêm thông tin.

      Để thêm perutean được bản địa hóa vào ứng dụng của bạn, bạn có thể tạo một thành phần LocaleRouter bao bọc các tuyến đường của ứng dụng và xử lý định tuyến dựa trên ngôn ngữ. Dưới đây là một ví dụ sử dụng preact-iso:

      src/components/LocaleRouter.tsx
      import { localeMap } from "intlayer";
      import { IntlayerProvider } from "preact-intlayer";
      import { LocationProvider, Router, Route } from "preact-iso";
      import type { ComponentChildren, FunctionalComponent } from "preact";
      
      /**
       * Một thành phần định tuyến thiết lập các tuyến đường cụ thể cho từng ngôn ngữ.
       * Nó sử dụng preact-iso để quản lý điều hướng và hiển thị các thành phần cục bộ.
       */
      export const LocaleRouter: FunctionalComponent<{
        children: ComponentChildren;
      }> = ({ children }) => (
        <LocationProvider>
          <Router>
            {localeMap(({ locale, urlPrefix }) => ({ locale, urlPrefix }))
              .sort((a, b) => b.urlPrefix.length - a.urlPrefix.length)
              .map(({ locale, urlPrefix }) => (
                <Route
                  key={locale}
                  path={`${urlPrefix}/:rest*`}
                  component={() => (
                    <IntlayerProvider locale={locale}>{children}</IntlayerProvider>
                  )}
                />
              ))}
          </Router>
        </LocationProvider>
      );

      Sau đó, bạn có thể sử dụng thành phần LocaleRouter trong ứng dụng của mình:

      src/app.tsx
      import { LocaleRouter } from "./components/LocaleRouter";
      import type { FunctionalComponent } from "preact";
      
      // ... Thành phần AppContent của bạn
      
      const App: FunctionalComponent = () => (
        <LocaleRouter>
          <AppContent />
        </LocaleRouter>
      );
      
      export default App;
    8. Ubah URL saat locale berubah

      Opsional

      Để thay đổi URL khi ngôn ngữ thay đổi, bạn có thể sử dụng thuộc tính onLocaleChange được cung cấp bởi hook useLocale. Đồng thời, bạn có thể sử dụng phương thức route từ useLocation của preact-iso để cập nhật đường dẫn URL.

      src/components/LocaleSwitcher.tsx
      import { useLocation } from "preact-iso";
      import {
        Locales,
        getHTMLTextDir,
        getLocaleName,
        getLocalizedUrl,
      } from "intlayer";
      import { useLocale } from "preact-intlayer";
      import type { FunctionalComponent } from "preact";
      
      const LocaleSwitcher: FunctionalComponent = () => {
        const { url, route } = useLocation();
        const { locale, availableLocales, setLocale } = useLocale({
          onLocaleChange: (newLocale) => {
            // Xây dựng URL với ngôn ngữ đã cập nhật
            // Ví dụ: /es/about?foo=bar
            const pathWithLocale = getLocalizedUrl(url, newLocale);
      
            // Cập nhật đường dẫn URL
            route(pathWithLocale, true); // true để thay thế (replace)
          },
        });
      
        return (
          <div>
            <button popovertarget="localePopover">{getLocaleName(locale)}</button>
            <div id="localePopover" popover="auto">
              {availableLocales.map((localeItem) => (
                <a
                  href={getLocalizedUrl(url, localeItem)}
                  hreflang={localeItem}
                  aria-current={locale === localeItem ? "page" : undefined}
                  onClick={(e) => {
                    e.preventDefault();
                    setLocale(localeItem);
                    // Điều hướng theo lập trình sau khi thiết lập ngôn ngữ sẽ được xử lý bởi onLocaleChange
                  }}
                  key={localeItem}
                >
                  <span>
                    {/* Locale - ví dụ: FR */}
                    {localeItem}
                  </span>
                  <span>
                    {/* Ngôn ngữ trong chính Locale đó - ví dụ: Français */}
                    {getLocaleName(localeItem, localeItem)}
                  </span>
                  <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
                    {/* Ngôn ngữ trong Locale hiện tại - ví dụ: Francés với ngôn ngữ hiện tại được đặt thành Locales.SPANISH */}
                    {getLocaleName(localeItem, locale)}
                  </span>
                  <span dir="ltr" lang={Locales.ENGLISH}>
                    {/* Ngôn ngữ bằng tiếng Anh - ví dụ: French */}
                    {getLocaleName(localeItem, Locales.ENGLISH)}
                  </span>
                </a>
              ))}
            </div>
          </div>
        );
      };
      
      export default LocaleSwitcher;

      Tham khảo tài liệu:

      - Hook useLocale (API tương tự cho preact-intlayer)> - Hook getLocaleName> - Hook getLocalizedUrl> - Hook getHTMLTextDir> - Thuộc tính hreflang> - Thuộc tính lang> - Thuộc tính dir> - Thuộc tính aria-current> - Popover API
    9. Ganti atribut bahasa dan arah HTML

      Opsional

      Khi ứng dụng của bạn hỗ trợ nhiều ngôn ngữ, việc cập nhật các thuộc tính langdir của thẻ <html> để khớp với locale hiện tại là rất quan trọng. Làm như vậy đảm bảo:

      • Khả năng truy cập: Trình đọc màn hình và các công nghệ hỗ trợ dựa trên thuộc tính lang chính xác để phát âm và diễn giải nội dung một cách chính xác.
      • Hiển thị văn bản: Thuộc tính dir (hướng) đảm bảo văn bản được hiển thị theo thứ tự thích hợp (ví dụ: từ trái sang phải cho tiếng Anh, từ phải sang trái cho tiếng Ả Rập hoặc tiếng Do Thái), điều này rất cần thiết cho khả năng đọc.
      • SEO: Mesin pencari menggunakan atribut lang untuk menentukan bahasa halaman Anda, membantu menyajikan konten lokal yang tepat dalam hasil pencarian.

      Bằng cách cập nhật các thuộc tính này một cách động khi locale thay đổi, bạn đảm bảo trải nghiệm nhất quán và dễ tiếp cận cho người dùng trên tất cả các ngôn ngữ được hỗ trợ.

      Triển khai Hook

      Tạo một hook tùy chỉnh để quản lý các thuộc tính HTML. Hook này lắng nghe các thay đổi về ngôn ngữ và cập nhật các thuộc tính cho phù hợp:

      src/hooks/useI18nHTMLAttributes.tsx
      import { useEffect } from "preact/hooks";
      import { useLocale } from "preact-intlayer";
      import { getHTMLTextDir } from "intlayer";
      
      /**
       * Cập nhật các thuộc tính `lang` và `dir` của phần tử HTML <html> dựa trên ngôn ngữ hiện tại.
       * - `lang`: Thông báo cho trình duyệt và công cụ tìm kiếm về ngôn ngữ của trang.
       * - `dir`: Đảm bảo thứ tự đọc chính xác (ví dụ: 'ltr' cho tiếng Anh, 'rtl' cho tiếng Ả Rập).
       *
       * Bản cập nhật động này rất cần thiết để hiển thị văn bản, khả năng truy cập và SEO thích hợp.
       */
      export const useI18nHTMLAttributes = () => {
        const { locale } = useLocale();
      
        useEffect(() => {
          // Cập nhật thuộc tính ngôn ngữ thành ngôn ngữ hiện tại.
          document.documentElement.lang = locale;
      
          // Đặt hướng văn bản dựa trên ngôn ngữ hiện tại.
          document.documentElement.dir = getHTMLTextDir(locale);
        }, [locale]);
      };

      Sử dụng Hook trong ứng dụng của bạn

      Tích hợp hook vào thành phần chính của bạn để các thuộc tính HTML cập nhật bất cứ khi nào ngôn ngữ thay đổi:

      src/app.tsx
      import type { FunctionalComponent } from "preact";
      import { IntlayerProvider } from "preact-intlayer"; // useIntlayer đã được nhập nếu AppContent cần nó
      import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
      import "./app.css";
      // Định nghĩa AppContent từ Bước 5
      
      const AppWithHooks: FunctionalComponent = () => {
        // Áp dụng hook để cập nhật các thuộc tính lang và dir của thẻ <html> dựa trên ngôn ngữ.
        useI18nHTMLAttributes();
      
        // Giả sử AppContent là thành phần hiển thị nội dung chính của bạn từ Bước 5
        return <AppContent />;
      };
      
      const App: FunctionalComponent = () => (
        <IntlayerProvider>
          <AppWithHooks />
        </IntlayerProvider>
      );
      
      export default App;
    10. Opsional

      Để đảm bảo rằng điều hướng của ứng dụng của bạn tôn trọng ngôn ngữ hiện tại, bạn có thể tạo một thành phần Link tùy chỉnh. Thành phần này tự động thêm tiền tố ngôn ngữ hiện tại vào các URL nội bộ.

      Hành vi này hữu ích vì một số lý do:

      • SEO và Trải nghiệm người dùng: URL được bản địa hóa giúp công cụ tìm kiếm lập chỉ mục các trang dành riêng cho ngôn ngữ một cách chính xác và cung cấp cho người dùng nội dung bằng ngôn ngữ ưa thích của họ.
      • Tính nhất quán: Bằng cách sử dụng một liên kết được bản địa hóa trong toàn bộ ứng dụng của mình, bạn đảm bảo rằng điều hướng vẫn nằm trong ngôn ngữ hiện tại, ngăn chặn các thay đổi ngôn ngữ không mong muốn.
      • Khả năng bảo trì: Centralizing logic bản địa hóa trong một component duy nhất giúp đơn giản hóa việc quản lý các URL.

      Dưới đây là cách triển khai thành phần Link được bản địa hóa trong Preact:

      src/components/Link.tsx
      import { getLocalizedUrl } from "intlayer";
      import { useLocale } from "preact-intlayer";
      import { forwardRef } from "preact/compat";
      import type { JSX } from "preact";
      
      export interface LinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> {
        href: string;
      }
      
      /**
       * Hàm tiện ích để kiểm tra xem một URL nhất định có phải là bên ngoài hay không.
       * Nếu URL bắt đầu bằng http:// hoặc https://, nó được coi là bên ngoài.
       */
      export const checkIsExternalLink = (href?: string): boolean =>
        /^https?:\/\//.test(href ?? "");
      
      /**
       * Một thành phần Link tùy chỉnh thích ứng với thuộc tính href dựa trên ngôn ngữ hiện tại.
       * Đối với các liên kết nội bộ, nó sử dụng `getLocalizedUrl` để thêm tiền tố ngôn ngữ vào URL (ví dụ: /fr/about).
       * Điều này đảm bảo rằng điều hướng vẫn nằm trong cùng một bối cảnh ngôn ngữ.
       */
      export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
        ({ href, children, ...props }, ref) => {
          const { locale } = useLocale();
          const isExternalLink = checkIsExternalLink(href);
      
          // Nếu liên kết là nội bộ và một href hợp lệ được cung cấp, hãy lấy URL được bản địa hóa.
          const hrefI18n =
            href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
      
          return (
            <a href={hrefI18n} ref={ref} {...props}>
              {children}
            </a>
          );
        }
      );
      
      Link.displayName = "Link";

      Cara Kerjanya

      • Mendeteksi Tautan Eksternal:
        Fungsi pembantu checkIsExternalLink menentukan apakah sebuah URL adalah eksternal. Tautan eksternal dibiarkan tanpa perubahan karena tidak memerlukan lokalisasi.
      • Mengambil Locale Saat Ini:
        Hook useLocale menyediakan locale saat ini (misalnya, fr untuk bahasa Prancis).
      • Melokalkan URL:
        Untuk tautan internal (yaitu, non-eksternal), getLocalizedUrl digunakan untuk secara otomatis menambahkan prefix locale saat ini ke URL. Ini berarti jika pengguna Anda dalam bahasa Prancis, meneruskan /about sebagai href akan mengubahnya menjadi /fr/about.
      • Mengembalikan Tautan:
        Komponen mengembalikan elemen <a> dengan URL yang sudah dilokalkan, memastikan navigasi konsisten dengan locale.
    11. Render Markdown dan HTML

      Opsional

      Intlayer mendukung rendering konten Markdown và HTML dalam Preact.

      Bạn có thể tùy chỉnh việc hiển thị nội dung Markdown và HTML bằng cách sử dụng phương thức .use(). Phương thức này cho phép bạn ghi đè việc hiển thị mặc định của các thẻ cụ thể.

      tsx
      import { useIntlayer } from "preact-intlayer";const { myMarkdownContent, myHtmlContent } = useIntlayer("my-component");// ...return (  <div>    {/* Rendering dasar */}    {myMarkdownContent}    {/* Rendering kustom cho Markdown */}    {myMarkdownContent.use({      h1: (props) => <h1 style={{ color: "red" }} {...props} />,    })}    {/* Rendering dasar cho HTML */}    {myHtmlContent}    {/* Rendering kustom cho HTML */}    {myHtmlContent.use({      b: (props) => <strong style={{ color: "blue" }} {...props} />,    })}  </div>);
    12. Ekstrak konten komponen Anda

      Opsional

      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
      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
      npx intlayer extract

    Konfigurasi TypeScript

    Intlayer menggunakan module augmentation để tận dụng lợi ích của TypeScript và làm cho codebase của bạn mạnh mẽ hơn.

    Autocompletion

    Translation error

    Pastikan konfigurasi TypeScript Anda menyertakan tipe yang dihasilkan secara otomatis.

    tsconfig.json
    {  // ... Konfigurasi TypeScript Anda yang sudah ada  "compilerOptions": {    // ...    "jsx": "react-jsx",    "jsxImportSource": "preact", // Direkomendasikan cho Preact 10+    // ...  },  "include": [    // ... Konfigurasi TypeScript Anda yang sudah ada    ".intlayer/**/*.ts", // Sertakan tipe yang dihasilkan secara otomatis  ],}
    Pastikan tsconfig.json Anda diatur cho Preact, terutama jsxjsxImportSource hoặc jsxFactory/jsxFragmentFactory cho các phiên bản Preact cũ hơn nếu không sử dụng mặc định của preset-vite.

    Konfigurasi Git

    Disarankan untuk mengabaikan file yang dihasilkan oleh Intlayer. Ini memungkinkan Anda menghindari meng-commit file tersebut ke repository Git Anda.

    Untuk melakukan ini, Anda dapat menambahkan instruksi berikut ke file .gitignore Anda:

    bash
    #  Abaikan file yang dihasilkan oleh Intlayer.intlayer

    Ekstensi VS Code

    Untuk meningkatkan pengalaman pengembangan Anda dengan Intlayer, Anda dapat menginstal Ekstensi VS Code Intlayer resmi.

    Pasang dari VS Code Marketplace

    Ekstensi ini menyediakan:

    • Autocompletion cho các khóa dịch.
    • Deteksi kesalahan waktu nyata cho các bản dịch còn thiếu.
    • Pratinjau inline dari konten yang diterjemahkan.
    • Tindakan cepat để dễ dàng tạo và cập nhật bản dịch.

    Để biết thêm chi tiết về cách sử dụng tiện ích mở rộng, hãy tham khảo tài liệu Tiện ích mở rộng Intlayer cho VS Code.


    (Opsional) Sitemap dan robots.txt (generate saat build)

    Intlayer menyediakan generateSitemap dan getMultilingualUrls untuk memformat sitemap.xml multibahasa dan robots.txt yang siap untuk crawler, lalu menulisnya secara otomatis ke public/. Biasanya skrip Node kecil dijalankan sebelum Vite (misalnya hook npm predev / prebuild).

    Sitemap

    Generator sitemap Intlayer menghormati konfigurasi locale dan menambahkan metadata untuk crawler.

    Sitemap mendukung namespace xhtml:link (hreflang). Alih-alih hanya daftar URL datar, Intlayer menghubungkan semua varian bahasa setiap halaman secara dua arah (mis. /about, /fr/about, atau /about?lang=fr tergantung mode routing).

    Robots.txt

    Gunakan getMultilingualUrls agar aturan Disallow mencakup semua varian URL jalur sensitif.

    1. Buat generate-seo.mjs di root proyek

    generate-seo.mjs
    import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace(  /\/$/,  "");const pathList = [  { path: "/", changefreq: "daily", priority: 1.0 },  { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) =>  urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [  "User-agent: *",  "Allow: /",  ...disallowedPaths.map((path) => `Disallow: ${path}`),  "",  `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");

    Paket intlayer harus terpasang. Setel SITE_URL di lingkungan produksi (misalnya di CI).

    Disarankan generate-seo.mjs untuk ESM Node. Jika memakai generate-seo.js, pastikan "type": "module" di package.json atau aktifkan ESM lainnya.

    2. Jalankan skrip sebelum Vite

    package.json
    {  "scripts": {    "dev": "vite",    "prebuild": "node generate-seo.mjs",    "build": "vite build",    "preview": "vite preview"  }}

    Sesuaikan perintah jika memakai pnpm atau yarn. Skrip juga bisa dipanggil dari CI.

    Melangkah Lebih Jauh

    Để đi xa hơn, bạn có thể triển khai trình soạn thảo trực quan hoặc mengeksternalisasi konten Anda menggunakan CMS.