Um Guia Rápido para Localizar um Site Astro

Construindo um site multilíngue com Astro? Você precisa lidar com dois desafios distintos: organizar suas páginas de conteúdo por idioma e traduzir elementos da interface como botões e navegação. Este guia mostra exatamente como configurar localização estática e dinâmica no Astro, desde a configuração básica até recursos prontos para produção.
Pontos-Chave
- Configure o roteamento i18n integrado do Astro para geração automática de URLs e organização de conteúdo
- Use rotas dinâmicas com pastas
[locale]
para evitar duplicar arquivos de página - Integre o Paraglide para traduções de strings da interface com type-safety e impacto mínimo no bundle
- Aproveite as funções auxiliares do Astro como
getRelativeLocaleUrl()
para prevenir erros comuns de roteamento
Configurando o Roteamento i18n do Astro para Conteúdo Estático
Configurando astro.config.mjs para Suporte Multilíngue
Comece configurando o roteamento i18n integrado do Astro no seu arquivo astro.config.mjs
. Isso informa ao Astro quais idiomas você suporta e como estruturar suas URLs:
import { defineConfig } from 'astro/config';
export default defineConfig({
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
routing: {
prefixDefaultLocale: true // Use /en/ para URLs em inglês
}
}
});
Definir prefixDefaultLocale: true
garante que todos os idiomas usem padrões de URL consistentes (/en/about
, /es/about
), facilitando o gerenciamento de links e evitando conflitos de roteamento posteriormente.
Criando Estrutura de Pastas Localizadas
Organize suas páginas criando pastas específicas para cada locale em src/pages/
:
src/pages/
en/
index.astro
about.astro
es/
index.astro
about.astro
fr/
index.astro
about.astro
Cada pasta corresponde a um locale definido na sua configuração. O Astro gera automaticamente as rotas corretas baseadas nesta estrutura.
Gerenciando Localização Estática e Dinâmica no Astro
Organizando Coleções de Conteúdo por Locale
Para posts de blog, documentação ou qualquer coleção de conteúdo, espelhe a mesma estrutura de locale:
src/content/
blog/
en/
first-post.md
es/
first-post.md
fr/
first-post.md
Ao consultar conteúdo, filtre pelo locale atual:
import { getCollection } from 'astro:content';
const posts = await getCollection('blog', ({ id }) => {
return id.startsWith(Astro.currentLocale + '/');
});
Implementando Rotas Dinâmicas com Pastas [locale]
Em vez de duplicar arquivos de página para cada idioma, use rotas dinâmicas. Crie uma pasta [locale]
:
src/pages/
[locale]/
index.astro
about.astro
blog/
[slug].astro
Nas suas páginas, use getStaticPaths()
para gerar rotas para todos os locales:
export function getStaticPaths() {
return [
{ params: { locale: 'en' } },
{ params: { locale: 'es' } },
{ params: { locale: 'fr' } }
];
}
Discover how at OpenReplay.com.
Lidando com Strings Dinâmicas da Interface com Paraglide
Instalando e Configurando o Paraglide para Astro
Enquanto o Astro lida com o roteamento de páginas, você precisa de uma solução para texto da interface. O Paraglide oferece excelente suporte ao TypeScript e tamanho mínimo de bundle:
npm install @inlang/paraglide-js @inlang/paraglide-astro
npx @inlang/paraglide-js init
Criando Arquivos de Tradução e Chaves de Mensagem
Armazene suas traduções em messages/
na raiz do seu projeto:
// messages/en.json
{
"nav.home": "Home",
"nav.about": "About",
"button.readMore": "Read more"
}
// messages/es.json
{
"nav.home": "Inicio",
"nav.about": "Acerca de",
"button.readMore": "Leer más"
}
Importe e use traduções nos seus componentes:
---
import * as m from '../paraglide/messages.js';
---
<nav>
<a href={`/${Astro.currentLocale}`}>{m.nav_home()}</a>
<a href={`/${Astro.currentLocale}/about`}>{m.nav_about()}</a>
</nav>
Construindo um Seletor de Idioma e Navegação
Usando getRelativeLocaleUrl() para URLs Limpas
O Astro fornece funções auxiliares para gerar URLs localizadas adequadas. Sempre use getRelativeLocaleUrl()
em vez de concatenação manual de strings:
import { getRelativeLocaleUrl } from 'astro:i18n';
const aboutUrl = getRelativeLocaleUrl(Astro.currentLocale, 'about');
const blogUrl = getRelativeLocaleUrl(Astro.currentLocale, 'blog/my-post');
Crie um componente seletor de idioma:
---
import { getRelativeLocaleUrlList } from 'astro:i18n';
const localeUrls = getRelativeLocaleUrlList();
---
<select onchange="window.location.href = this.value">
{localeUrls.map(url => {
const locale = url.split('/')[1];
return (
<option value={url} selected={Astro.currentLocale === locale}>
{locale.toUpperCase()}
</option>
);
})}
</select>
Evitando Armadilhas Comuns Como Rotas com Prefixo Duplo
Fique atento a estes erros comuns:
- Prefixos duplos: Ao usar rotas dinâmicas, limpe seus slugs para evitar URLs como
/en/blog/en/my-post
:
const cleanSlug = post.slug.replace(`${locale}/`, '');
- Caminhos de locale codificados: Sempre use os auxiliares i18n do Astro em vez de concatenação de strings
- Locale ausente nos links: Todo link interno precisa de localização adequada
Recursos Avançados de i18n do Astro
Configurando Idiomas de Fallback
Configure fallbacks para conteúdo não traduzido:
export default defineConfig({
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
fallback: {
es: 'en',
fr: 'en'
},
routing: {
fallbackType: 'rewrite' // Mostra conteúdo de fallback sem redirecionar
}
}
});
Configurando Mapeamento de Domínio para Produção
Para sites de produção com domínios separados por idioma:
export default defineConfig({
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
domains: {
fr: 'https://fr.example.com',
es: 'https://example.es'
}
}
});
Isso requer renderização do lado do servidor com o adaptador @astrojs/node
ou @astrojs/vercel
.
Conclusão
Localizar um site Astro combina duas abordagens: roteamento i18n integrado para organização de conteúdo estático e bibliotecas externas como o Paraglide para strings dinâmicas da interface. Comece com a estrutura de pastas e configuração de roteamento, depois adicione o gerenciamento de traduções. Lembre-se de usar os auxiliares de URL do Astro para evitar problemas comuns de roteamento, e considere fallbacks e mapeamento de domínio para implantações em produção.
Perguntas Frequentes
Sim, você pode migrar gradualmente mantendo suas páginas atuais e adicionando versões localizadas em pastas de locale. Use redirecionamentos para fazer a transição dos usuários de URLs antigas para as novas URLs localizadas, mantendo o valor de SEO.
Use a API JavaScript Intl com Astro.currentLocale para formatação. Crie funções utilitárias que aceitem o locale e retornem datas, números e moedas formatados apropriadamente para cada idioma.
Implemente tags hreflang no seu layout para informar aos motores de busca sobre alternativas de idioma. O roteamento i18n do Astro lida automaticamente com a estrutura de URL, mas você precisa adicionar meta tags adequadas para SEO internacional otimizado.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.