Ajukan pertanyaan Anda dan dapatkan ringkasan dokumen dengan merujuk halaman ini dan penyedia AI pilihan Anda
Riwayat Versi
- "Perbarui penggunaan API useIntlayer Solid ke akses properti langsung"v8.9.04/5/2026
- "Riwayat awal"v8.4.1023/3/2026
Konten halaman ini diterjemahkan menggunakan AI.
Lihat versi terakhir dari konten aslinya dalam bahasa InggrisIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Terjemahkan situs web Vite dan Lit Anda dengan Intlayer | Internasionalisasi (i18n)
Daftar Isi
Mengapa Intlayer dibandingkan alternatif?
Dibandingkan dengan solusi utama seperti lit-localize atau i18next, Intlayer adalah solusi yang hadir dengan pengoptimalan terintegrasi seperti:
Intlayer dioptimalkan agar berfungsi sempurna dengan Lit dengan menawarkan pelingkupan konten tingkat Komponen Web, dukungan TypeScript, dan semua fitur yang diperlukan untuk penskalaan 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 menyiapkan Intlayer di aplikasi Vite dan Lit
Instal Dependensi
Instal paket-paket yang diperlukan menggunakan npm:
bashSalin kodeSalin kode ke clipboard
npm install intlayer lit-intlayernpm install vite-intlayer --save-devnpx intlayer initintlayer
Paket inti yang menyediakan alat internasionalisasi untuk manajemen konfigurasi, terjemahan, deklarasi konten, transpilasi, dan perintah CLI.
lit-intlayer Paket yang mengintegrasikan Intlayer dengan aplikasi Lit. Paket ini menyediakan hook berbasis
ReactiveController(useIntlayer,useLocale, dll.) sehingga LitElement secara otomatis merender ulang saat bahasa berubah.vite-intlayer Menyertakan plugin Vite untuk mengintegrasikan Intlayer dengan Vite bundler, serta middleware untuk mendeteksi bahasa pilihan pengguna, mengelola cookie, dan menangani pengalihan URL.
Konfigurasi Proyek Anda
Buat file konfigurasi untuk menyiapkan bahasa aplikasi Anda:
intlayer.config.tsSalin kodeSalin kode ke clipboard
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Bahasa lainnya ], defaultLocale: Locales.ENGLISH, }, }; export default config;Melalui file konfigurasi ini, Anda dapat mengatur URL yang dilokalkan, pengalihan middleware, nama cookie, lokasi dan ekstensi deklarasi konten Anda, menonaktifkan log Intlayer di konsol, dan banyak lagi. Untuk daftar lengkap parameter yang tersedia, lihat dokumentasi konfigurasi.
Integrasikan Intlayer ke dalam Konfigurasi Vite Anda
Tambahkan plugin intlayer ke konfigurasi Anda.
vite.config.tsSalin kodeSalin kode ke clipboard
import { defineConfig } from "vite"; import { intlayer } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [intlayer()], });Plugin Vite
intlayer()digunakan untuk mengintegrasikan Intlayer dengan Vite. Plugin ini memastikan pembangunan file deklarasi konten dan memantaunya dalam mode pengembangan. Plugin ini mendefinisikan variabel lingkungan Intlayer di dalam aplikasi Vite. Selain itu, plugin ini menyediakan alias untuk mengoptimalkan performa.Bootstrap Intlayer di Entry Point Anda
Panggil
installIntlayer()sebelum elemen kustom apa pun didaftarkan sehingga singleton lokal global siap saat elemen pertama terhubung.src/main.tsSalin kodeSalin kode ke clipboard
import { installIntlayer } from "lit-intlayer";// Harus dipanggil sebelum LitElement apa pun terhubung ke DOM.installIntlayer();// Impor dan daftarkan elemen kustom Anda.import "./my-element.js";Jika Anda juga menggunakan deklarasi konten
md()(Markdown), instal juga perender markdown:src/main.tsSalin kodeSalin kode ke clipboard
import { installIntlayer, installIntlayerMarkdown } from "lit-intlayer";installIntlayer();installIntlayerMarkdown();import "./my-element.js";Deklarasikan Konten Anda
Buat dan kelola deklarasi konten Anda untuk menyimpan terjemahan:
src/app.content.tsSalin kodeSalin kode ke clipboard
import { t, type Dictionary } from "intlayer"; const appContent = { key: "app", content: { title: "Vite + Lit", viteLogo: t({ en: "Vite logo", fr: "Logo Vite", es: "Logo Vite", }), litLogo: t({ en: "Lit logo", fr: "Logo Lit", es: "Logo Lit", }), count: t({ en: "count is {{count}}", fr: "le compte est {{count}}", es: "el recuento es {{count}}", }), readTheDocs: t({ en: "Click on the Vite and Lit logos to learn more", fr: "Cliquez sur les logos Vite et Lit pour en savoir plus", es: "Haga clic en los logotipos de Vite y Lit para obtener lebih lanjut", }), }, } satisfies Dictionary; export default appContent;Deklarasi konten Anda dapat didefinisikan di mana saja dalam aplikasi Anda selama disertakan dalam direktori
contentDir(secara default,./src) dan sesuai dengan ekstensi file deklarasi konten (secara default,.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Untuk detail lebih lanjut, lihat dokumentasi deklarasi konten.
Gunakan Intlayer di LitElement Anda
Gunakan
useIntlayerdi dalamLitElement. Ini mengembalikan proxyReactiveControlleryang secara otomatis memicu perenderan ulang setiap kali bahasa aktif berubah - tidak diperlukan pengaturan tambahan.src/my-element.tsSalin kodeSalin kode ke clipboard
import { LitElement, html } from "lit";import { customElement, property } from "lit/decorators.js";import { useIntlayer } from "lit-intlayer";@customElement("my-element")export class MyElement extends LitElement { @property({ type: Number }) count = 0; // useIntlayer mendaftarkan dirinya sebagai ReactiveController. // Elemen dirrender ulang secara otomatis saat bahasa berubah. private content = useIntlayer(this, "app"); override render() { const { content } = this; return html` <h1>${content.title}</h1> <img src="/vite.svg" alt=${content.viteLogo.value} /> <img src="/lit.svg" alt=${content.litLogo.value} /> <button @click=${() => this.count++}> ${content.count({ count: this.count })} </button> <p>${content.readTheDocs}</p> `; }}Saat Anda memerlukan string terjemahan dalam atribut HTML asli (misalnya,
alt,aria-label,title), hubungi.valuepada simpul daun:typescriptSalin kodeSalin kode ke clipboard
html`<img alt=${content.viteLogo.value} />`;html`<img alt=${content.viteLogo.toString()} />`;html`<img alt=${String(content.viteLogo)} />`;Ubah Bahasa Konten Anda
OpsionalUntuk mengubah bahasa konten Anda, gunakan metode
setLocaleyang disediakan oleh pengontroluseLocale.src/locale-switcher.tsSalin kodeSalin kode ke clipboard
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { getLocaleName } from "intlayer";import { useLocale } from "lit-intlayer";@customElement("locale-switcher")export class LocaleSwitcher extends LitElement { private locale = useLocale(this); private _onChange(e: Event) { const select = e.target as HTMLSelectElement; this.locale.setLocale(select.value as any); } override render() { return html` <select @change=${this._onChange}> ${this.locale.availableLocales.map( (loc) => html` <option value=${loc} ?selected=${loc === this.locale.locale}> ${getLocaleName(loc)} </option> ` )} </select> `; }}Render Konten Markdown dan HTML
OpsionalIntlayer mendukung deklarasi konten
md()danhtml(). Di Lit, output terkompilasi disuntikkan sebagai HTML mentah melalui arahanunsafeHTML.Render HTML terkompilasi di elemen Anda:
src/my-element.tsSalin kodeSalin kode ke clipboard
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { unsafeHTML } from "lit/directives/unsafe-html.js";import { useIntlayer } from "lit-intlayer";import { compileMarkdown } from "lit-intlayer/markdown";@customElement("my-element")export class MyElement extends LitElement { private content = useIntlayer(this, "app"); override render() { return html` <div class="edit-note"> ${unsafeHTML(compileMarkdown(String(this.content.editNote)))} </div> `; }}TIP String(content.editNote)memanggiltoString()padaIntlayerNode, yang mengembalikan string Markdown mentah. Berikan kecompileMarkdownuntuk mendapatkan string HTML, lalu render dengan arahanunsafeHTMLLit.Tambahkan Perutean Terlokalisasi ke Aplikasi Anda
OpsionalUntuk membuat rute unik untuk setiap bahasa (berguna untuk SEO), Anda dapat menggunakan perute sisi klien bersama dengan pembantu
localeMap/localeFlatMapIntlayer, dan plugin ViteintlayerProxyuntuk deteksi bahasa sisi server.Pertama, tambahkan
intlayerProxyke konfigurasi Vite Anda:Perhatikan bahwa untuk menggunakan
intlayerProxydalam produksi, Anda perlu memindahkanvite-intlayerdaridevDependencieskedependencies.vite.config.tsSalin kodeSalin kode ke clipboard
import { defineConfig } from "vite"; import { intlayer, intlayerProxy } from "vite-intlayer"; export default defineConfig({ plugins: [intlayer(), intlayerProxy()], });Ubah URL saat Bahasa Berubah
OpsionalUntuk memperbarui URL browser saat bahasa berubah, gunakan
useRewriteURLbeserta pengalih bahasa:src/locale-switcher.tsSalin kodeSalin kode ke clipboard
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale, useRewriteURL } from "lit-intlayer";@customElement("locale-switcher")export class LocaleSwitcher extends LitElement { private locale = useLocale(this); // Menulis ulang URL saat ini secara otomatis saat bahasa berubah. private _rewriteURL = useRewriteURL(this); private _onChange(e: Event) { const select = e.target as HTMLSelectElement; this.locale.setLocale(select.value as any); } override render() { return html` <select @change=${this._onChange}> ${this.locale.availableLocales.map( (loc) => html` <option value=${loc} ?selected=${loc === this.locale.locale}> ${getLocaleName(loc)} </option> ` )} </select> `; }}Alihkan Atribut Bahasa dan Arah HTML
OpsionalPerbarui atribut
langdandirdari tag<html>agar sesuai dengan bahasa saat ini untuk aksesibilitas dan SEO.src/my-element.tsSalin kodeSalin kode ke clipboard
import { LitElement, html } from "lit";import { customElement } from "lit/decorators.js";import { getHTMLTextDir } from "intlayer";import { useLocale } from "lit-intlayer";@customElement("my-element")export class MyElement extends LitElement { private locale = useLocale(this, { onLocaleChange: (loc) => { document.documentElement.lang = loc; document.documentElement.dir = getHTMLTextDir(loc); }, }); override render() { return html`<!-- konten Anda -->`; }}Ekstrak Konten Komponen Anda
OpsionalJika Anda memiliki codebase yang ada, mengubah ribuan file bisa memakan waktu lama.
Untuk mempermudah proses ini, Intlayer mengusulkan compiler / extractor untuk mengubah komponen Anda dan mengekstrak konten.
Untuk menyiapkannya, Anda dapat menambahkan bagian
compilerdi fileintlayer.config.tsAnda:intlayer.config.tsSalin kodeSalin kode ke clipboard
import { type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { // ... sisa konfigurasi Anda compiler: { /** * Menandakan apakah kompiler harus diaktifkan. */ enabled: true, /** * Menentukan jalur file output */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * Menandakan apakah komponen harus disimpan setelah diubah. * Dengan begitu, kompiler hanya perlu dijalankan sekali untuk mengubah aplikasi, dan kemudian dapat dihapus. */ saveComponents: false, /** * Awalan kunci kamus */ dictionaryKeyPrefix: "", },};export default config;
(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 namespacexhtml: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=frtergantung mode routing).
Robots.txt
Gunakan getMultilingualUrls agar aturan Disallow mencakup semua varian URL jalur sensitif.
1. Buat generate-seo.mjs di root proyek
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).
Disarankangenerate-seo.mjsuntuk ESM Node. Jika memakaigenerate-seo.js, pastikan"type": "module"dipackage.jsonatau aktifkan ESM lainnya.
2. Jalankan skrip sebelum Vite
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.
Konfigurasi TypeScript
Pastikan konfigurasi TypeScript Anda menyertakan tipe yang dibuat secara otomatis.
Salin kode ke clipboard
{ "compilerOptions": { // ... "experimentalDecorators": true, "useDefineForClassFields": false, }, "include": ["src", ".intlayer/**/*.ts"],}experimentalDecoratorsdanuseDefineForClassFields: falsediperlukan oleh Lit untuk dukungan dekorator.
Konfigurasi Git
Disarankan untuk mengabaikan file yang dihasilkan oleh Intlayer. Ini memungkinkan Anda menghindari komit ke repositori Git Anda.
Untuk melakukannya, Anda dapat menambahkan petunjuk berikut ke file .gitignore Anda:
Salin kode ke clipboard
# Abaikan file yang dihasilkan oleh Intlayer.intlayerEkstensi VS Code
Untuk meningkatkan pengalaman pengembangan Anda dengan Intlayer, Anda dapat menginstal Intlayer VS Code Extension resmi.
Instal dari VS Code Marketplace
Ekstensi ini menyediakan:
- Pelengkapan otomatis untuk kunci terjemahan.
- Deteksi kesalahan waktu nyata untuk terjemahan yang hilang.
- Pratinjau sebaris dari konten yang diterjemahkan.
- Tindakan cepat untuk membuat dan memperbarui terjemahan dengan mudah.
Untuk detail lebih lanjut tentang cara menggunakan ekstensi, lihat dokumentasi Intlayer VS Code Extension.
Melangkah Lebih Jauh
Untuk melangkah lebih jauh, Anda dapat mengimplementasikan editor visual atau mengeksternalisasikan konten Anda menggunakan CMS.