SEO multilingüe en Next.js: hreflang, sitemaps y fallbacks de idioma
Una configuración práctica para alternativas hreflang, x-default, sitemaps localizados, slugs traducidos y cadenas de fallback de idiomas en un sitio multilingüe de Next.js.
View as MarkdownTraducir tu contenido es solo la mitad del SEO multilingüe. La otra mitad consiste en explicar a los motores de búsqueda lo que has hecho: qué URL corresponde a cada idioma, cuál es la predeterminada y qué mostrar cuando una región aún no tiene traducción. Si lo haces mal, Google indexará tus páginas en francés para búsquedas en inglés o tratará diez traducciones como contenido duplicado.
Esta es la lista de verificación que implementamos y cómo Scribe genera la mayor parte a partir del contenido que ya conoce.
Alternativas hreflang en cada página
Cada página localizada debe declarar a todos sus hermanos, incluyéndose a sí misma, además de un x-default que apunte a la versión para idiomas no coincidentes. En Next.js, este es el campo alternates.languages de los metadatos de la página.
La parte molesta son los slugs traducidos. Si /docs/getting-started es /fr/docs/premiers-pas en francés, tus enlaces alternativos deben usar el slug localizado, no el inglés con un prefijo de idioma. Scribe almacena el slug traducido con cada traducción, y el ayudante alternates() del entorno de ejecución devuelve el mapa completo por documento, por lo que el código de metadatos es un bucle en lugar de una tabla de búsqueda que mantienes a mano.
Dos reglas para evitar los errores comunes:
- El hreflang debe ser recíproco. Si la página en francés enlaza a la alemana, la alemana debe enlazar a la francesa. Generar ambas partes desde el mismo almacén garantiza esto.
- Las URL canónicas deben autorreferenciarse por idioma. La URL canónica de la página en francés es la URL en francés. Si apuntas la URL canónica de todos los idiomas al inglés, le estás diciendo a Google que elimine tus traducciones del índice.
Un sitemap que entiende de idiomas
Cada entrada de URL en el sitemap debe llevar los mismos enlaces alternativos, además del x-default. La función sitemapEntries() de Scribe devuelve una entrada por documento con todas las URL locales y un lastmod derivado de los campos integrados publishedAt y updatedAt, de modo que el sitemap se mantiene preciso sin fechas manuales.
Los documentos que retires no deberían simplemente desaparecer. Scribe mantiene redirecciones en un archivo _redirects.json por tipo, y las URL retiradas hacen un redireccionamiento 301 a su reemplazo en cada idioma, lo que preserva el valor de enlace que has ganado.
Fallbacks de idioma en lugar de errores 404
¿Qué debería mostrar /fr-CA/guide si tradujiste la página al francés pero no al francés de Canadá? Un error 404 desperdicia la traducción que ya tienes, mientras que mostrarla en inglés en silencio confunde a los lectores.
Scribe resuelve mediante una cadena de fallback de forma automática: un idioma regional recurre a su idioma base antes que al inglés. fr-CA prueba con fr y luego con en. zh-Hant-TW prueba con zh-Hant, luego con zh y finalmente con en. El entorno de ejecución informa qué idioma se entregó realmente en actualLocale, para que tu diseño pueda etiquetar la página con honestidad, y los parámetros prerrenderizados incluyen las URL de fallback para que las páginas existan en el momento de la compilación.
Los metadatos también son contenido
Los títulos y las metadescripciones son superficies de posicionamiento, por lo que deben traducirse con el mismo cuidado que el cuerpo del texto. En Scribe son campos ordinarios de frontmatter traducible, que se procesan y validan como cualquier otra cosa. El prompt de traducción está diseñado para la transcreación en lugar de la traducción literal, lo cual importa más para los 60 caracteres de una etiqueta de título que en cualquier otro lugar.
En conclusión
Nada de esto es exótico. Es simple administración: alternativas, canónicas, sitemaps, redirecciones y fallbacks, todo derivado de una sola pregunta acerca de qué documento existe en qué idioma y en qué URL. Un CMS que almacena traducciones como datos de primera clase puede responder a esa pregunta en un solo lugar. Conectar todo esto a mano entre un CMS alojado, una plataforma de traducción y tu enrutador es donde el SEO multilingüe suele romperse.
Mira cómo encajan las piezas en la guía de la API del entorno de ejecución o comienza desde los primeros pasos.