Internacionalización
Un segmento [locale] especial en la ruta, más t("clave") en el cuerpo, seo y schema — resuelto contra src/locales/<locale>.json. Este mismo tutorial que estás leyendo usa exactamente este mecanismo.
El segmento [locale]
src/pages/[locale]/index.tsx -> /es, /en, ...pages/[locale]/index.tsx se sirve en /es, /en, o cualquier locale que tengas en src/locales/.
Traducir con t()
// src/locales/es.json
{ "home": { "title": "Bienvenido a Nexa" } }
// src/pages/[locale]/index.tsx
export default function Home() {
return <h1>{t("home.title")}</h1>;
}t("clave") reconoce un patrón sintáctico exacto: un identificador t con un único string literal — sin clave dinámica (t(variable) no se reconoce).
hreflang automático
<link rel="alternate" hreflang="es" href="/es">
<link rel="alternate" hreflang="en" href="/en">Si hay más de un locale disponible, Nexa genera los <link rel="alternate" hreflang="..."> de cada traducción automáticamente.
Interpolación: t("clave", { variable })
// src/locales/<locale>.json
{ "profile": { "donateTo": "Support {name}" } }
<p>{t("profile.donateTo", { name: data.creatorName })}</p>El segundo argumento sustituye cada marcador de variable del texto (ver el ejemplo abajo) por una referencia data.x/params.x — la misma referencia limitada que acepta cualquier otra posición dinámica de Nexa, nunca un literal ni una expresión arbitraria. nexa build/nexa lint fallan con un error claro si una clave y sus argumentos no se corresponden (un marcador sin su variable, o una variable de sobra) — mejor un build roto y explícito que un marcador sin reemplazar en producción.