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
O conteúdo desta página foi traduzido com uma IA.
Veja a última versão do conteúdo original em inglêsIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Traduza seu Next.js 14 and App Router com Intlayer | Internacionalização (i18n)
Veja Application Template no GitHub.
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 habilidades do agente, 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
Instale as Dependências
Instale os pacotes necessários usando npm:
bashCopiar códigoCopiar o código para a área de transferência
npm install intlayer next-intlayernpx intlayer initintlayer
O pacote principal que fornece ferramentas de internacionalização para gerenciamento de configuração, tradução, declaração de conteúdo, transpilações 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 Next.js para integrar o Intlayer com Webpack ou Turbopack, bem como middleware para detectar a localidade preferida do usuário, gerenciar cookies e lidar com redirecionamento de URLs.
Configure Seu Projeto
Here is the final structure that we will make:
bashCopiar códigoCopiar o código para a área de transferência
.├── src│ ├── app│ │ ├── [locale]│ │ │ ├── layout.tsx # Locale layout for the Intlayer provider│ │ │ ├── page.content.ts│ │ │ └── page.tsx│ │ └── layout.tsx # Root layout for style and global providers│ ├── components│ │ ├── client-component-example.content.ts│ │ ├── ClientComponentExample.tsx│ │ ├── LocaleSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── middleware.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonIf you don't want locale routing, intlayer can be used as a simple provider / hook. See this guide for more details.
Crie um arquivo de configuração para configurar os idiomas da 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, // Seus outros idiomas ], defaultLocale: Locales.ENGLISH, }, }; export default config;Por meio deste arquivo de configuração, você pode configurar URLs localizados, redirecionamento de middleware, nomes de cookies, a localização e extensão de suas declarações de conteúdo, desativar logs do Intlayer no console e muito mais. Para uma lista completa de parâmetros disponíveis, consulte a documentação de configuração.
Integre o Intlayer na Configuração do Next.js
Configure seu Next.js para usar o Intlayer:
next.config.mjsCopiar códigoCopiar o código para a área de transferência
import { withIntlayer } from "next-intlayer/server";/** @type {import('next').NextConfig} */const nextConfig = {};export default withIntlayer(nextConfig);O plugin
withIntlayer()do Next.js é usado para integrar o Intlayer com o Next.js. Ele garante a construção de arquivos de declaração de conteúdo e os monitora no modo de desenvolvimento. Define variáveis de ambiente do Intlayer nos ambientes Webpack ou Turbopack. Além disso, fornece aliases para otimizar o desempenho e garantir compatibilidade com componentes do servidor.Configure o Middleware para Detecção de Localidade
Configure o middleware para detectar a localidade preferida do usuário:
src/middleware.tsCopiar códigoCopiar o código para a área de transferência
export { intlayerMiddleware as middleware } from "next-intlayer/middleware"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };O
intlayerMiddlewareé usado para detectar a localidade preferida do usuário e redirecioná-lo para a URL apropriada, conforme especificado na configuração. Além disso, permite salvar a localidade preferida do usuário em um cookie.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.Defina Rotas Dinâmicas de Localidade
Remova tudo do
RootLayoute substitua pelo seguinte código:src/app/layout.tsxCopiar códigoCopiar o código para a área de transferência
import type { PropsWithChildren, FC } from "react"; import "./globals.css"; const RootLayout: FC<PropsWithChildren> = ({ children }) => children; export default RootLayout;Manter o componente
RootLayoutvazio permite definir os atributoslangedirna tag<html>.Para implementar o roteamento dinâmico, forneça o caminho para a localidade adicionando um novo layout no seu diretório
[locale]:src/app/[locale]/layout.tsxCopiar códigoCopiar o código para a área de transferência
import { type Next14LayoutIntlayer, IntlayerClientProvider, } from "next-intlayer"; import { Inter } from "next/font/google"; import { getHTMLTextDir } from "intlayer"; const inter = Inter({ subsets: ["latin"] }); const LocaleLayout: Next14LayoutIntlayer = ({ children, params: { locale }, }) => ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body className={inter.className}> <IntlayerClientProvider locale={locale}> {children} </IntlayerClientProvider> </body> </html> ); export default LocaleLayout;O segmento de caminho
[locale]é usado para definir a localidade. Exemplo:/en-US/aboutse referirá aen-USe/fr/aboutafr.Nesta etapa, você encontrará o erro:
Erro: Faltam as tags <html> e <body> no layout raiz.. Isso é esperado porque o arquivo/app/page.tsxnão está mais em uso e pode ser removido. Em vez disso, o segmento de caminho[locale]ativará a página/app/[locale]/page.tsx. Consequentemente, as páginas estarão acessíveis por meio de caminhos como/en,/fr,/esno seu navegador. Para definir a localidade padrão como a página raiz, consulte a configuração domiddlewareno passo 4.Depois, implemente a função
generateStaticParamsno Layout da sua aplicação.src/app/[locale]/layout.tsxCopiar códigoCopiar o código para a área de transferência
export { generateStaticParams } from "next-intlayer"; // Linha a ser inserida const LocaleLayout: Next14LayoutIntlayer = ({ children, params: { locale }, }) => { /*... Resto do código*/ }; export default LocaleLayout;generateStaticParamsgarante que sua aplicação pré-construa as páginas necessárias para todas as localidades, reduzindo a computação em tempo de execução e melhorando a experiência do usuário. Para mais detalhes, consulte a documentação do Next.js sobre generateStaticParams.Declare Seu Conteúdo
Crie e gerencie suas declarações de conteúdo para armazenar traduções:
src/app/[locale]/page.content.tsCopiar códigoCopiar o código para a área de transferência
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", pt: "Comece editando", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;Suas declarações de conteúdo podem ser definidas em qualquer lugar da sua aplicação, desde que estejam incluídas no diretório
contentDir(por padrão,./src). E correspondam à extensão do arquivo de declaração de conteúdo (por padrão,.content.{json,ts,tsx,js,jsx,mjs,cjs}).Para mais detalhes, consulte a documentação 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:
src/app/[locale]/page.tsxCopiar códigoCopiar o código para a área de transferência
import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type Next14PageIntlayer } from "next-intlayer"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; const Page: Next14PageIntlayer = ({ params: { locale } }) => { const content = useIntlayer("page", locale); return ( <> <p> {content.getStarted.main} <code>{content.getStarted.pageLink}</code> </p> <IntlayerServerProvider locale={locale}> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> </> ); }; export default Page;IntlayerClientProvideré usado para fornecer a localidade para componentes do lado do cliente. Ele pode ser colocado em qualquer componente pai, incluindo o layout. No entanto, colocá-lo em um layout é recomendado porque o Next.js compartilha o código do layout entre as páginas, tornando-o mais eficiente. UsandoIntlayerClientProviderno layout, você evita reinicializá-lo para cada página, melhorando o desempenho e mantendo um contexto de localização consistente em toda a sua aplicação.IntlayerServerProvideré usado para fornecer a localidade para os filhos do servidor. Ele não pode ser configurado no layout.Layout e página não podem compartilhar um contexto de servidor comum porque o sistema de contexto do servidor é baseado em um armazenamento de dados por solicitação (via mecanismo de cache do React), fazendo com que cada “contexto” seja recriado para diferentes segmentos da aplicação. Colocar o provedor em um layout compartilhado quebraria esse isolamento, impedindo a propagação correta dos valores do contexto do servidor para seus componentes do servidor.
src/components/ClientComponentExample.tsxCopiar códigoCopiar o código para a área de transferência
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // Crie a declaração de conteúdo relacionada return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/ServerComponentExample.tsxCopiar códigoCopiar o código para a área de transferência
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Crie a declaração de conteúdo relacionada return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Se você quiser usar seu conteúdo em um atributo
string, comoalt,title,href,aria-label, etc., você deve chamar o valor da função, como:htmlCopiar códigoCopiar o código para a área de transferência
<img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />Para saber mais sobre o hook
useIntlayer, consulte a documentação.Internacionalização dos seus metadados
OpcionalNo caso de você querer internacionalizar seus metadados, como o título da sua página, você pode usar a função
generateMetadatafornecida pelo Next.js. Dentro da função, use a funçãogetTranslationpara traduzir seus metadados.src/app/[locale]/layout.tsx or src/app/[locale]/page.tsxCopiar códigoCopiar o código para a área de transferência
import { type IConfigLocales, getTranslation, getMultilingualUrls,} from "intlayer";import type { Metadata } from "next";import type { LocalParams } from "next-intlayer";export const generateMetadata = ({ params: { locale },}: LocalParams): Metadata => { const t = <T>(content: IConfigLocales<T>) => getTranslation(content, 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("/"); const localizedUrl = multilingualUrls[locale as keyof typeof multilingualUrls]; return { title: t<string>({ en: "My title", fr: "Mon titre", es: "Mi título", pt: "Meu título", }), description: t({ en: "My description", fr: "Ma description", es: "Mi descripción", pt: "Minha descrição", }), alternates: { canonical: localizedUrl, languages: { ...multilingualUrls, "x-default": "/" }, }, openGraph: { url: localizedUrl, }, };};// ... Resto do códigoSaiba mais sobre a otimização de metadados na documentação oficial do Next.js.
Internacionalização do seu sitemap.xml e robots.txt
OpcionalPara internacionalizar seu
sitemap.xmlerobots.txt, você pode usar a funçãogetMultilingualUrlsfornecida pelo Intlayer. Esta função permite gerar URLs multilíngues para seu sitemap.src/app/sitemap.tsCopiar códigoCopiar o código para a área de transferência
import { getMultilingualUrls } from "intlayer"; import type { MetadataRoute } from "next"; const sitemap = (): MetadataRoute.Sitemap => [ { url: "https://example.com", alternates: { languages: getMultilingualUrls("https://example.com"), }, }, { url: "https://example.com/login", alternates: { languages: getMultilingualUrls("https://example.com/login"), }, }, { url: "https://example.com/register", alternates: { languages: getMultilingualUrls("https://example.com/register"), }, }, ]; export default sitemap;src/app/robots.tsCopiar códigoCopiar o código para a área de transferência
import type { MetadataRoute } from "next"; import { getMultilingualUrls } from "intlayer"; const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]); const robots = (): MetadataRoute.Robots => ({ rules: { userAgent: "*", allow: ["/"], disallow: getAllMultilingualUrls(["/login", "/register"]), }, host: "https://example.com", sitemap: `https://example.com/sitemap.xml`, }); export default robots;Saiba mais sobre a otimização do sitemap na documentação oficial do Next.js. Saiba mais sobre a otimização do robots.txt 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 maneira 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/LocaleSwitcher.tsxCopiar códigoCopiar o código para a área de transferência
"use client"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "next-intlayer"; import { type FC } from "react"; import Link from "next/link"; const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales, setLocale } = useLocale(); 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> {/* Localidade - ex.: FR */} {localeItem} </span> <span> {/* Idioma na sua própria Localidade - ex.: Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Idioma na Localidade atual - ex.: Francés com localidade atual definida como 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> ); };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 automaticamente prefixa URLs internas com o idioma atual, de forma que, 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.Este comportamento é útil por várias razões:
- SEO e Experiência do Usuário: URLs localizadas ajudam os mecanismos de busca a indexar corretamente as páginas específicas de idioma e fornecem aos usuários conteúdo em seu idioma preferido.
- Consistência: Usando um link localizado em toda a sua aplicação, você garante que a navegação permaneça dentro da localidade atual, evitando mudanças inesperadas de idioma.
- Manutenibilidade: Centralizar a lógica de localização em um único componente simplifica o gerenciamento de URLs, tornando sua base de código mais fácil de manter e expandir à medida que 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 é externa. * Se a URL começar com http:// ou https://, ela é 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, ele 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
Detectando Links Externos:
A função auxiliarcheckIsExternalLinkdetermina se uma URL é externa. Links externos são deixados inalterados porque não precisam de localização.Recuperando a Localidade Atual:
O hookuseLocalefornece a localidade atual (ex.: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/aboutcomohreftransformará 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 se beneficiar de SEO e usabilidade aprimorados.Otimize o tamanho do seu bundle
OpcionalAo usar o
next-intlayer, os dicionários são incluídos no bundle de 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 habilitar essa otimização, instale o pacote
@intlayer/swc. Uma vez instalado, onext-intlayerdetectará automaticamente e usará o plugin:bashCopiar códigoCopiar o código para a área de transferência
npm install @intlayer/swc --save-devNota: Esta otimização só está disponível em Next.js 13 e superior.
Nota: Este pacote não é instalado por padrão porque o plugin SWC ainda está em fase experimental no Next.js. Isso pode mudar no futuro.
Configure o TypeScript
O Intlayer usa a ampliação de módulos para obter 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 autogerados.
Copiar o código para a área de transferência
{ // ... Suas configurações existentes do TypeScript "include": [ // ... Suas configurações existentes do TypeScript ".intlayer/**/*.ts", // Inclua os tipos autogerados ],}Configuração do Git
É recomendável ignorar os arquivos gerados pelo Intlayer. Isso permite evitar que eles sejam enviados para seu repositório Git.
Para fazer isso, você pode adicionar as seguintes instruções ao seu arquivo .gitignore:
Copiar o código para a área de transferência
# Ignore os arquivos gerados pelo Intlayer.intlayerVá Além
Para ir além, você pode implementar o editor visual ou externalizar seu conteúdo usando o CMS.