O Lingui.js é um framework de internacionalização (i18n) leve e poderoso para aplicações JavaScript e React. Ele utiliza arquivos PO (Portable Object) padrão da indústria para catálogos de tradução, macros poderosas em tempo de compilação para uma experiência de desenvolvimento limpa e produz bundles otimizados com menos de 2 kB. Este guia cobre tudo, desde a configuração do projeto até fluxos de trabalho com arquivos PO, pluralização e automação de traduções com a l10n.dev.
O Lingui.js se destaca entre as bibliotecas de i18n para JavaScript por sua combinação de experiência de desenvolvimento, desempenho e fluxos de trabalho de tradução profissionais:
Instale os pacotes principais e as ferramentas de desenvolvimento do Lingui. Os pacotes de runtime (@lingui/core e @lingui/react) são necessários em produção, enquanto a CLI, o plugin Vite e a macro Babel são apenas para desenvolvimento:
npm install @lingui/core @lingui/react
npm install --save-dev @lingui/cli @lingui/vite-plugin @lingui/babel-plugin-lingui-macroO Lingui requer dois arquivos de configuração: a configuração do Lingui (definindo locales e caminhos dos catálogos) e a configuração da sua ferramenta de build (para habilitar macros em tempo de compilação).
Crie um arquivo lingui.config.js na raiz do seu projeto. Ele define seu locale de origem, locales de destino, onde armazenar os catálogos PO e o formato do catálogo. O formato PO é a escolha padrão e recomendada:
// 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 }),
});Se você usa Vite, adicione o plugin Lingui junto com o plugin React com a macro Babel. Isso habilita a transformação de mensagens em tempo de compilação e a compilação de catálogos sob demanda:
// 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) é o formato de arquivo de tradução padrão da indústria, originado do sistema GNU gettext. O Lingui usa PO como seu formato de catálogo padrão porque é amplamente suportado por ferramentas de tradução, plataformas TMS e tradutores profissionais em todo o mundo.
#: 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 ""Após a tradução, cada msgstr é preenchido com a versão localizada. O Lingui preserva a sintaxe ICU MessageFormat, tags indexadas para componentes React e variáveis de placeholder em todas as traduções.
#: 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}}"Organize seus catálogos PO dentro de um diretório locales com uma subpasta por locale. A CLI do Lingui cria e atualiza automaticamente esses arquivos durante a extração. Módulos JS compilados são gerados no momento da build e não devem ser editados manualmente.
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
└── ...O Lingui oferece duas abordagens principais para marcar mensagens: macros JSX para conteúdo de componentes e o hook useLingui para strings imperativas. Ambos são macros de tempo de compilação que produzem saída otimizada.
Envolva qualquer conteúdo JSX na macro Trans para torná-lo traduzível. Variáveis, elementos HTML e componentes React são totalmente suportados - a macro os transforma automaticamente em ICU MessageFormat com tags indexadas.
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>
);
}Para strings fora do JSX - mensagens de alerta, aria labels, valores de atributos ou qualquer código imperativo - use o hook de macro useLingui com 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>
);
}O Lingui suporta duas abordagens para identificação de mensagens: IDs gerados automaticamente (derivados do conteúdo da mensagem de origem) e IDs explícitos (chaves definidas pelo desenvolvedor). Ambas as abordagens funcionam com arquivos 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>Use a prop comment em qualquer macro para adicionar uma descrição. Este comentário é extraído para o arquivo PO como uma nota para o tradutor, fornecendo contexto crítico sobre onde e como a mensagem aparece.
import { Trans } from "@lingui/react/macro";
<Trans comment="Shown on the homepage hero section above the fold">
Start building with confidence
</Trans>O Lingui usa ICU MessageFormat para pluralização, que suporta todas as categorias de plural do CLDR. A macro Plural facilita o tratamento de diferentes formas de plural diretamente no 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>
);
}Após extrair e compilar suas mensagens, configure a instância i18n e envolva seu aplicativo no I18nProvider.
Crie um módulo i18n que carrega catálogos de mensagens compilados dinamicamente. O plugin Lingui Vite permite importações diretas de arquivos PO, que são compilados sob demanda durante o desenvolvimento:
// 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;Envolva todo o seu aplicativo com o I18nProvider para disponibilizar as traduções para todos os componentes via contexto React:
// src/App.tsx
import { I18nProvider } from "@lingui/react";
import { i18n } from "./i18n";
function App() {
return (
<I18nProvider i18n={i18n}>
<YourAppContent />
</I18nProvider>
);
}Trocar de idioma é simples: carregue o novo catálogo, ative o locale e o React renderiza automaticamente todo o conteúdo traduzido. Aqui está um componente completo de troca de idioma:
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>
);
}A CLI do Lingui fornece dois comandos principais que formam o núcleo do seu fluxo de trabalho de tradução: extract para extrair mensagens do código-fonte para catálogos PO, e compile para converter arquivos PO em módulos JavaScript otimizados para produção.
# 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 compileA l10n.dev oferece suporte nativo a arquivos PO, tornando-a a companheira perfeita para projetos Lingui.js. Envie seu catálogo PO de origem e receba arquivos traduzidos com precisão:
Use o pacote npm ai-l10n para traduzir seus catálogos PO do Lingui a partir da linha de comando ou como parte de um pipeline de CI/CD. Instale uma vez e traduza para qualquer número de idiomas com um único comando.
# 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,koConecte o ai-l10n diretamente ao seu processo de build do Lingui para que as traduções estejam sempre atualizadas. Combine extração, tradução e compilação em um único fluxo de trabalho.
Adicione extract, translate e compile como scripts e encadeie-os. O script i18n executa o pipeline completo; use-o no prebuild para garantir que as traduções estejam sempre atualizadas antes do deploy.
{
"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"
}
}Se sua equipe usa Make, declare a extração, tradução e compilação como targets separados com as devidas dependências:
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 buildPara integração com CI/CD, atualizações incrementais, tradução em lote entre múltiplos arquivos e exemplos de fluxo de trabalho no GitHub Actions, veja o Guia de Automação de Localização.
A extensão l10n.dev para VS Code traz a tradução de arquivos PO diretamente para o seu editor. Traduza seus catálogos Lingui sem sair do VS Code.
Pronto para alcançar usuários globais? Traduza seus arquivos PO do Lingui diretamente no workspace da l10n.dev, automatize com a CLI npm ou traduza diretamente dentro do VS Code:
Descubra por que a tradução potencializada por IA é melhor para arquivos i18n do que métodos tradicionais
Integre a localização potencializada por IA diretamente em seu pipeline CI/CD
Traga a localização por IA para seu fluxo de trabalho com nossas extensões e plugins
Obrigado por usar a l10n.dev para localizar seu projeto Lingui.js! 🚀
Se este guia o ajudou, compartilhe-o com outros desenvolvedores React que precisam internacionalizar suas aplicações com arquivos PO.
Juntos, podemos tornar as aplicações JavaScript mais acessíveis e prontas para um público global.