Faça sua pergunta e obtenha um resumo do documento referenciando esta página e o provedor AI de sua escolha
Histórico de versões
- "Versão inicial"v9.5.1026/09/2026
O conteúdo desta página foi traduzido com uma IA.
Veja a última versão do conteúdo original em inglêsSe você tiver uma ideia para melhorar esta documentação, sinta-se à vontade para contribuir enviando uma pull request no GitHub.
Link do GitHub para a documentaçãoCopiar o Markdown do documento para a área de transferência
Como internacionalizar sua aplicação Next.js usando Lingui em 2026
Sumário
O que é o Lingui?
O Lingui é uma biblioteca de i18n construída em torno de macros e extração de mensagens. Você escreve o texto de origem diretamente em seus componentes ( t`Hello` , <Trans>Hello</Trans>), o comando lingui extract coleta todas as mensagens em catálogos (arquivos PO por padrão) e um loader os compila para JavaScript compacto. As mensagens utilizam o ICU MessageFormat, e o Lingui suporta React Server Components no App Router.
Este guia configura o Lingui em um projeto Next.js 16 App Router, com:
- Macros compiladas por SWC, para que o Turbopack mantenha sua velocidade.
- Server e Client Components compartilhando a mesma API
TranseuseLingui. - Roteamento de localidade através de
proxy.ts:/aboutpara a localidade padrão,/fr/aboutpara as demais, além de detecção de idioma na primeira visita. - Renderização estática de todas as localidades com
generateStaticParams. - SEO multilíngue completo:
generateMetadatatraduzido, canonical,hreflangcomx-default, localidades Open Graph, JSON-LD,sitemap.ts,robots.tse páginas 404 localizadas.
Procurando outra biblioteca? Veja o guia de next-intl, o guia de next-i18next ou o guia de Next.js + Intlayer.
Usando TanStack Start? Veja o guia de TanStack Start + Lingui. Comparando bibliotecas? Leia Lingui vs Intlayer e next-i18next vs next-intl vs Intlayer.
O que o benchmark diz sobre o Lingui no Next.js
O benchmark de i18n executa a mesma aplicação Next.js de 10 páginas e 10 localidades com as principais bibliotecas e mede o que o navegador realmente baixa.
Carregamento JSON dinâmico
Carrega as traduções tardiamente em tempo de execução
JSON com escopo (namespacing)
Namespaces de tradução por página
Benchmark de Desempenho I18n
O que é essa métrica?
O tamanho total compactado em gzip do pacote da biblioteca de internacionalização. Inclui apenas o provedor e a lógica de recuperação de conteúdo após o tree-shaking e a minificação.
Por que é importante?
Um tamanho de biblioteca menor reduz a carga útil inicial de JavaScript, resultando em tempos de download e execução mais rápidos no cliente.
Ver como
Principais números para @lingui/core@6.6.0 no Next.js 16, medidos em 2026-09-26 (gzip):
Abrir a tabela em um modal para ver todo o conteúdo claramente
| Configuração | Tamanho da biblioteca | JS por página | Vazamento de outras localidades | Vazamento de outras páginas |
|---|---|---|---|---|
| Sem i18n (app base) | - | 141.0 KB | 0% | 0% |
| Lingui, um catálogo por localidade | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (compat) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (Intlayer nativo) | 4.9 KB | 141.5 KB | 0% | 0% |
Principais conclusões:
- Um único catálogo por localidade ainda vaza mensagens de outras páginas para o provedor do cliente. Mantenha o máximo de texto possível em Server Components, que enviam HTML renderizado, não catálogos.
- O runtime do Lingui pesa ~72 KB gzip. O adaptador de compatibilidade
@intlayer/linguireduz o runtime para ~11 KB, mas neste benchmark a configuração de compatibilidade do Next.js ainda envia catálogos inteiros para a página. A API nativanext-intlayeré a configuração que permanece no tamanho da aplicação base.
Veja os dados completos: Relatório de benchmark do Next.js e o repositório do benchmark.
Comparação de recursos no Next.js
Como o Lingui se compara com next-intl e Intlayer nos recursos que um projeto Next.js App Router geralmente necessita:
Abrir a tabela em um modal para ver todo o conteúdo claramente
| Recurso | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| Traduções próximas aos componentes | ✅ Conteúdo co-localizado com cada componente | ⚠️ Texto fonte nos componentes, catálogos centralizados | ❌ JSON centralizado |
| Integração com TypeScript | ✅ Tipos estritos gerados automaticamente | ⚠️ Macros tipadas, catálogos de mensagens não | ✅ Boa, via ampliação de AppConfig |
| Detecção de traduções ausentes | ✅ Erros de TypeScript e avisos no momento do build | ⚠️ Fallback em tempo de execução para o texto fonte | ⚠️ Fallback em tempo de execução |
| Conteúdo rico (JSX, Markdown) | ✅ Suporte direto | ✅ JSX dentro de <Trans>, sem Markdown | ⚠️ Tags via t.rich, sem Markdown |
| Tradução com IA | ✅ Seu próprio provedor e chave de API com contexto | ❌ Não | ❌ Não |
| Editor visual / CMS | ✅ Editor visual local + CMS opcional | ❌ Via plataformas externas | ❌ Via plataformas externas |
| Roteamento localizado | ✅ Integrado | ❌ Escreva seu próprio proxy.ts | ✅ Segmento [locale] integrado |
| Pluralização | ✅ Baseada em enumeração | ✅ ICU, macro <Plural> | ✅ ICU |
| Formatos de conteúdo | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Via format: "icu" | ✅ Nativo | ✅ Nativo |
| Auxiliares de SEO (hreflang, sitemap) | ✅ Auxiliares de metadados, sitemap e robots.txt | ❌ Manual | ✅ Bom |
| Server Components | ✅ Acesso direto em qualquer Server Component | ⚠️ setI18n em cada layout e página | ⚠️ await getTranslations() por componente |
| Tree-shaking por componente | ✅ No momento do build (Babel / SWC) | ⚠️ Um catálogo por localidade, extrator por página é experimental | ⚠️ Manual, com pick() por rota |
| Tamanho do runtime (gzip, benchmark) | 4.9 KB | 72.1 KB | 14.7 KB |
| Traduções ausentes no CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Não integrado |
| Ecossistema / comunidade | ⚠️ Menor, em rápido crescimento | ✅ Maduro | ✅ Grande |
Os tamanhos de runtime vêm do benchmark do Next.js. Para uma discussão detalhada, leia Lingui vs Intlayer.
Outros guias de Next.js: next-intl, next-i18next e Intlayer.
Práticas recomendadas que você deve seguir
- Defina
langedirem<html>no layout de[locale]. - Prefira Server Components para texto: eles renderizam HTML no servidor e não precisam do catálogo no cliente.
- Chame
initLingui(locale)em cada layout e página. Layouts não são renderizados novamente na navegação, portanto, uma página não pode depender do fato de seu layout ter definido a localidade. - Mantenha uma URL por localidade e pré-renderize todas as localidades com
generateStaticParams. - Traduza seus metadados em
generateMetadata, comcanonical,hreflangex-default. - Gere um sitemap e robots.txt multilíngues com as convenções
sitemap.tserobots.ts. - Use links reais para o seletor de idiomas, para que os rastreadores descubram todas as versões de idioma.
- Execute
lingui extractno CI para que uma nova mensagem nunca seja lançada sem tradução.
Veja nosso guia sobre internacionalização e SEO, o guia de hreflang e a comparação de SEO multilíngue no Next.js.
Guia passo a passo para configurar o Lingui em uma aplicação Next.js
Aqui está a estrutura do projeto que iremos criar:
Copiar o código para a área de transferência
Instalar dependências
bashCopiar códigoCopiar o código para a área de transferência
- @lingui/core / @lingui/react: runtime,
I18nProvider,setI18npara Server Components e as macros (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin: compila as macros dentro do pipeline SWC do Next.js.
- @lingui/loader: compila catálogos
.pona importação, dispensando o uso delingui compile. - @lingui/cli:
lingui extractpara coletar mensagens em catálogos.
@lingui/swc-pluginé um plugin WebAssembly vinculado à versão do SWC do Next.js. Se o build falhar após uma atualização do Next.js, atualize o plugin para a versão listada como compatível em seu README.- @lingui/core / @lingui/react: runtime,
Centralizar a configuração de localidade
Um único arquivo define localidades e utilitários de URL. Roteamento, metadados, sitemap e o Lingui leem a partir dele.
src/i18n/config.tsCopiar códigoCopiar o código para a área de transferência
Configurar o Lingui e o Next.js
lingui.config.tsCopiar códigoCopiar o código para a área de transferência
O plugin SWC compila as macros e o loader compila os arquivos
.po, tanto para o Turbopack (padrão no Next.js 16) quanto para o webpack:next.config.tsCopiar códigoCopiar o código para a área de transferência
Adicione os scripts de extração:
package.jsonCopiar códigoCopiar o código para a área de transferência
Carregar catálogos e criar instâncias no servidor
Server Components não possuem contexto React, portanto o Lingui disponibiliza
setI18npara registrar a instância na renderização atual. Este módulo carrega cada catálogo uma vez por processo do servidor e cria uma instânciaI18npor localidade. Ele éserver-only: catálogos de outras localidades nunca chegam ao bundle do cliente.src/i18n/appRouterI18n.tsCopiar códigoCopiar o código para a área de transferência
src/i18n/initLingui.tsCopiar códigoCopiar o código para a área de transferência
Para que o TypeScript reconheça a importação de
.po, declare o módulo uma vez:src/i18n/po.d.tsCopiar códigoCopiar o código para a área de transferência
Criar o provedor de cliente
Client Components leem traduções a partir de um contexto React. O provedor recebe o catálogo da localidade ativa a partir do layout do servidor e cria sua própria instância uma única vez.
src/components/LinguiClientProvider.tsxCopiar códigoCopiar o código para a área de transferência
Definir rotas dinâmicas de localidade
O segmento
[locale]abriga o layout raiz.generateStaticParamspré-renderiza todas as localidades no momento do build, edynamicParams = falseretorna um 404 para qualquer outro prefixo.src/app/[locale]/layout.tsxCopiar códigoCopiar o código para a área de transferência
O provedor do cliente recebe todo o catálogo da localidade ativa. Isso é o que o benchmark mede como "vazamento de outras páginas". Manter o texto em Server Components reduz o que o cliente realmente necessita. Para aplicações grandes, o extrator experimental por página do Lingui (
experimental.extractoremlingui.config.ts) divide catálogos por ponto de entrada.Utilizar traduções em Server Components
Server Components utilizam as mesmas macros que os Client Components.
initLinguitambém deve ser executado na página, pois um layout não é renderizado novamente ao navegar entre suas páginas.src/app/[locale]/about/page.tsxCopiar códigoCopiar o código para a área de transferência
Utilizar traduções em Client Components
Client Components utilizam as mesmas importações. As macros leem a instância a partir do
LinguiClientProvider.src/components/Counter.tsxCopiar códigoCopiar o código para a área de transferência
Extrair e traduzir suas mensagens
Execute a extração. O Lingui grava cada mensagem encontrada em
srcnos catálogos de cada localidade:bashCopiar códigoCopiar o código para a área de transferência
Em seguida, traduza o
msgstrde cada entrada:src/locales/fr/messages.poCopiar códigoCopiar o código para a área de transferência
src/locales/es/messages.poCopiar códigoCopiar o código para a área de transferência
Os marcadores
<0>mantêm os elementos JSX de um<Trans>no lugar, permitindo que os tradutores os reposicionem sem alterar a marcação.Configurar o proxy para roteamento de localidade
OpcionalO Next.js 16 renomeou
middleware.tsparaproxy.ts. O proxy implementa a estratégia de prefixo conforme necessário ("as-needed"):/fr/abouté servido como está;/en/aboutredireciona para/about, mantendo uma URL única para a localidade padrão;/abouté reescrito internamente para/en/about, sem alterar a URL exibida;- uma primeira visita em
/redireciona para o idioma preferido (cookie primeiro, depoisAccept-Language).
src/i18n/negotiateLocale.tsCopiar códigoCopiar o código para a área de transferência
src/proxy.tsCopiar códigoCopiar o código para a área de transferência
Alterar o idioma do seu conteúdo
OpcionalusePathnameretorna a URL vista pelo navegador (/aboutou/fr/about). Remova a localidade e construa o link para cada idioma. O seletor renderiza links reais, permitindo que os rastreadores acessem cada versão de idioma, e o cookie salva a escolha explícita.src/components/LocaleSwitcher.tsxCopiar códigoCopiar o código para a área de transferência
Criar um componente de Link localizado
Opcionalsrc/components/LocalizedLink.tsxCopiar códigoCopiar o código para a área de transferência
Ele também funciona a partir de Server Components, pois é renderizado dentro de
LinguiClientProvider:tsxCopiar códigoCopiar o código para a área de transferência
Internacionalizar seus metadados
OpcionalCada versão de idioma pode se posicionar individualmente, desde que cada página forneça:
- um
titleedescriptiontraduzidos; - uma URL canônica apontando para si mesma;
- uma tag alternativa
hreflangpor localidade, além dex-default; locale,alternateLocaleeurldo Open Graph;- JSON-LD com
inLanguage.
generateMetadataé executado fora da árvore do React, utilizando a instância do servidor diretamente com a macromsg:src/i18n/metadata.tsCopiar códigoCopiar o código para a área de transferência
src/app/[locale]/about/page.tsxCopiar códigoCopiar o código para a área de transferência
O JSON-LD é renderizado pela própria página. Como arquivos de página só devem exportar campos do Next.js, mantenha o componente em seu próprio arquivo:
src/components/WebPageJsonLd.tsxCopiar códigoCopiar o código para a área de transferência
src/app/[locale]/about/page.tsxCopiar códigoCopiar o código para a área de transferência
- um
Internacionalizar seu sitemap
OpcionalA convenção
sitemap.tssuportaalternates.languages, que o Next.js renderiza como alternativasxhtml:link. Liste todas as URLs de todas as localidades:src/app/sitemap.tsCopiar códigoCopiar o código para a área de transferência
Internacionalizar seu robots.txt
OpcionalRotas privadas existem em todos os idiomas, portanto o
disallowdeve abranger todas as rotas localizadas:src/app/robots.tsCopiar códigoCopiar o código para a área de transferência
Lidar com páginas 404 localizadas
Opcionalnot-found.tsxé renderizado dentro do layout de[locale], tendo acesso ao provedor do cliente. A rota do tipo catch-all encaminha caminhos desconhecidos dentro de uma localidade para ele. O Next.js adicionanoindexautomaticamente às respostas 404.src/app/[locale]/not-found.tsxCopiar códigoCopiar o código para a área de transferência
src/app/[locale]/[...rest]/page.tsxCopiar códigoCopiar o código para a área de transferência
Acessar a localidade em Server Actions
OpcionalServer Actions não recebem os parâmetros de rota diretamente. A abordagem mais confiável é enviar a localidade com o formulário, a partir da página que a conhece:
src/app/[locale]/contact/page.tsxCopiar códigoCopiar o código para a área de transferência
src/app/actions/sendContactMessage.tsCopiar códigoCopiar o código para a área de transferência
Mantenha suas macros e reduza o runtime com o Intlayer
OpcionalO adaptador de compatibilidade
@intlayer/linguimantém seu código-fonte intacto: as macros compilam como antes e as chamadas resultantes dei18n._(),useLingui()e<Trans>são atendidas por dicionários Intlayer. No benchmark do Next.js, o runtime cai de ~72.1 KB para ~10.7 KB gzip.No Next.js, o adaptador é configurado criando aliases de
@lingui/coree@lingui/reactpara@intlayer/linguiemnext.config.ts(webpack e Turbopack), e envolvendo a configuração comwithIntlayerdenext-intlayer/server. Mantenha o@lingui/swc-pluginpara que as macros continuem sendo compiladas primeiro. A configuração completa está no guia de compatibilidade do Lingui.Como a tabela de benchmark demonstra, o adaptador reduz o tamanho do runtime, mas ainda não divide o catálogo enviado para cada página no Next.js. Ele é idealmente utilizado como uma ponte de migração: uma vez em execução, migre os componentes gradualmente para a API nativa
useIntlayer, que envia apenas o conteúdo que cada componente renderiza. Veja o guia de Next.js + Intlayer, Lingui vs @intlayer/lingui e todos os adaptadores de compatibilidade.Automatize suas traduções usando Intlayer
OpcionalO Lingui extrai mensagens, mas preencher dezenas de catálogos manualmente é onde a maior parte do tempo é gasta. O Intlayer é gratuito e de código aberto, e seu ferramental funciona perfeitamente ao lado do Lingui:
- Traduza com IA usando sua própria chave de API e provedor. Veja preenchimento automático (auto fill) e a CLI.
- Mantenha seus arquivos PO como fonte de verdade com o plugin sync PO.
- Teste traduções ausentes no CI. Veja testando suas traduções.
- Audite seu site publicado para identificar
hreflangausentes, canonicals incorretos e vazamentos de localidade com o comando scan.
Perguntas Frequentes
Sim. O @lingui/react suporta React Server Components. Os Server Components registram a instância com setI18n de @lingui/react/server, os Client Components a leem a partir de I18nProvider, e ambos utilizam as mesmas macros Trans e useLingui.
Server Components não possuem contexto, portanto a instância é registrada por renderização. Os layouts são preservados durante as navegações e não são renderizados novamente, logo uma página não pode depender do seu layout para definir a localidade. Chamar initLingui(locale) no topo de cada layout e página os mantém independentes.
Use @lingui/swc-plugin. Ele preserva o pipeline SWC e o Turbopack. Adicionar uma configuração do Babel desativa o SWC no Next.js e torna os builds mais lentos. A única restrição é manter a versão do plugin compatível com a versão do SWC do seu lançamento do Next.js.
Obtenha a instância do servidor com getI18nInstance(locale) e traduza os descritores declarados com a macro msg: i18n._(msg`About us`). Retorne alternates.canonical, alternates.languages com x-default e openGraph.locale. A etapa 13 disponibiliza um helper reutilizável.
O benchmark mede ~72 KB gzip para o runtime. Com um catálogo por localidade, as páginas pesam ~145 KB em comparação com 141 KB sem i18n, mas cada página ainda recebe as mensagens de outras páginas por meio do provedor de cliente.
O Lingui atende a equipes que preferem escrever o texto de origem nos componentes e trabalhar com arquivos PO e tradutores. O next-intl é indicado para equipes que preferem catálogos JSON e uma API t("key") fortemente integrada ao Next.js. O next-i18next oferece o ecossistema de plugins do i18next. Veja next-i18next vs next-intl vs Intlayer e o benchmark do Next.js.
Comentários
Ainda sem comentários. Seja o primeiro a compartilhar seus pensamentos.
