Cómo funciona hreflang y cómo se ve en el código
Una web con varias versiones de idioma se enfrenta a un problema que los motores de búsqueda no resuelven por sí solos: ¿cómo sabe Google que la versión en español, la alemana y la inglesa de una página son el mismo contenido, solo que en distinto idioma? Sin una señal explícita, un buscador trata esas tres URL como tres páginas independientes, incluso como si compitieran entre sí. Ahí entra hreflang. El atributo agrupa todas las versiones de idioma de una página y, al mismo tiempo, indica a qué idioma y, opcionalmente, a qué país corresponde cada una.
El valor del atributo hreflang sigue una sintaxis fija: primero el código de idioma en formato ISO 639-1, por ejemplo "es" para español o "de" para alemán, seguido opcionalmente de un guion y el código de país en ISO 3166-1 Alpha-2, como "es-MX" para español dirigido a México o "de-AT" para alemán en Austria. El orden es obligatorio: idioma primero, país después, nunca al revés. Un valor como "MX-es" es inválido y Google lo ignora. Existe además el valor especial "x-default", que marca la versión que se muestra cuando ninguna de las versiones definidas coincide con el idioma o la región del usuario, normalmente la página internacional o en inglés.
La forma más habitual de implementar hreflang es como un grupo de etiquetas link en el head de cada página implicada. Ese grupo debe ser idéntico en todas las versiones: cada página se enumera a sí misma y enumera todas las demás. Así se ve un bloque completo para una entrada de glosario con tres versiones de idioma más x-default, con dominio propio como ejemplo. La figura siguiente muestra el bloque completo para las tres versiones.
Este bloque, con las mismas cuatro líneas de hreflang y la misma canonical, tiene que ir en el head de las tres páginas implicadas, no solo en la española. Lo único que cambia de una página a otra es su propia URL canonical. En webs con muchas versiones de idioma, el head se vuelve difícil de mantener; ahí conviene usar en su lugar el sitemap XML, donde cada URL referencia sus alternativas mediante entradas xhtml:link. Para documentos que no son HTML, como los PDF, la vía adecuada es la cabecera HTTP Link con rel="alternate", porque un PDF no admite un head donde insertar las etiquetas.
La elección entre las tres vías depende sobre todo del número de páginas: unas pocas decenas se gestionan bien con etiquetas link en el head, mientras que varios cientos o miles de URL por idioma se manejan mejor desde el sitemap, generado desde una única fuente de datos. Sea cual sea la vía elegida, la regla es la misma: el grupo debe estar completo y ser coherente, o Google ignora toda la señal para esas URL.
Un bloque, tres páginas: solo cambia la línea canonical
<link rel="alternate" hreflang="es" href="https://zds.es/que-es-hreflang/"><link rel="alternate" hreflang="en" href="https://zds.es/en/what-is-hreflang/"><link rel="alternate" hreflang="de" href="https://zds.es/de/was-ist-hreflang/"><link rel="alternate" hreflang="x-default" href="https://zds.es/que-es-hreflang/"><link rel="canonical" href="https://zds.es/que-es-hreflang/">
Cada página se enumera a sí misma
Las cuatro líneas de hreflang son idénticas en las tres versiones, incluida la que apunta a la propia URL.
x-default recoge el resto
Marca la versión que se muestra cuando el idioma o la región del usuario no coincide con ninguna de las versiones definidas.
Solo cambia la canonical
Cada versión apunta con su canonical a sí misma, idéntica carácter por carácter a su propia línea de hreflang.
El grupo solo funciona completo: si falta una línea o una URL difiere, la señal decae para todas las URL implicadas.
