i18n
O Seed pode publicar um site em vários idiomas a partir de uma única árvore de páginas, gerando as URLs por prefixo, o hreflang e reescrevendo os links internos automaticamente.
Não confunda com o hreflang: manual do front matter (veja SEO e Metadados) — aquele é para apontar pra URLs que o Seed não constrói (outro domínio, outra build). Esta página é sobre o Seed construindo e servindo as próprias variantes de idioma.
Configuração
A chave i18n.sources no seed.yaml declara, para cada idioma de origem, quais variantes existem e em qual prefixo de URL cada uma vive:
```yaml
i18n:
sources:
pt-BR:
alternates:
en: en
es: es
```Com essa configuração, uma página em src/sobre.seed (locale pt-BR, sem prefixo) ganha variantes em /en/sobre.html e /es/sobre.html.
O prefixo precisa ser um único segmento seguro — letras minúsculas e números, sem barra — e não pode colidir com static, assets, __reload, __help, dist ou api. Prefixos e locales duplicados entre grupos são erro de build.
Como funciona
Toda página .seed/.md descoberta em src/ já é uma página normal, com seu locale definido pelo prefixo do caminho: src/en/sobre.seed é en, src/sobre.seed fica no locale padrão (lang: do seed.yaml). O i18n.sources não cria páginas do zero — ele só declara quais páginas são a mesma página em locales diferentes.
Pra cada variante declarada, o Seed olha se já existe uma página explícita naquele prefixo:
| Situação | Resultado |
|---|---|
Existe src/en/sobre.seed | Essa página vence — é a versão en, com o conteúdo que você escreveu. |
| Não existe | O Seed duplica o HTML já renderizado da página de origem para /en/sobre.html, só trocando lang e og:locale. É um placeholder, não uma tradução — o conteúdo continua no idioma original até alguém escrever src/en/sobre.seed. |
hreflang e links internos
Cada grupo de variantes recebe um <link rel="alternate" hreflang="..."> por locale, mais um hreflang="x-default" apontando pro locale padrão do site (ou, se ele não fizer parte do grupo, pra primeira variante sem prefixo):
```html <link rel="alternate" hreflang="pt-BR" href="https://meusite.com/sobre.html"> <link rel="alternate" hreflang="en" href="https://meusite.com/en/sobre.html"> <link rel="alternate" hreflang="es" href="https://meusite.com/es/sobre.html"> <link rel="alternate" hreflang="x-default" href="https://meusite.com/sobre.html"> ```
Links href internos também são reescritos: um link pra /contato.html dentro da variante en vira /en/contato.html automaticamente, desde que contato também faça parte de um grupo i18n. Links pra /static/... e URLs externas nunca são tocados.
Por página
O comportamento padrão do grupo pode ser desligado ou sobrescrito no front matter de uma página específica:
| Front matter | Efeito |
|---|---|
i18n: false | Essa página não gera variantes e não recebe hreflang — fica de fora da expansão inteira. |
i18n: {en: en-gb} | Sobrescreve os alternates só dessa página, ignorando o que seed.yaml define pro grupo dela. |
sitemap: false e noindex: true na página de origem propagam pras variantes geradas automaticamente — se a origem está fora do sitemap, as duplicatas também ficam.
Feito com ❤️ e Seed