Lingui.js adalah kerangka kerja internasionalisasi (i18n) yang ringan namun kuat untuk aplikasi JavaScript dan React. Ini menggunakan file PO (Portable Object) standar industri untuk katalog terjemahan, makro waktu kompilasi yang kuat untuk pengalaman pengembang yang bersih, dan menghasilkan bundel yang dioptimalkan 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, kinerja, 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 saat terbang:
// 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 dilokalisasi. 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 yang dioptimalkan.
Bungkus konten JSX apa pun dalam makro Trans untuk membuatnya 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 makro hook useLingui dengan literal templat bertag:
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 penjamakan CLDR. Makro Plural memudahkan penanganan berbagai bentuk penjamakan 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 saat terbang 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 untuk membuat terjemahan tersedia bagi 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 katalog PO, dan compile untuk mengonversi file PO menjadi modul JavaScript yang dioptimalkan 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 diterjemahkan dengan akurat:
Gunakan paket npm ai-l10n untuk menerjemahkan katalog PO Lingui Anda dari baris perintah atau sebagai bagian dari alur 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 dalam proses build Lingui Anda sehingga terjemahan selalu mutakhir. Gabungkan ekstraksi, terjemahan, dan kompilasi dalam satu alur kerja.
Tambahkan extract, translate, dan compile sebagai skrip dan hubungkan semuanya. Skrip i18n menjalankan alur 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 beberapa file, dan contoh alur kerja GitHub Actions, lihat Panduan Otomatisasi Lokalisasi.
Ekstensi VS Code l10n.dev menghadirkan 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, otomatisasi dengan CLI npm, atau terjemahkan langsung di dalam VS Code:
Temukan alasan mengapa terjemahan bertenaga AI lebih baik untuk file i18n dibandingkan metode tradisional
Integrasikan lokalisasi bertenaga AI langsung ke dalam alur kerja CI/CD Anda
Bawa lokalisasi AI ke dalam alur kerja Anda dengan ekstensi dan plugin kami
Terima kasih telah menggunakan l10n.dev untuk melokalisasi proyek Lingui.js Anda! 🚀
Jika panduan ini membantu Anda, bagikan dengan pengembang React lain yang perlu menginternasionalisasi aplikasi mereka dengan file PO.
Bersama-sama, kita dapat membuat aplikasi JavaScript lebih mudah diakses dan siap untuk audiens global.