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
- "Atualizar o uso da API useIntlayer do Solid para acesso direto a propriedades"v8.9.004/05/2026
- "Adicionar comando init"v7.5.930/12/2025
- "Histórico inicial"v5.5.1029/06/2025
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
Traduza seu Next.js and Page Router com Intlayer | Internacionalização (i18n)
Índice
Por que Intlayer em vez de alternativas?
Comparado com soluções principais como next-intl ou i18next, Intlayer é uma solução que vem com otimizações integradas como:
O Intlayer é otimizado para funcionar com Componentes de servidor para renderização eficiente e é totalmente compatível com Turbopack. Ele não bloqueia a renderização estática e oferece middleware, bem como todos os recursos necessários para dimensionar a internacionalização (i18n).
Intlayer é compatível com Next.js 12, 13, 14, 15 e 16. Se você estiver usando o roteador de páginas Next.js, pode consultar este [guia] (/pt/doc/environment/nextjs/next-with-page-router). O roteamento por locale é útil para SEO, tamanho do bundle e desempenho. Se não precisar dele, você pode consultar este guia. Para Next.js 12, 13, 14 e 15 com o App Router, consulte este guia.
Em vez de carregar arquivos JSON enormes em suas páginas, carregue apenas o conteúdo necessário. O Intlayer ajuda a reduzir o tamanho do bundle e das páginas em até 50%.
Definir o escopo do conteúdo do seu aplicativo facilita a manutenção de aplicativos de grande escala. Você pode duplicar ou excluir uma única pasta de recursos sem o fardo mental de revisar toda a base de código de seu conteúdo. Além disso, o Intlayer é totalmente tipado (fully typed) para garantir a precisão do seu conteúdo.
A co-localização de conteúdo reduz o contexto necessário pelos Large Language Models (LLMs). O Intlayer também vem com um conjunto de ferramentas, como uma CLI para testar traduções ausentes,LSP, MCP, e agent skills, para tornar a experiência do desenvolvedor (DX) ainda mais tranquila para os agentes de IA.
Use a automação para traduzir seu pipeline de CI/CD usando o LLM de sua escolha às custas de seu provedor de IA. O Intlayer também oferece um compilador para automatizar a extração de conteúdo, bem como uma plataforma web para ajudar a traduzir em segundo plano.
Conectar arquivos JSON enormes a componentes pode levar a problemas de desempenho e reatividade. O Intlayer otimiza o carregamento do seu conteúdo no momento da construção.
Mais do que apenas uma solução i18n, o Intlayer fornece um [editor visual] auto-hospedado(/pt/doc/concept/editor)* e um *CMS completo para ajudá-lo a gerenciar seu conteúdo multilíngue em tempo real, facilitando a colaboração com tradutores, redatores e outros membros da equipe. O conteúdo pode ser armazenado local e/ou remotamente.
Guia Passo a Passo para Configurar o Intlayer em uma Aplicação Next.js Usando Page Router
Instalar Dependências
Instale os pacotes necessários usando seu gerenciador de pacotes preferido:
bashCopiar códigoCopiar o código para a área de transferência
a flag
--interactiveé opcional. Useintlayer-cli initse você for um agente de IA.Este comando detectará seu ambiente e instalará os pacotes necessários. Por exemplo:
bashCopiar códigoCopiar o código para a área de transferência
intlayer
O pacote principal que fornece ferramentas de internacionalização para gerenciamento de configuração, tradução, declaração de conteúdo, transpiração e comandos CLI.
next-intlayer
O pacote que integra o Intlayer com o Next.js. Ele fornece provedores de contexto e hooks para internacionalização no Next.js. Além disso, inclui o plugin do Next.js para integrar o Intlayer com Webpack ou Turbopack, assim como middleware para detectar o idioma preferido do usuário, gerenciar cookies e lidar com redirecionamento de URL.
Configure Seu Projeto
Crie um arquivo de configuração para definir os idiomas suportados pela sua aplicação:
intlayer.config.tsCopiar códigoCopiar o código para a área de transferência
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Adicione seus outros idiomas aqui ], defaultLocale: Locales.ENGLISH, }, }; export default config;Através deste arquivo de configuração, você pode configurar URLs localizadas, redirecionamento de middleware, nomes de cookies, a localização e extensão das suas declarações de conteúdo, desabilitar logs do Intlayer no console e muito mais. Para uma lista completa dos parâmetros disponíveis, consulte a documentação de configuração.
Integrar o Intlayer com a Configuração do Next.js
Modifique sua configuração do Next.js para incorporar o Intlayer:
next.config.mjsCopiar códigoCopiar o código para a área de transferência
O plugin
withIntlayer()do Next.js é usado para integrar o Intlayer com o Next.js. Ele garante a construção dos arquivos de declaração de conteúdo e os monitora no modo de desenvolvimento. Define as variáveis de ambiente do Intlayer dentro dos ambientes Webpack ou Turbopack. Além disso, fornece aliases para otimizar o desempenho e assegura a compatibilidade com componentes do servidor.A função
withIntlayer()é uma função promise. Se você quiser usá-la com outros plugins, pode usarawait. Exemplo:tsxCopiar códigoCopiar o código para a área de transferência
Configurar Middleware para Detecção de Localidade
Configure o middleware para detectar e tratar automaticamente a localidade preferida do usuário:
A partir do Intlayer v9, este middleware respeita a opção
routing.enableProxy(truepor padrão). Definarouting.enableProxy: falsena sua configuração para transformá-lo em um pass-through sem remover este arquivo. Veja as notas de lançamento do v9.src/middleware.tsCopiar códigoCopiar o código para a área de transferência
export { intlayerProxy as middleware } from "next-intlayer/middleware"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };Adapte o parâmetro
matcherpara corresponder às rotas da sua aplicação. Para mais detalhes, consulte a documentação do Next.js sobre configuração do matcher.Definir Rotas Dinâmicas por Localidade
Implemente o roteamento dinâmico para servir conteúdo localizado com base na localidade do usuário.
Crie Páginas Específicas por Localidade:
Renomeie o arquivo da sua página principal para incluir o segmento dinâmico
[locale].bashCopiar códigoCopiar o código para a área de transferência
Atualize o
_app.tsxpara Gerenciar a Localização:Modifique seu
_app.tsxpara incluir os provedores do Intlayer.Configurar
getStaticPathsegetStaticProps:No seu
[locale]/index.tsx, defina os caminhos e propriedades para lidar com diferentes locais.src/pages/[locale]/index.tsxCopiar códigoCopiar o código para a área de transferência
getStaticPathsegetStaticPropsgarantem que sua aplicação pré-construa as páginas necessárias para todos os locais no Next.js Page Router. Essa abordagem reduz o cálculo em tempo de execução e leva a uma experiência de usuário aprimorada. Para mais detalhes, consulte a documentação do Next.js sobregetStaticPathsegetStaticProps.Declare Seu Conteúdo
Crie e gerencie suas declarações de conteúdo para armazenar traduções.
src/pages/[locale]/home.content.tsCopiar códigoCopiar o código para a área de transferência
import { t, type Dictionary } from "intlayer"; const homeContent = { key: "home", content: { title: t({ pt: "Bem-vindo ao Meu Site", en: "Welcome to My Website", fr: "Bienvenue sur mon site Web", es: "Bienvenido a mi sitio web", }), description: t({ pt: "Comece editando esta página.", en: "Get started by editing this page.", fr: "Commencez par éditer cette page.", es: "Comience por editar esta página.", }), }, } satisfies Dictionary; export default homeContent;Para mais informações sobre como declarar conteúdo, consulte o guia de declaração de conteúdo.
Utilize o Conteúdo no Seu Código
Acesse seus dicionários de conteúdo em toda a sua aplicação para exibir conteúdo traduzido.
src/pages/[locale]/index.tsxCopiar códigoCopiar o código para a área de transferência
import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; import { ComponentExample } from "@components/ComponentExample"; const HomePage: FC = () => { const content = useIntlayer("home"); return ( <div> <h1>{content.title}</h1> <p>{content.description}</p> <ComponentExample /> {/* Componentes adicionais */} </div> ); }; // ... Resto do código, incluindo getStaticPaths e getStaticProps export default HomePage;src/components/ComponentExample.tsxCopiar códigoCopiar o código para a área de transferência
import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ComponentExample: FC = () => { const content = useIntlayer("component-example"); // Certifique-se de que você tem uma declaração de conteúdo correspondente return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Ao usar traduções em atributos do tipo
string(por exemplo,alt,title,href,aria-label), chame ovalor da função da seguinte forma:
htmlCopiar códigoCopiar o código para a área de transferência
Para saber mais sobre o hook
useIntlayer, consulte a documentação.Internacionalização dos seus metadados
OpcionalCaso você queira internacionalizar seus metadados, como o título da sua página, você pode usar a função
getStaticPropsfornecida pelo Next.js Page Router. Dentro dela, você pode recuperar o conteúdo da funçãogetIntlayerpara traduzir seus metadados.src/pages/[locale]/metadata.content.tsCopiar códigoCopiar o código para a área de transferência
import { type Dictionary, t } from "intlayer"; import { type Metadata } from "next"; const metadataContent = { key: "page-metadata", content: { title: t({ en: "Create Next App", fr: "Créer une application Next.js", es: "Crear una aplicación Next.js", }), description: t({ en: "Generated by create next app", fr: "Généré par create next app", es: "Generado por create next app", }), }, } satisfies Dictionary<Metadata>; export default metadataContent;src/pages/[locale]/index.tsxCopiar códigoCopiar o código para a área de transferência
import { GetStaticPaths, GetStaticProps } from "next"; import { getIntlayer, getMultilingualUrls } from "intlayer"; import { useIntlayer } from "next-intlayer"; import Head from "next/head"; import type { FC } from "react"; interface HomePageProps { locale: string; metadata: { title: string; description: string; }; multilingualUrls: Record<string, string>; } const HomePage: FC<HomePageProps> = ({ metadata, multilingualUrls, locale, }) => { const content = useIntlayer("page"); return ( <div> <Head> <title>{metadata.title}</title> <meta name="description" content={metadata.description} /> {/* Gerar tags hreflang para SEO */} {Object.entries(multilingualUrls).map(([lang, url]) => ( <link key={lang} rel="alternate" hrefLang={lang} href={url} /> ))} <link rel="canonical" href={multilingualUrls[locale]} /> </Head> {/* Conteúdo da página */} <main>{/* Seu conteúdo da página aqui */}</main> </div> ); }; export const getStaticProps: GetStaticProps<HomePageProps> = async ({ params, }) => { const locale = params?.locale as string; const metadata = getIntlayer("page-metadata", locale); /** * Gera um objeto contendo todas as URLs para cada localidade. * * Exemplo: * ```ts * getMultilingualUrls('/about'); * * // Retorna * // { * // en: '/about', * // fr: '/fr/about', * // es: '/es/about', * // } * ``` */ const multilingualUrls = getMultilingualUrls("/"); return { props: { locale, metadata, multilingualUrls, }, }; }; export default HomePage; // ... Resto do código incluindo getStaticPathsNote que a função
getIntlayerimportada denext-intlayerretorna seu conteúdo encapsulado em umIntlayerNode, permitindo a integração com o editor visual. Em contraste, a funçãogetIntlayerimportada deintlayerretorna seu conteúdo diretamente, sem propriedades adicionais.Saiba mais sobre a otimização de metadados na documentação oficial do Next.js.
Alterar o idioma do seu conteúdo
OpcionalPara alterar o idioma do seu conteúdo no Next.js, a forma recomendada é usar o componente
Linkpara redirecionar os usuários para a página localizada apropriada. O componenteLinkpermite o pré-carregamento da página, o que ajuda a evitar um recarregamento completo da página.src/components/LanguageSwitcher.tsxCopiar códigoCopiar o código para a área de transferência
import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocalePageRouter } from "next-intlayer"; import { type FC } from "react"; import Link from "next/link"; const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <Link href={getLocalizedUrl(pathWithoutLocale, localeItem)} hrefLang={localeItem} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* Local - ex. FR */} {localeItem} </span> <span> {/* Idioma em seu próprio local - ex. Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Idioma na Localização atual - ex. Francés com a localização atual definida para Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Idioma em Inglês - ex. French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </Link> ))} </div> </div> ); };Uma forma alternativa é usar a função
setLocalefornecida pelo hookuseLocale. Esta função não permitirá o pré-carregamento da página e recarregará a página.Neste caso, sem redirecionamento usando
router.push, apenas o código do lado do servidor mudará o idioma do conteúdo.src/components/LocaleSwitcher.tsxCopiar códigoCopiar o código para a área de transferência
A API
useLocalePageRouteré a mesma queuseLocale. Para saber mais sobre o hookuseLocale, consulte a documentação.Referências da documentação:
Criando um Componente de Link Localizado
OpcionalPara garantir que a navegação da sua aplicação respeite a localidade atual, você pode criar um componente
Linkpersonalizado. Este componente adiciona automaticamente o prefixo do idioma atual às URLs internas. Por exemplo, quando um usuário que fala francês clica em um link para a página "Sobre", ele é redirecionado para/fr/aboutem vez de/about.Esse comportamento é útil por várias razões:
- SEO e Experiência do Usuário: URLs localizadas ajudam os motores de busca a indexar corretamente páginas específicas por idioma e fornecem aos usuários conteúdo em seu idioma preferido.
- Consistência: Ao usar um link localizado em toda a sua aplicação, você garante que a navegação permaneça dentro do idioma atual, evitando mudanças inesperadas de idioma.
- Manutenção: Centralizar a lógica de localização em um único componente simplifica o gerenciamento das URLs, tornando seu código mais fácil de manter e expandir conforme sua aplicação cresce.
Abaixo está a implementação de um componente
Linklocalizado em TypeScript:src/components/Link.tsxCopiar códigoCopiar o código para a área de transferência
"use client"; import { getLocalizedUrl } from "intlayer"; import NextLink, { type LinkProps as NextLinkProps } from "next/link"; import { useLocale } from "next-intlayer"; import { forwardRef, PropsWithChildren, type ForwardedRef } from "react"; /** * Função utilitária para verificar se uma URL fornecida é externa. * Se a URL começar com http:// ou https://, é considerada externa. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * Um componente Link personalizado que adapta o atributo href com base na localidade atual. * Para links internos, usa `getLocalizedUrl` para prefixar a URL com a localidade (ex: /fr/about). * Isso garante que a navegação permaneça dentro do mesmo contexto de localidade. */ export const Link = forwardRef< HTMLAnchorElement, PropsWithChildren<NextLinkProps> >(({ href, children, ...props }, ref: ForwardedRef<HTMLAnchorElement>) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // Se o link for interno e um href válido for fornecido, obtenha a URL localizada. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} ref={ref} {...props}> {children} </NextLink> ); }); Link.displayName = "Link";Como Funciona
Detecção de Links Externos:
A função auxiliarcheckIsExternalLinkdetermina se uma URL é externa. Links externos são mantidos inalterados porque não precisam de localização.Recuperando a Localização Atual:
O hookuseLocalefornece a localidade atual (por exemplo,frpara francês).Localizando a URL:
Para links internos (ou seja, não externos),getLocalizedUrlé usado para prefixar automaticamente a URL com a localidade atual. Isso significa que, se seu usuário estiver em francês, passar/aboutcomohrefserá transformado em/fr/about.Retornando o Link:
O componente retorna um elemento<a>com a URL localizada, garantindo que a navegação seja consistente com a localidade.
Ao integrar este componente
Linkem toda a sua aplicação, você mantém uma experiência de usuário coerente e consciente do idioma, além de beneficiar-se de uma melhor SEO e usabilidade.Otimize o tamanho do seu bundle
OpcionalAo usar
next-intlayer, os dicionários são incluídos no bundle para cada página por padrão. Para otimizar o tamanho do bundle, o Intlayer fornece um plugin SWC opcional que substitui inteligentemente as chamadasuseIntlayerusando macros. Isso garante que os dicionários sejam incluídos apenas nos bundles das páginas que realmente os utilizam.Para ativar essa otimização, instale o pacote
@intlayer/swc. Uma vez instalado, onext-intlayerdetectará e usará automaticamente o plugin:bashCopiar códigoCopiar o código para a área de transferência
Nota: Esta otimização está disponível apenas para Next.js 13 e versões superiores.
Nota: Este pacote não é instalado por padrão porque os plugins SWC ainda são experimentais no Next.js. Isso pode mudar no futuro.
Configurar TypeScript
O Intlayer utiliza a ampliação de módulos para aproveitar os benefícios do TypeScript e tornar sua base de código mais robusta.


Certifique-se de que sua configuração do TypeScript inclua os tipos gerados automaticamente.
Copiar o código para a área de transferência
Configuração do Git
Para manter seu repositório limpo e evitar o commit de arquivos gerados, é recomendado ignorar os arquivos criados pelo Intlayer.
Adicione as seguintes linhas ao seu arquivo .gitignore:
Copiar o código para a área de transferência
Extensão VS Code
Para melhorar sua experiência de desenvolvimento com o Intlayer, você pode instalar a extensão oficial Intlayer VS Code Extension.
Instalar no VS Code Marketplace
Esta extensão oferece:
- Autocompletar para chaves de tradução.
- Detecção de erros em tempo real para traduções ausentes.
- Visualizações inline do conteúdo traduzido.
- Ações rápidas para criar e atualizar traduções facilmente.
Para mais detalhes sobre como usar a extensão, consulte a documentação da Extensão Intlayer para VS Code.
Recursos Adicionais
- Documentação do Intlayer: Repositório GitHub
- Guia do Dicionário: Dicionário
- Documentação de Configuração: Guia de Configuração
Seguindo este guia, você pode integrar efetivamente o Intlayer em sua aplicação Next.js usando o Page Router, possibilitando um suporte robusto e escalável para internacionalização em seus projetos web.
Ir Além
Para ir mais longe, você pode implementar o editor visual ou externalizar seu conteúdo usando o CMS.
Perguntas Frequentes
O Page Router ainda suporta o campo nativo i18n do next.config.js, mas ele gerencia apenas o roteamento e a detecção de locale, nunca as traduções propriamente ditas, exigindo a escolha de uma camada de conteúdo:
next-i18next/i18nextenext-intl: namespaces JSON carregados por página, a abordagem clássica com o Page Router.react-intleLingui: mensagens ICU com etapa de extração.Intlayer: a solução mais avançada. Conteúdo declarado em qualquer lugar do seu código (ao lado de cada componente ou centralizado) e compilado por componente, totalmente tipado, com tradução por IA, editor visual e CMS.
Consulte por que Intlayer e o benchmark de i18n do Next.js.
Muito menos do que uma configuração baseada em namespaces, porque uma página nunca baixa um catálogo que não renderiza. O conteúdo é resolvido durante o getStaticProps e getServerSideProps em vez de ser enviado como catálogos, e o compilador de build substitui as chamadas useIntlayer pelas entradas exatas do dicionário usadas pelo componente, descartando chaves e idiomas não utilizados, enquanto os dicionários dinâmicos dividem o restante por locale. Comparado às alternativas habituais, o Intlayer reduz o tamanho do bundle e da página em até 50%. Consulte otimização de bundle e o benchmark.
Sim, e existem dois caminhos. Você pode migrar o conteúdo progressivamente com o guia de migração do next-intl ou o guia de migração do i18next. Ou pode manter sua API atual inteiramente: os adaptadores de compatibilidade (compat adapters) expõem exatamente a mesma API que next-intl, react-i18next e react-intl, mas servidos por dicionários Intlayer, de modo que apenas as importações mudam e o código dos componentes permanece idêntico.
Sim. O plugin sync JSON mantém seus arquivos /messages/{locale}/{namespace}.json como fonte de verdade e gera dicionários Intlayer a partir deles, em ambas as direções. O plugin sync PO faz o mesmo para catálogos gettext, e os arquivos por locale permitem dividir o conteúdo por idioma em vez de agrupar todos os locales em um único arquivo.
Não. Execute npx intlayer extract e o Intlayer lê seus componentes, extrai as strings voltadas para o usuário e escreve um arquivo .content ao lado de cada um, para que você revise um diff em vez de copiar strings para um catálogo uma a uma.
Para um fluxo de trabalho totalmente automatizado, o Intlayer Compiler faz o mesmo em tempo de build: ele analisa seu código JSX, TSX, Vue e Svelte a cada alteração, gera os dicionários e os mantém sincronizados via hot module replacement, dispensando completamente a manutenção manual de chaves.
Dois limites são importantes considerar: o compilador opera por análise estática, de modo que strings criadas apenas em tempo de execução (como códigos de erro de API ou campos dinâmicos de CMS) ficam fora de alcance. Além disso, ele precisa distinguir texto visível de lógicas de aplicação como className="active" ou status codes, exigindo algumas anotações em bases de código extensas. O comando extract evita ambos mantendo você no controle.
Cinco ferramentas, todas opcionais:
- Extensão VS Code: navegue de uma chave
useIntlayerdiretamente para o arquivo de conteúdo que a declara, extraia conteúdo de um componente e execute build, fill, test, push e pull pela paleta de comandos ou pela aba dedicada do Intlayer. - Servidor LSP: a mesma inteligência em qualquer editor compatível com LSP, com ir para definição, localizar referências, pré-visualizações de valores traduzidos ao passar o mouse, autocompletar e alertas para chaves não declaradas. Também resolve chamadas de
i18next,react-i18next,next-intleuse-intl, facilitando a migração. - Servidor MCP: expõe a documentação e a CLI do Intlayer para Cursor, VS Code, Claude Desktop, Claude Code e ChatGPT, permitindo que os assistentes respondam com base na documentação atualizada e executem comandos como
intlayer fill. - Agent Skills: habilidades focadas como
intlayer-config,intlayer-clieintlayer-content, além de uma por framework, ensinando ao agente suas regras de roteamento e tipos de nós. - Plugin ESLint: a regra
no-raw-textidentifica strings hardcoded, com regras adicionais para chaves estáticas e conteúdo não utilizado.
