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
- "Documentação inicial para Astro + Solid"v8.7.724/04/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
Traduza o seu site Astro + Solid com o Intlayer | Internacionalização (i18n)
Índice
O que é o Intlayer?
Intlayer é uma biblioteca de internacionalização (i18n) inovadora e de código aberto projetada para simplificar o suporte multilíngue em aplicações web modernas.
Com o Intlayer, você pode:
- Gerenciar traduções facilmente: Usando dicionários declarativos ao nível do componente.
- Localizar metadversas, rotas e conteúdo dinamicamente.
- Garantir suporte TypeScript: Com tipos gerados automaticamente para melhor preenchimento automático e detecção de erros.
- Beneficiar de recursos avançados: Como detecção dinâmica de idioma e troca de idioma.
Guia passo a passo para configurar o Intlayer no Astro + Solid
Confira o modelo da aplicação no GitHub.
Passo 1: Instalar Dependências
Instale os pacotes necessários usando seu gerenciador de pacotes preferido:
Copiar o código para a área de transferência
npm install intlayer astro-intlayer solid-js solid-intlayer @astrojs/solid-jsnpx 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.
solid-js Pacote principal do Solid.
solid-intlayer Pacote para integrar o Intlayer em aplicações Solid. Ele fornece o
IntlayerProvider, além das primitivasuseIntlayereuseLocalepara internacionalização no Solid.@astrojs/solid-js Integração oficial do Astro que permite o uso de islands de componentes Solid.
Passo 2: Configurar seu Projeto
Crie um arquivo de configuração para definir os idiomas da sua aplicação:
Copiar 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.
Passo 3: Integrar o Intlayer na sua configuração do Astro
Adicione o plugin intlayer e a integração do Solid à sua configuração do Astro.
Copiar o código para a área de transferência
// @ts-checkimport { intlayer } from "astro-intlayer";import solid from "@astrojs/solid-js";import { defineConfig } from "astro/config";// https://astro.build/configexport default defineConfig({ integrations: [intlayer(), solid()],});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çãosolid()permite o uso de islands de componentes Solid viaclient:only="solid-js".
Passo 4: Declarar seu conteúdo
Crie e gerencie suas declarações de conteúdo para armazenar traduções:
Copiar o código para a área de transferência
import { t, type Dictionary } from "intlayer";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 nocontentDir(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.
Passo 5: Usar o conteúdo no Astro
Você pode consumir os dicionários diretamente nos seus arquivos .astro usando os ajudantes principais exportados do intlayer. Você também deve adicionar metadados de SEO (como hreflang e links canônicos) a cada página e introduzir uma island de Solid para conteúdo interativo no lado do cliente.
Copiar o código para a área de transferência
---import { getIntlayer, getLocaleFromPath, getLocalizedUrl, getHTMLTextDir, getPrefix, localeMap, defaultLocale, type LocalesValues,} from "intlayer";import { SolidIsland } from "../../components/solid/SolidIsland";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 Solid renderiza todo o conteúdo interativo, incluindo o seletor de idioma --> <SolidIsland locale={locale} client:only="solid-js" /> </body></html>Se você quiser usar seu conteúdo em un atributo destring, 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.
Passo 6: Criar um componente Island de Solid
Crie um componente de island que envolva sua aplicação Solid e receba a localidade detectada pelo servidor:
Copiar o código para a área de transferência
/** @jsxImportSource solid-js */import { IntlayerProvider, useIntlayer } from "solid-intlayer";import { type LocalesValues } from "intlayer";import { LocaleSwitcher } from "./LocaleSwitcher";function App() { const content = useIntlayer("app"); return ( <div> <h1>{content.title}</h1> <LocaleSwitcher /> </div> );}export function SolidIsland({ locale }: { locale: LocalesValues }) { return ( <IntlayerProvider locale={locale}> <App /> </IntlayerProvider> );}A proplocaleé passada da página Astro (detecção no servidor) para oIntlayerProvider, servindo como o idioma inicial para todas as primitivas Solid na árvore.
No Solid, o useIntlayer retorna uma função accessor (ex: `content.). Você deve invocá-la para acessar o conteúdo reativo.
Passo 7: Adicionar um Seletor de Idioma
Crie um componente Solid LocaleSwitcher que leia os idiomas disponíveis e navegue para a URL localizada quando um usuário selecionar um novo idioma:
Copiar o código para a área de transferência
/** @jsxImportSource solid-js */import { useLocale } from "solid-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 class="locale-switcher"> <span class="switcher-label">Mudar idioma:</span> <div class="locale-buttons"> {availableLocales.map((localeItem) => ( <button onClick={() => setLocale(localeItem)} class={`locale-btn ${localeItem === locale() ? "active" : ""}`} disabled={localeItem === locale()} > <span class="ls-own-name">{getLocaleName(localeItem)}</span> <span class="ls-current-name"> {getLocaleName(localeItem, locale())} </span> <span class="ls-code">{localeItem.toUpperCase()}</span> </button> ))} </div> </div> );}Nota sobre a reatividade do Solid: No Solid,
localeé um accessor de sinal reativo - invoque sempre comolocale()para obter o valor atual.
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.
OLocaleSwitcherdeve ser renderizado dentro de umIntlayerProvider- use-o no seu componente de island (como mostrado no passo 6).
Passo 8: 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 namespacexhtml: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.ts para gerar um sitemap que inclua todas as suas rotas localizadas.
Copiar 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.ts para controlar o rastreamento dos motores de busca.
Copiar 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" }, });};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.
(Opcional) Passo 15: Extrair o conteúdo dos seus componentes
Se 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 compiler no seu arquivo intlayer.config.ts:
Copiar 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
Copiar o código para a área de transferência
npx intlayer extractAprofunde seu conhecimento
Se quiser saber mais, você também pode implementar o Editor Visual ou usar o CMS para externalizar seu conteúdo.