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
- "Adicionado comando init"v7.5.930/12/2025
- "Atualização da integração do Astro, configuração e uso"v6.2.003/10/2025
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 o seu site Astro + React com o Intlayer | Internacionalização (i18n)
Índice
Por que Intlayer em vez de alternativas?
Comparado com soluções principais como astro-i18n ou i18next, Intlayer é uma solução que vem com otimizações integradas como:
O Intlayer é otimizado para funcionar perfeitamente com o Astro, oferecendo roteamento multilíngue, mapa do site e todos os recursos necessários para dimensionar a internacionalização (i18n).
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 no Astro + React
Confira o modelo da aplicação no GitHub.
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
npm install intlayer astro-intlayer react react-dom react-intlayer @astrojs/reactnpx intlayer initintlayer O pacote principal que fornece ferramentas de i18n para gerenciamento de configuração, traduções, declaração de conteúdo, transpilação e comandos CLI.
astro-intlayer Inclui o plugin de integração do Astro para vincular o Intlayer ao bundler Vite, bem como o middleware para detectar o idioma preferido do usuário, gerenciar cookies e lidar com redirecionamentos de URL.
react, react-dom Pacotes principais do React necessários para renderizar componentes React no navegador.
react-intlayer Pacote para integrar o Intlayer em aplicações React. Ele fornece o
IntlayerProvider, além dos hooksuseIntlayereuseLocalepara internacionalização no React.@astrojs/react Integração oficial do Astro que permite o uso de islands de componentes React.
Configurar seu Projeto
Crie um arquivo de configuração para definir 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, Locales.PORTUGUESE, // Seus outros idiomas ], defaultLocale: Locales.ENGLISH, },};export default config;Através deste arquivo de configuração, você pode configurar URLs localizadas, redirecionamentos de middleware, nomes de cookies, localização e extensões de 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.
Integrar o Intlayer na sua configuração do Astro
Adicione o plugin
intlayere a integração do React à sua configuração do Astro.astro.config.tsCopiar códigoCopiar o código para a área de transferência
// @ts-checkimport { intlayer } from "astro-intlayer";import react from "@astrojs/react";import { defineConfig } from "astro/config";// https://astro.build/configexport default defineConfig({ integrations: [intlayer(), react()],});O plugin de integração
intlayer()é usado para integrar o Intlayer ao Astro. Ele garante a geração dos arquivos de declaração de conteúdo e os monitora em modo de desenvolvimento. Ele define variáveis de ambiente do Intlayer dentro da aplicação Astro e fornece aliases para otimizar o desempenho.A integração
react()permite o uso de islands de componentes React viaclient:only="react".Declarar seu conteúdo
Crie e gerencie suas declarações de conteúdo para armazenar traduções:
src/app.content.tsxCopiar códigoCopiar o código para a área de transferência
import { t, type Dictionary } from "intlayer";import type { ReactNode } from "react";const appContent = { key: "app", content: { title: t({ en: "Hello World", fr: "Bonjour le monde", es: "Hola mundo", pt: "Olá Mundo", }), },} satisfies Dictionary;export default appContent;As declarações de conteúdo podem ser definidas em qualquer lugar da sua aplicação, desde que estejam incluídas no
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 informações, consulte a documentação de declaração de conteúdo.
Usar o conteúdo no Astro
Você pode consumir os dicionários diretamente nos seus arquivos
.astrousando os ajudantes principais exportados dointlayer. Você também deve adicionar metadados de SEO (como hreflang e links canônicos) a cada página e introduzir uma island de React para conteúdo interativo no lado do cliente.src/pages/[...locale]/index.astroCopiar códigoCopiar o código para a área de transferência
---import { getIntlayer, getLocaleFromPath, getLocalizedUrl, getHTMLTextDir, getPrefix, localeMap, defaultLocale, type LocalesValues,} from "intlayer";import { ReactIsland } from "../../components/react/ReactIsland";export const getStaticPaths = () => { return localeMap(({ locale }) => ({ params: { locale: getPrefix(locale).localePrefix }, }));};const locale = getLocaleFromPath(Astro.url.pathname) as LocalesValues;const { title } = getIntlayer("app", locale);---<!doctype html><html lang={locale} dir={getHTMLTextDir(locale)}> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <title>{title}</title> <!-- Link Canônico: informa aos motores de busca sobre a versão principal desta página --> <link rel="canonical" href={new URL(getLocalizedUrl(Astro.url.pathname, locale), Astro.site)} /> <!-- Hreflang: informa ao Google sobre todas as versões localizadas --> { localeMap(({ locale: mapLocale }) => ( <link rel="alternate" hreflang={mapLocale} href={new URL( getLocalizedUrl(Astro.url.pathname, mapLocale), Astro.site )} /> )) } <!-- x-default: opção de fallback quando o idioma não corresponde ao do usuário --> <link rel="alternate" hreflang="x-default" href={new URL( getLocalizedUrl(Astro.url.pathname, defaultLocale), Astro.site )} /> </head> <body> <!-- A island de React renderiza todo o conteúdo interativo, incluindo o seletor de idioma --> <ReactIsland locale={locale} client:only="react" /> </body></html>Se você quiser usar seu conteúdo em un atributo de
string, comoalt,title,href,aria-label, etc., você pode usar 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)}" />Nota sobre a configuração de roteamento: A estrutura de diretórios que você usa depende da configuração
middleware.routingnointlayer.config.ts:prefix-no-default(padrão): mantém o idioma padrão na raiz (sem prefixo) e adiciona prefixos aos outros. Use[...locale]para capturar todos os casos.prefix-all: todos os URLs recebem um prefixo de idioma. Você pode usar o padrão[locale]se não precisar lidar com a raiz separadamente.search-paramouno-prefix: não são necessários diretórios de idioma. O idioma é tratado via parâmetros de consulta ou cookies.
Criar um componente Island de React
Crie um componente de island que envolva sua aplicação React e receba a localidade detectada pelo servidor:
src/components/react/ReactIsland.tsxCopiar códigoCopiar o código para a área de transferência
/** @jsxImportSource react */import { IntlayerProvider, useIntlayer } from "react-intlayer";import { type LocalesValues } from "intlayer";import { LocaleSwitcher } from "./LocaleSwitcher";function App() { const { title } = useIntlayer("app"); return ( <div> <h1>{title}</h1> <LocaleSwitcher /> </div> );}export function ReactIsland({ locale }: { locale: LocalesValues }) { return ( <IntlayerProvider locale={locale}> <App /> </IntlayerProvider> );}A prop
localeé passada da página Astro (detecção no servidor) para oIntlayerProvider, servindo como o idioma inicial para todos os hooks React na árvore.Adicionar um Seletor de Idioma
Crie um componente React
LocaleSwitcherque leia os idiomas disponíveis e navegue para a URL localizada quando um usuário selecionar um novo idioma:src/components/react/LocaleSwitcher.tsxCopiar códigoCopiar o código para a área de transferência
/** @jsxImportSource react */import { useLocale } from "react-intlayer";import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";export function LocaleSwitcher() { const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (newLocale: LocalesValues) => { // Navega para a URL localizada ao mudar de idioma window.location.href = getLocalizedUrl( window.location.pathname, newLocale ); }, }); return ( <div className="locale-switcher"> <span className="switcher-label">Mudar idioma:</span> <div className="locale-buttons"> {availableLocales.map((localeItem) => ( <button key={localeItem} onClick={() => setLocale(localeItem)} className={`locale-btn ${localeItem === locale ? "active" : ""}`} disabled={localeItem === locale} > <span className="ls-own-name">{getLocaleName(localeItem)}</span> <span className="ls-current-name"> {getLocaleName(localeItem, locale)} </span> <span class="ls-code">{localeItem.toUpperCase()}</span> </button> ))} </div> </div> );}Nota sobre persistência: O uso de
onLocaleChangepara redirecionar viawindow.location.hrefgarante que a nova URL linguística seja visitada, permitindo que o middleware do Intlayer defina o cookie de idioma e lembre da preferência do usuário em visitas futuras.O
LocaleSwitcherdeve ser renderizado dentro de umIntlayerProvider- use-o no seu componente de island (como mostrado no passo 6).Sitemap e Robots.txt
O Intlayer oferece utilitários para criar dinamicamente o seu sitemap localizado e os arquivos robots.txt.
Sitemap
O Intlayer vem com um gerador de sitemap integrado para ajudá-lo a criar facilmente um sitemap para sua aplicação. Ele cuida das rotas localizadas e adiciona os metadados necessários para os mecanismos de busca.
O sitemap gerado pelo Intlayer suporta o namespace
xhtml:link(Hreflang XML Extensions). Ao contrário dos geradores de sitemap padrão que apenas listam URLs brutos, o Intlayer cria automaticamente os links bidirecionais necessários entre todas as versões de idioma de uma página (por exemplo,/about,/about?lang=fre/about?lang=es). Isso garante que os mecanismos de busca indexem e sirvam corretamente a versão de idioma certa para o público certo.Crie
src/pages/sitemap.xml.tspara gerar um sitemap que inclua todas as suas rotas localizadas.src/pages/sitemap.xml.tsCopiar códigoCopiar o código para a área de transferência
import type { APIRoute } from "astro";import { generateSitemap, type SitemapUrlEntry } from "intlayer";const pathList: SitemapUrlEntry[] = [ { path: "/", changefreq: "daily", priority: 1.0 }, { path: "/about", changefreq: "monthly", priority: 0.7 },];const SITE_URL = import.meta.env.SITE ?? "http://localhost:4321";export const GET: APIRoute = async ({ site }) => { const xmlOutput = generateSitemap(pathList, { siteUrl: SITE_URL }); return new Response(xmlOutput, { headers: { "Content-Type": "application/xml" }, });};Robots.txt
Crie
src/pages/robots.txt.tspara controlar o rastreamento dos motores de busca.src/pages/robots.txt.tsCopiar códigoCopiar o código para a área de transferência
import type { APIRoute } from "astro";import { getMultilingualUrls } from "intlayer";const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);export const GET: APIRoute = ({ site }) => { const robotsTxt = [ "User-agent: *", "Allow: /", ...disallowedPaths.map((path) => `Disallow: ${path}`), "", `Sitemap: ${new URL("/sitemap.xml", site).href}`, ].join("\n"); return new Response(robotsTxt, { headers: { "Content-Type": "text/plain" }, });};Extrair o conteúdo dos seus componentes
OpcionalSe você tiver uma base de código existente, transformar milhares de arquivos pode ser demorado.
Para facilitar esse processo, o Intlayer propõe um compilador / extrator para transformar seus componentes e extrair o conteúdo.
Para configurá-lo, você pode adicionar uma seção
compilerno seu arquivointlayer.config.ts:intlayer.config.tsCopiar códigoCopiar o código para a área de transferência
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... Resto da sua configuração compiler: { /** * Indica se o compilador deve ser ativado. */ enabled: true, /** * Define o caminho dos arquivos de saída */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * Indica se os componentes devem ser salvos após serem transformados. Dessa forma, o compilador pode ser executado apenas uma vez para transformar o aplicativo e depois removido. */ saveComponents: false, /** * Prefixo da chave do dicionário */ dictionaryKeyPrefix: "", }, }; export default config;Execute o extrator para transformar seus componentes e extrair o conteúdo
bashCopiar códigoCopiar o código para a área de transferência
npx intlayer extract
Configuração do TypeScript
O Intlayer usa o aumento de módulos (module augmentation) para aproveitar o TypeScript, tornando 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
{ // ... sua configuração existente do TypeScript "include": [ // ... sua configuração existente do TypeScript ".intlayer/**/*.ts", // Incluir tipos gerados automaticamente ],}Configuração do Git
Recomenda-se ignorar os arquivos gerados pelo Intlayer. Isso evita committá-los no seu repositório Git.
Para fazer isso, adicione as seguintes instruções ao seu arquivo .gitignore:
Copiar o código para a área de transferência
# Ignorar os arquivos gerados pelo Intlayer.intlayerExtensão do VS Code
Para melhorar sua experiência de desenvolvimento com o Intlayer, você pode instalar a extensão oficial do Intlayer para VS Code.
Instalação pelo VS Code Marketplace
Esta extensão fornece:
- Preenchimento automático para chaves de tradução.
- Detecção de erros em tempo real para traduções ausentes.
- Visualização inline do conteúdo traduzido.
- Ações rápidas para criar e atualizar traduções facilmente.
Para mais informações sobre o uso da extensão, consulte a documentação da Extensão do VS Code.
Aprofunde seu conhecimento
Se quiser saber mais, você também pode implementar o Editor Visual ou usar o CMS para externalizar seu conteúdo.