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. Vite dan Preact
    Dibuat:2025-04-18Terakhir 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.

    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. "Memperbarui komponen LocaleRouter untuk menggunakan konfigurasi rute baru"
      v7.0.028/10/2025
    4. "Inisialisasi riwayat"
      v5.5.1029/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 Vite dan Preact Anda menggunakan Intlayer | Internasionalisasi (i18n)

    www.youtube.com
    ide.intlayer.org
    intlayer-vite-preact-template.vercel.app

    Daftar Isi

    Apa itu Intlayer?

    Intlayer adalah perpustakaan internasionalisasi (i18n) open-source yang inovatif, dirancang untuk menyederhanakan dukungan multibahasa dalam aplikasi web modern.

    Dengan Intlayer, Anda dapat:

    • Mengelola terjemahan dengan mudah menggunakan kamus deklaratif di tingkat komponen.
    • Melokalkan metadata, rute, dan konten secara dinamis.
    • Menjamin dukungan TypeScript dengan tipe yang dihasilkan secara otomatis, meningkatkan autocompletion và deteksi kesalahan.
    • Memanfaatkan fitur canggih, seperti deteksi dan pergantian locale secara dinamis.

    Panduan Langkah demi Langkah untuk Mengatur Intlayer dalam Aplikasi Vite dan Preact

    Lihat Template Aplikasi di GitHub.

    Langkah 1: Instalasi Dependensi

    Instal paket yang diperlukan menggunakan npm:

    bash
    Salin kode

    Salin kode ke clipboard

    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.

    Langkah 2: Konfigurasi proyek Anda

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

    Langkah 3: Integrasikan Intlayer dalam Konfigurasi Vite Anda

    Tambahkan plugin intlayer ke trong konfigurasi Anda.

    vite.config.ts
    Salin kode

    Salin kode ke clipboard

    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.

    Langkah 4: Deklarasikan Konten Anda

    Buat dan kelola deklarasi konten Anda untuk menyimpan terjemahan:

    src/app.content.tsx
    Salin kode

    Salin kode ke clipboard

    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.

    Langkah 5: Gunakan Intlayer dalam Kode Anda

    Akses kamus konten Anda di seluruh aplikasi:

    src/app.tsx
    Salin kode

    Salin kode ke clipboard

    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
    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)}" />
    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.

    (Opsional) Langkah 6: Ubah bahasa konten Anda

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

    Salin kode ke clipboard

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

    (Opsional) Langkah 7: Tambahkan Perutean yang Dilokalkan ke aplikasi Anda

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

    Salin kode ke clipboard

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

    Salin kode ke clipboard

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

    Salin kode ke clipboard

    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;

    (Opsional) Langkah 8: Ubah URL saat locale berubah

    Để 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
    Salin kode

    Salin kode ke clipboard

    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

    (Opsional) Langkah 9: Ganti atribut bahasa dan arah HTML

    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 lang và dir 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
    Salin kode

    Salin kode ke clipboard

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

    Salin kode ke clipboard

    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;

    (Opsional) Langkah 10: Membuat Komponen Link yang Dilokalkan

    Để đả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
    Salin kode

    Salin kode ke clipboard

    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.

    (Opsional) Langkah 11: Render Markdown dan HTML

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

    Salin kode ke clipboard

    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>);

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

    Salin kode ke clipboard

    {  // ... 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 jsx và jsxImportSource 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
    Salin kode

    Salin kode ke clipboard

    #  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) 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

    Perbarui vite.config.ts Anda untuk menyertakan plugin intlayerCompiler:

    vite.config.ts
    Salin kode

    Salin kode ke clipboard

    import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // Menambahkan plugin compiler ],});
    bash
    Salin kode

    Salin kode ke clipboard

    npm run build # Atau npm run dev

    (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
    Salin kode

    Salin kode ke clipboard

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

    Salin kode ke clipboard

    {  "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.


    SvelteKit
    Vite dan Vanilla JS
    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 preact-intlayernpm install vite-intlayer --save-devnpx intlayer init
      <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)}" />
      - https://example.com/about- https://example.com/es/about- https://example.com/fr/about
      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>);
      {  // ... 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  ],}
      #  Abaikan file yang dihasilkan oleh Intlayer.intlayer
      npx intlayer extract
      import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // Menambahkan plugin compiler ],});
      npm run build # Atau npm run dev
      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.");
      {  "scripts": {    "dev": "vite",    "prebuild": "node generate-seo.mjs",    "build": "vite build",    "preview": "vite preview"  }}