Lingui.js adalah framework internasionalisasi (i18n) yang ringan namun canggih untuk aplikasi JavaScript dan React. Framework ini menggunakan file PO (Portable Object) standar industri untuk katalog terjemahan, makro waktu kompilasi yang canggih untuk pengalaman pengembang yang bersih, dan menghasilkan bundel teroptimasi di bawah 2 kB. Panduan ini mencakup segalanya mulai dari pengaturan proyek hingga alur kerja file PO, penjamakan, dan otomatisasi terjemahan dengan l10n.dev.
Lingui.js menonjol di antara pustaka i18n JavaScript karena kombinasi pengalaman pengembang, performa, dan alur kerja terjemahan profesional:
Instal paket inti dan alat pengembangan Lingui. Paket runtime (@lingui/core dan @lingui/react) diperlukan dalam produksi, sementara CLI, plugin Vite, dan makro Babel hanya untuk pengembangan:
npm install @lingui/core @lingui/react
npm install --save-dev @lingui/cli @lingui/vite-plugin @lingui/babel-plugin-lingui-macroLingui memerlukan dua file konfigurasi: konfigurasi Lingui (mendefinisikan lokal dan jalur katalog) dan konfigurasi alat build Anda (untuk mengaktifkan makro waktu kompilasi).
Buat file lingui.config.js di root proyek Anda. Ini mendefinisikan lokal sumber, lokal target, tempat menyimpan katalog PO, dan format katalog. Format PO adalah pilihan default dan yang direkomendasikan:
// lingui.config.js
import { defineConfig } from "@lingui/cli";
import { formatter } from "@lingui/format-po";
export default defineConfig({
sourceLocale: "en",
locales: ["en", "fr", "de", "ja", "es", "zh-CN"],
catalogs: [
{
path: "<rootDir>/src/locales/{locale}/messages",
include: ["src"],
},
],
format: formatter({ lineNumbers: false }),
});Jika Anda menggunakan Vite, tambahkan plugin Lingui bersama plugin React dengan makro Babel. Ini memungkinkan transformasi pesan waktu kompilasi dan kompilasi katalog secara langsung:
// vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { lingui } from "@lingui/vite-plugin";
export default defineConfig({
plugins: [
react({
babel: {
plugins: ["@lingui/babel-plugin-lingui-macro"],
},
}),
lingui(),
],
});PO (Portable Object) adalah format file terjemahan standar industri, yang berasal dari sistem GNU gettext. Lingui menggunakan PO sebagai format katalog default karena didukung secara luas oleh alat terjemahan, platform TMS, dan penerjemah profesional di seluruh dunia.
#: src/components/WelcomeBanner.js:6
msgid "Welcome to our platform"
msgstr ""
#: src/components/WelcomeBanner.js:8
msgid "Hello {userName}, check out your <0>dashboard</0> to get started."
msgstr ""
#: src/components/CartSummary.js:5
msgid "{itemCount, plural, =0 {Your cart is empty} one {You have # item in your cart} other {You have # items in your cart}}"
msgstr ""Setelah diterjemahkan, setiap msgstr diisi dengan versi yang dilokalkan. Lingui mempertahankan sintaks ICU MessageFormat, tag terindeks untuk komponen React, dan variabel placeholder di semua terjemahan.
#: src/components/WelcomeBanner.js:6
msgid "Welcome to our platform"
msgstr "Bienvenue sur notre plateforme"
#: src/components/WelcomeBanner.js:8
msgid "Hello {userName}, check out your <0>dashboard</0> to get started."
msgstr "Bonjour {userName}, consultez votre <0>tableau de bord</0> pour commencer."
#: src/components/CartSummary.js:5
msgid "{itemCount, plural, =0 {Your cart is empty} one {You have # item in your cart} other {You have # items in your cart}}"
msgstr "{itemCount, plural, =0 {Votre panier est vide} one {Vous avez # article dans votre panier} other {Vous avez # articles dans votre panier}}"Atur katalog PO Anda di dalam direktori locales dengan satu subfolder per lokal. Lingui CLI secara otomatis membuat dan memperbarui file-file ini selama ekstraksi. Modul JS yang dikompilasi dihasilkan pada waktu build dan tidak boleh diedit secara manual.
src/
├── locales/
│ ├── en/
│ │ └── messages.po ← Source (English)
│ ├── fr/
│ │ └── messages.po ← French
│ ├── de/
│ │ └── messages.po ← German
│ ├── ja/
│ │ └── messages.po ← Japanese
│ ├── es/
│ │ └── messages.po ← Spanish
│ └── zh-CN/
│ └── messages.po ← Chinese Simplified
├── components/
├── i18n.ts
├── App.tsx
└── ...Lingui menyediakan dua pendekatan utama untuk menandai pesan: makro JSX untuk konten komponen dan hook useLingui untuk string imperatif. Keduanya adalah makro waktu kompilasi yang menghasilkan output teroptimasi.
Bungkus konten JSX apa pun dalam makro Trans agar dapat diterjemahkan. Variabel, elemen HTML, dan komponen React didukung sepenuhnya - makro mengubahnya menjadi ICU MessageFormat dengan tag terindeks secara otomatis.
import { Trans } from "@lingui/react/macro";
function WelcomeBanner({ userName }) {
return (
<div>
<h1>
<Trans>Welcome to our platform</Trans>
</h1>
<p>
<Trans>
Hello {userName}, check out your <a href="/dashboard">dashboard</a> to
get started.
</Trans>
</p>
</div>
);
}Untuk string di luar JSX - pesan peringatan, label aria, nilai atribut, atau kode imperatif apa pun - gunakan hook makro useLingui dengan tagged template literals:
import { useLingui } from "@lingui/react/macro";
function NotificationButton() {
const { t } = useLingui();
const showAlert = () => {
alert(t`Your changes have been saved.`);
};
return (
<button onClick={showAlert} aria-label={t`Save changes`}>
<Trans>Save</Trans>
</button>
);
}Lingui mendukung dua pendekatan untuk identifikasi pesan: ID yang dibuat otomatis (berasal dari konten pesan sumber) dan ID eksplisit (kunci yang ditentukan pengembang). Kedua pendekatan bekerja dengan file PO.
import { Trans } from "@lingui/react/macro";
// Auto-generated ID (from message content)
<Trans>Welcome to our platform</Trans>
// Explicit ID (developer-defined key)
<Trans id="nav.welcome">Welcome to our platform</Trans>Gunakan prop comment pada makro apa pun untuk menambahkan deskripsi. Komentar ini diekstraksi ke dalam file PO sebagai catatan penerjemah, memberikan konteks penting tentang di mana dan bagaimana pesan tersebut muncul.
import { Trans } from "@lingui/react/macro";
<Trans comment="Shown on the homepage hero section above the fold">
Start building with confidence
</Trans>Lingui menggunakan ICU MessageFormat untuk penjamakan, yang mendukung semua kategori jamak CLDR. Makro Plural memudahkan penanganan berbagai bentuk jamak langsung di JSX:
import { Plural } from "@lingui/react/macro";
function CartSummary({ itemCount }) {
return (
<p>
<Plural
value={itemCount}
_0="Your cart is empty"
one="You have # item in your cart"
other="You have # items in your cart"
/>
</p>
);
}Setelah mengekstraksi dan mengompilasi pesan Anda, siapkan instance i18n dan bungkus aplikasi Anda dalam I18nProvider.
Buat modul i18n yang memuat katalog pesan yang dikompilasi secara dinamis. Plugin Lingui Vite memungkinkan impor langsung file PO, yang dikompilasi secara langsung selama pengembangan:
// src/i18n.ts
import { i18n } from "@lingui/core";
export async function loadCatalog(locale: string) {
const { messages } = await import(`./locales/${locale}/messages.po`);
i18n.load(locale, messages);
i18n.activate(locale);
}
// Initialize with default locale
loadCatalog("en");
export default i18n;Bungkus seluruh aplikasi Anda dengan I18nProvider agar terjemahan tersedia untuk semua komponen melalui konteks React:
// src/App.tsx
import { I18nProvider } from "@lingui/react";
import { i18n } from "./i18n";
function App() {
return (
<I18nProvider i18n={i18n}>
<YourAppContent />
</I18nProvider>
);
}Mengganti bahasa sangat mudah: muat katalog baru, aktifkan lokal, dan React secara otomatis merender ulang semua konten yang diterjemahkan. Berikut adalah komponen pengalih bahasa yang lengkap:
import { useState } from "react";
import { loadCatalog } from "./i18n";
import { Trans } from "@lingui/react/macro";
const LANGUAGES = {
en: "English",
fr: "Français",
de: "Deutsch",
ja: "日本語",
es: "Español",
};
function LanguageSwitcher() {
const [currentLocale, setCurrentLocale] = useState("en");
const handleChange = async (locale: string) => {
await loadCatalog(locale);
setCurrentLocale(locale);
};
return (
<select
value={currentLocale}
onChange={(e) => handleChange(e.target.value)}
>
{Object.entries(LANGUAGES).map(([code, name]) => (
<option key={code} value={code}>
{name}
</option>
))}
</select>
);
}CLI Lingui menyediakan dua perintah utama yang membentuk inti alur kerja terjemahan Anda: extract untuk menarik pesan dari kode sumber ke dalam katalog PO, dan compile untuk mengubah file PO menjadi modul JavaScript yang teroptimasi untuk produksi.
# Extract messages from source code into PO catalogs
npx lingui extract
# Translate your PO files (manually, with a TMS, or with AI)
# Compile PO catalogs into optimized JS modules for production
npx lingui compilel10n.dev menyediakan dukungan asli untuk file PO, menjadikannya pendamping yang sempurna untuk proyek Lingui.js. Unggah katalog PO sumber Anda dan terima file yang telah diterjemahkan secara akurat:
Gunakan paket npm ai-l10n untuk menerjemahkan katalog PO Lingui Anda dari baris perintah atau sebagai bagian dari pipeline CI/CD. Instal sekali, lalu terjemahkan ke sejumlah bahasa dalam satu perintah.
# Install the CLI
npm install ai-l10n
# Translate your source PO file to multiple languages
npx ai-l10n translate src/locales/en/messages.po \
--languages fr,de,ja,zh-CN,es,koHubungkan ai-l10n langsung ke proses build Lingui Anda agar terjemahan selalu mutakhir. Gabungkan ekstraksi, terjemahan, dan kompilasi dalam satu alur kerja.
Tambahkan extract, translate, dan compile sebagai skrip dan hubungkan ketiganya. Skrip i18n menjalankan pipeline penuh; gunakan dalam prebuild untuk memastikan terjemahan selalu terkini sebelum pengiriman.
{
"scripts": {
"extract": "lingui extract",
"compile": "lingui compile",
"translate": "ai-l10n translate src/locales/en/messages.po --languages fr,de,ja,zh-CN,es,ko --update",
"i18n": "npm run extract && npm run translate && npm run compile",
"prebuild": "npm run i18n",
"build": "vite build",
"dev": "vite"
}
}Jika tim Anda menggunakan Make, deklarasikan ekstraksi, terjemahan, dan kompilasi sebagai target terpisah dengan dependensi yang tepat:
LANGUAGES = fr,de,ja,zh-CN,es,ko
extract:
npx lingui extract
translate:
npx ai-l10n translate src/locales/en/messages.po --languages $(LANGUAGES) --update
compile:
npx lingui compile
i18n: extract translate compile
dev: i18n
npx vite
build: i18n
npx vite buildUntuk integrasi CI/CD, pembaruan inkremental, terjemahan batch di berbagai file, dan contoh alur kerja GitHub Actions, lihat Panduan Otomatisasi Lokalisasi.
Ekstensi VS Code l10n.dev membawa terjemahan file PO langsung ke editor Anda. Terjemahkan katalog Lingui Anda tanpa meninggalkan VS Code.
Siap menjangkau pengguna global? Terjemahkan file PO Lingui Anda langsung di ruang kerja l10n.dev, otomatiskan dengan CLI npm, atau terjemahkan langsung di dalam VS Code:
Temukan mengapa terjemahan berbasis AI lebih baik untuk file i18n dibandingkan metode tradisional
Integrasikan lokalisasi berbasis AI langsung ke dalam pipeline CI/CD Anda
Bawa lokalisasi AI ke dalam alur kerja Anda dengan ekstensi dan plugin kami
Terima kasih telah menggunakan l10n.dev untuk melokalkan proyek Lingui.js Anda! 🚀
Jika panduan ini membantu Anda, bagikan dengan pengembang React lain yang perlu menginternasionalkan aplikasi mereka dengan file PO.
Bersama-sama, kita dapat membuat aplikasi JavaScript lebih mudah diakses dan siap untuk audiens global.