Lingui.js ist ein leichtgewichtiges und dennoch leistungsstarkes Framework zur Internationalisierung (i18n) für JavaScript- und React-Anwendungen. Es verwendet branchenübliche PO-Dateien (Portable Object) für Übersetzungskataloge, leistungsstarke Compile-Time-Makros für eine saubere Entwicklererfahrung und erzeugt optimierte Bundles unter 2 kB. Dieser Leitfaden deckt alles ab, vom Projekt-Setup über PO-Datei-Workflows und Pluralisierung bis hin zur Automatisierung von Übersetzungen mit l10n.dev.
Lingui.js hebt sich von anderen JavaScript-i18n-Bibliotheken durch die Kombination aus Entwicklererfahrung, Leistung und professionellen Übersetzungs-Workflows ab:
Installieren Sie die Kernpakete und Entwicklungstools von Lingui. Die Runtime-Pakete (@lingui/core und @lingui/react) werden in der Produktion benötigt, während CLI, Vite-Plugin und Babel-Makro nur für die Entwicklung gedacht sind:
npm install @lingui/core @lingui/react
npm install --save-dev @lingui/cli @lingui/vite-plugin @lingui/babel-plugin-lingui-macroLingui erfordert zwei Konfigurationsdateien: die Lingui-Konfiguration (zur Definition von Locales und Katalogpfaden) und die Konfiguration Ihres Build-Tools (zur Aktivierung der Compile-Time-Makros).
Erstellen Sie eine lingui.config.js-Datei im Stammverzeichnis Ihres Projekts. Hier definieren Sie Ihre Quell-Locale, Ziel-Locales, den Speicherort für PO-Kataloge und das Katalogformat. Das PO-Format ist die Standardeinstellung und die empfohlene Wahl:
// 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 }),
});Wenn Sie Vite verwenden, fügen Sie das Lingui-Plugin zusammen mit dem React-Plugin und dem Babel-Makro hinzu. Dies ermöglicht die Nachrichten-Transformation zur Kompilierzeit und die On-the-fly-Katalog-Kompilierung:
// 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) ist das branchenübliche Übersetzungsdateiformat, das aus dem GNU-gettext-System stammt. Lingui verwendet PO als Standard-Katalogformat, da es weltweit von Übersetzungstools, TMS-Plattformen und professionellen Übersetzern breit unterstützt wird.
#: 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 ""Nach der Übersetzung wird jedes msgstr mit der lokalisierten Version gefüllt. Lingui bewahrt die ICU-MessageFormat-Syntax, indizierte Tags für React-Komponenten und Platzhaltervariablen über alle Übersetzungen hinweg.
#: 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}}"Organisieren Sie Ihre PO-Kataloge in einem locales-Verzeichnis mit einem Unterordner pro Locale. Die Lingui-CLI erstellt und aktualisiert diese Dateien während der Extraktion automatisch. Kompilierte JS-Module werden zur Build-Zeit generiert und sollten nicht manuell bearbeitet werden.
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 bietet zwei Hauptansätze zum Markieren von Nachrichten: JSX-Makros für Komponenteninhalt und den useLingui-Hook für imperative Zeichenfolgen. Beide sind Compile-Time-Makros, die optimierte Ausgaben erzeugen.
Umschließen Sie beliebige JSX-Inhalte mit dem Trans-Makro, um sie übersetzbar zu machen. Variablen, HTML-Elemente und React-Komponenten werden vollständig unterstützt – das Makro wandelt sie automatisch in das ICU-MessageFormat mit indizierten Tags um.
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>
);
}Für Zeichenfolgen außerhalb von JSX – wie Alert-Nachrichten, Aria-Labels, Attributwerte oder imperativen Code – verwenden Sie den useLingui-Makro-Hook mit 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 unterstützt zwei Ansätze für die Nachrichtenidentifizierung: automatisch generierte IDs (abgeleitet vom Quellnachrichteninhalt) und explizite IDs (entwicklerdefinierte Schlüssel). Beide Ansätze funktionieren mit PO-Dateien.
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>Verwenden Sie den comment-Prop bei jedem Makro, um eine Beschreibung hinzuzufügen. Dieser Kommentar wird als Übersetzerhinweis in die PO-Datei extrahiert und liefert kritischen Kontext darüber, wo und wie die Nachricht erscheint.
import { Trans } from "@lingui/react/macro";
<Trans comment="Shown on the homepage hero section above the fold">
Start building with confidence
</Trans>Lingui verwendet das ICU-MessageFormat für die Pluralisierung, das alle CLDR-Pluralkategorien unterstützt. Das Plural-Makro macht es einfach, verschiedene Pluralformen direkt in JSX zu handhaben:
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>
);
}Nachdem Sie Ihre Nachrichten extrahiert und kompiliert haben, richten Sie die i18n-Instanz ein und umschließen Sie Ihre App mit dem I18nProvider.
Erstellen Sie ein i18n-Modul, das kompilierte Nachrichtenkataloge dynamisch lädt. Das Lingui-Vite-Plugin ermöglicht den direkten Import von PO-Dateien, die während der Entwicklung on-the-fly kompiliert werden:
// 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;Umschließen Sie Ihre gesamte App mit dem I18nProvider, um Übersetzungen über den React-Kontext für alle Komponenten verfügbar zu machen:
// src/App.tsx
import { I18nProvider } from "@lingui/react";
import { i18n } from "./i18n";
function App() {
return (
<I18nProvider i18n={i18n}>
<YourAppContent />
</I18nProvider>
);
}Das Wechseln von Sprachen ist unkompliziert: Laden Sie den neuen Katalog, aktivieren Sie die Locale, und React rendert automatisch alle übersetzten Inhalte neu. Hier ist eine vollständige Sprachwechsler-Komponente:
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>
);
}Die CLI von Lingui bietet zwei Schlüsselbefehle, die den Kern Ihres Übersetzungs-Workflows bilden: extract, um Nachrichten aus dem Quellcode in PO-Kataloge zu ziehen, und compile, um PO-Dateien in optimierte JavaScript-Module für die Produktion zu konvertieren.
# 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 bietet native Unterstützung für PO-Dateien und ist damit der perfekte Begleiter für Lingui.js-Projekte. Laden Sie Ihren Quell-PO-Katalog hoch und erhalten Sie präzise übersetzte Dateien zurück:
Verwenden Sie das npm-Paket ai-l10n, um Ihre Lingui-PO-Kataloge über die Befehlszeile oder als Teil einer CI/CD-Pipeline zu übersetzen. Einmal installieren, dann in einem einzigen Befehl in beliebig viele Sprachen übersetzen.
# 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,koBinden Sie ai-l10n direkt in Ihren Lingui-Build-Prozess ein, damit Übersetzungen immer auf dem neuesten Stand sind. Kombinieren Sie Extraktion, Übersetzung und Kompilierung in einem einzigen Workflow.
Fügen Sie extract, translate und compile als Skripte hinzu und verketten Sie diese. Das i18n-Skript führt die gesamte Pipeline aus; verwenden Sie es im prebuild, um sicherzustellen, dass Übersetzungen vor dem Release immer aktuell sind.
{
"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"
}
}Wenn Ihr Team Make verwendet, deklarieren Sie Extraktion, Übersetzung und Kompilierung als separate Ziele mit entsprechenden Abhängigkeiten:
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 buildFür CI/CD-Integration, inkrementelle Updates, Batch-Übersetzung über mehrere Dateien und Beispiele für GitHub-Actions-Workflows, siehe den Leitfaden zur Lokalisierungsautomatisierung.
Die l10n.dev VS Code-Erweiterung bringt die PO-Datei-Übersetzung direkt in Ihren Editor. Übersetzen Sie Ihre Lingui-Kataloge, ohne VS Code zu verlassen.
Bereit, globale Nutzer zu erreichen? Übersetzen Sie Ihre Lingui-PO-Dateien direkt im l10n.dev-Workspace, automatisieren Sie mit der npm-CLI oder übersetzen Sie direkt in VS Code:
Entdecke, warum KI-gestützte Übersetzung besser für i18n-Dateien ist als traditionelle Methoden.
Integriere KI-gestützte Lokalisierung direkt in deine CI/CD-Pipeline.
Bringe KI-Lokalisierung in deinen Arbeitsablauf mit unseren Erweiterungen und Plugins.
Vielen Dank, dass Sie l10n.dev für die Lokalisierung Ihres Lingui.js-Projekts verwenden! 🚀
Wenn dieser Leitfaden Ihnen geholfen hat, teilen Sie ihn mit anderen React-Entwicklern, die ihre Anwendungen mit PO-Dateien internationalisieren müssen.
Gemeinsam können wir JavaScript-Anwendungen zugänglicher und bereit für ein globales Publikum machen.