Capítulo 307 de 456
Next.js (Pages Router, desde v10) tem roteamento i18n embutido, seja por sub-path (/fr/blog) ou por domínio dedicado por locale, complementando libs de tradução como next-intl/react-intl (não substitui elas).
i18n.locales/defaultLocale: config em next.config.js; locale é um UTS Locale Identifier (language-region-script, ex. en-US)./fr/blog); o defaultLocale não tem prefixo.i18n.domains, com fallback de outros locales redirecionados pro domínio certo.Accept-Language, redireciona pro path/domínio do locale detectado ao visitar /; desligável com localeDetection: false.NEXT_LOCALE: tem prioridade sobre Accept-Language, útil pra language switcher persistente.getStaticPaths com locale: cada path retornado pode especificar locale; sem isso, só o defaultLocale é prerenderizado.output: 'export': roteamento i18n não funciona em static export.module.exports = {
i18n: {
locales: ['en-US', 'fr', 'nl-NL'],
defaultLocale: 'en-US',
domains: [
{ domain: 'example.com', defaultLocale: 'en-US' },
{ domain: 'example.nl', defaultLocale: 'nl-NL' },
],
},
}
export const getStaticPaths = ({ locales }) => {
return {
paths: [
{ params: { slug: 'post-1' }, locale: 'en-US' },
{ params: { slug: 'post-1' }, locale: 'fr' },
],
fallback: true,
}
}
| Estratégia | Como funciona | URL exemplo |
|---|---|---|
| Sub-path Routing | Locale no path | /fr/blog |
| Domain Routing | Locale por domínio | example.fr/blog |
getStaticProps não-dinâmica: gera uma versão da página por locale no build; 50 locales × 10 páginas = 500 chamadas de getStaticProps no build, use fallback: true pra mitigar em rotas dinâmicas.output: 'export': não funciona, pois não usa a routing layer do Next.js.href já prefixado sem locale={false}: o Next.js tentaria prefixar de novo; usar locale={false} no <Link> quando o href já inclui o locale.next-intl.domains.NEXT_LOCALE sobrepõe Accept-Language pra persistir escolha do usuário.fallback: true/blocking pra não explodir o tempo de build.fallback: true/blocking em getStaticPaths funciona igual pra path e pra locale.