---
title: Web multidioma: estructura, hreflang y SEO bien hechos
url: https://juanluismora.es/seo/seo-multidioma-hreflang-estructura.html
---

# Cómo montar una web multidioma: estructura, hreflang y qué traducir primero

Juan Luis Mora · Actualizado el 22 de octubre de 2026

La web está traducida a cinco idiomas y en Google Alemania sale la versión en español. O sale la inglesa en Francia. O Search Console avisa de errores de hreflang que nadie entiende. El síntoma cambia, pero casi siempre viene de lo mismo: la estructura y las anotaciones de idioma no le cuentan a Google lo que la web pretende.

En este artículo

1. [Dónde vive cada idioma](#1-donde-vive-cada-idioma)
2. [Hreflang bien hecho](#2-hreflang-bien-hecho)
3. [Canonical por idioma](#3-canonical-por-idioma)
4. [Selector de idioma, sin redirecciones automáticas](#4-selector-de-idioma-sin-redirecciones-automaticas)
5. [Qué traducir primero](#5-que-traducir-primero)
6. [Checklist técnica](#checklist-tecnica)
7. [La serie «SEO por idiomas»](#la-serie-seo-por-idiomas)

Acabo de montar mi propia web en inglés y en el resto de lenguas oficiales de la UE, con `/en/` como portada en inglés. Este artículo es la base técnica de la serie «SEO por idiomas». Los artículos de cada idioma cuentan lo que cambia en las palabras y en el mercado. Aquí va lo que es igual para todos.

## 1. Dónde vive cada idioma

Hay tres opciones serias. Google las compara en su [guía de webs multirregionales y multilingües](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites):

| Estructura | Ejemplo | A favor | En contra |
| --- | --- | --- | --- |
| Dominio por país | example.de | Señal de país muy clara | Caro, más infraestructura, solo apunta a un país |
| Subdominio | de.example.com | Fácil de montar, permite servidores distintos | No queda claro si «de» es idioma o país |
| Subcarpeta | example.com/de/ | Fácil de montar, poco mantenimiento | Un solo servidor, separar sitios es más difícil |

La cuarta, parámetros tipo `?lang=de`, Google directamente no la recomienda. Y cambiar el idioma con cookies sin cambiar la URL, tampoco: Google aconseja una URL distinta para cada idioma.

Mi criterio: para la mayoría de empresas españolas, subcarpetas. Toda la autoridad del dominio se comparte, hay un solo sitio que mantener y una sola propiedad de Search Console, aunque podéis dar de alta cada carpeta por separado para ver sus datos. Los dominios por país tienen sentido cuando cada país es casi un negocio aparte, con su equipo y su catálogo.

Un detalle: la carpeta por idioma (`/de/`) o por idioma y país (`/de-at/`). Si el contenido para Alemania y Austria es el mismo, carpeta por idioma. Si cambian precios, envíos o condiciones, por idioma y país. Google ya avisa de que no usa el nombre de la carpeta ni del subdominio para saber a quién va dirigida la página. Eso se lo decís con hreflang.

## 2. Hreflang bien hecho

El hreflang le dice a Google qué páginas son la misma en otros idiomas, para que enseñe a cada usuario la suya. Las reglas están en la [documentación de Google sobre versiones localizadas](https://developers.google.com/search/docs/specialty/international/localized-versions). Las que más se rompen:

- Recíproco. Si la página A apunta a B, B tiene que apuntar a A. Si no, Google ignora esas anotaciones.
- Autorreferencia. Cada versión se incluye a sí misma en la lista. El bloque es idéntico en todas las versiones.
- URLs absolutas. Con `https://` y el dominio completo. Nada de `/de/pagina`.
- Códigos correctos. Idioma en ISO 639-1 y, si queréis, región en ISO 3166-1 Alpha 2. Nunca solo el país.
- x-default. La página para quien no encaja en ningún idioma que tengáis.

Un ejemplo con español, inglés, alemán, alemán para Suiza y x-default. Este bloque va igual en el `<head>` de las cuatro páginas:

```
<link rel="alternate" hreflang="es" href="https://example.com/servicios/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/services/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/leistungen/" />
<link rel="alternate" hreflang="de-CH" href="https://example.com/de-ch/leistungen/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/services/" />
```

### Idioma o idioma y región

`de` es alemán para cualquiera. `de-CH` es alemán para Suiza. Usad la región solo cuando la página cambie de verdad para ese país. Si no, el código de idioma solo es más sencillo y cubre más.

Si tenéis varias versiones regionales de un idioma, Google recomienda añadir una genérica para el resto de hablantes. Y algunas cosas no funcionan:

- `es-419` (español de Latinoamérica) no está soportado.
- `en-UK` no sirve. El código del Reino Unido es `GB`.
- `be` no es Bélgica: es el bielorruso. Para Bélgica, `nl-BE`, `fr-BE` o `de-BE`.

Y los clásicos de confundir idioma con país, que en Europa salen mucho. El primer código es el idioma:

| Idioma | Correcto | Incorrecto |
| --- | --- | --- |
| Griego | el | gr |
| Checo | cs | cz |
| Danés | da | dk |
| Sueco | sv | se |
| Estonio | et | ee |
| Esloveno | sl | si |

### HTML, cabecera HTTP o sitemap

Google acepta tres métodos y dice que son equivalentes. Usar los tres a la vez no aporta nada y complica el mantenimiento. Elegid uno.

Con muchas páginas e idiomas, el sitemap suele ser lo más cómodo, porque no engorda el HTML. Cada URL lleva la lista completa de alternativas, incluida ella misma:

```
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/servicios/</loc>
    <xhtml:link rel="alternate" hreflang="es" href="https://example.com/servicios/" />
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/services/" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/services/" />
  </url>
  <url>
    <loc>https://example.com/en/services/</loc>
    <xhtml:link rel="alternate" hreflang="es" href="https://example.com/servicios/" />
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/services/" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/services/" />
  </url>
</urlset>
```

Los `xhtml:link` no cuentan para el límite de URLs del sitemap. La cabecera HTTP es para lo que no es HTML, como los PDF.

## 3. Canonical por idioma

Cada versión lleva un canonical a sí misma. La versión alemana no lleva canonical a la española. Si lo hacéis, le estáis diciendo a Google que la alemana es una copia y que indexe la otra, justo lo contrario del hreflang.

Google lo dice en su guía de [URLs duplicadas](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls): si usáis hreflang, el canonical tiene que apuntar a una página del mismo idioma.

El caso que sí necesita pensarse es el del mismo idioma en dos sitios. Por ejemplo, contenido en alemán casi igual en `example.de/` y en `example.com/de/`. Ahí Google pide elegir una versión preferida y usar canonical y hreflang para que salga la correcta.

## 4. Selector de idioma, sin redirecciones automáticas

Redirigir según la IP o el idioma del navegador parece cómodo. Para el SEO es un problema:

- Google desaconseja redirigir automáticamente según el idioma que creéis que tiene el usuario, porque impide que usuarios y buscadores vean todas las versiones.
- Googlebot suele rastrear desde Estados Unidos y sin la cabecera `Accept-Language`. Si la web decide el idioma por IP o por cabecera, puede que Google solo vea una versión. Lo explica en su página sobre [páginas adaptadas a la configuración regional](https://developers.google.com/search/docs/specialty/international/locale-adaptive-pages).
- Un español de viaje en Alemania quiere la web en español. La IP no lo sabe.

Lo que funciona: un selector visible en todas las páginas, con enlaces HTML normales a la misma página en cada idioma, no a la portada. Cada idioma escrito en su propio idioma («Deutsch», no «Alemán»). Y como mucho, un aviso discreto que sugiera otra versión, sin forzar.

Y una cosa más: Google detecta el idioma por el contenido visible, no por el atributo `lang` ni por la URL. Una página en alemán con el menú, el pie y los botones en español es una página a medio traducir. Ponedle el `lang` correcto igualmente, que lo usan los navegadores y los lectores de pantalla.

## 5. Qué traducir primero

Traducir toda la web a la vez rara vez compensa. Yo iría en este orden:

- Las páginas que venden: servicios, categorías y productos principales.
- La portada y la página de contacto, con datos útiles para ese país.
- Las páginas legales que exija cada mercado.
- Los artículos del blog que respondan a búsquedas que existen en ese idioma. No todos.

Antes de traducir, la investigación de palabras clave en el idioma de destino. Una traducción correcta con palabras que nadie busca no posiciona. Y no publiquéis páginas con el contenido sin traducir y solo la plantilla cambiada: Google considera duplicadas las versiones localizadas cuyo contenido principal sigue sin traducir.

## Checklist técnica

- Una URL por idioma, en subcarpetas salvo que haya motivo para otra cosa.
- Hreflang recíproco, con autorreferencia, URLs absolutas y códigos ISO correctos.
- x-default apuntando al selector o a la versión más universal.
- Un solo método para el hreflang, mejor el sitemap si la web es grande.
- Canonical de cada versión a sí misma.
- Selector con enlaces a la página equivalente. Ninguna redirección por IP.
- Contenido principal traducido, no solo la plantilla.
- Search Console revisado por país después de publicar.

## La serie «SEO por idiomas»

- [SEO en alemán: Alemania, Austria y Suiza](https://juanluismora.es/seo/seo-en-aleman-alemania-austria-suiza.html)
- [SEO en francés: Francia, Bélgica y Suiza](https://juanluismora.es/seo/seo-en-frances-francia-belgica-suiza.html)
- [SEO en italiano y portugués](https://juanluismora.es/seo/seo-en-italiano-y-portugues.html)
- [SEO en los países nórdicos: sueco, danés y finlandés](https://juanluismora.es/seo/seo-en-paises-nordicos-sueco-danes-finlandes.html)
- [SEO en neerlandés: Países Bajos y Flandes](https://juanluismora.es/seo/seo-en-neerlandes-paises-bajos-flandes.html)
- [SEO en polaco, checo y otras lenguas eslavas](https://juanluismora.es/seo/seo-en-polaco-checo-lenguas-eslavas.html)
- [SEO en griego y búlgaro](https://juanluismora.es/seo/seo-en-griego-y-bulgaro-alfabetos-no-latinos.html)
- [SEO en los países bálticos y en húngaro](https://juanluismora.es/seo/seo-en-paises-balticos-y-hungaro.html)
- [SEO en inglés internacional](https://juanluismora.es/seo/seo-en-ingles-internacional.html)
- [Lo que una mala traducción le hace al SEO de una web internacional](https://juanluismora.es/seo/malas-traducciones-seo-web-internacional.html)

¿Qué estructura usáis en vuestra web multidioma, y os ha dado algún problema el hreflang?

---

**¿Te ha servido?** Si quieres que lo mire en tu web, [aquí te cuento cómo trabajo el SEO](https://juanluismora.es/seo-freelance) o [escríbeme](https://juanluismora.es/contacto).

## Relacionado

- [Error en el login de WordPress: bucle de redirección (solución)](https://juanluismora.es/seo/error-en-login-de-wordpress-wp-login-phpredirect.html)
- [Precio de una auditoría SEO: qué debe incluir y de qué depende](https://juanluismora.es/seo/auditoria-seo-precio.html)
- [WPO en WordPress: por dónde empezar de verdad](https://juanluismora.es/seo/como-hago-wpo-en-wordpress.html)
- [URLs limpias y amigables: cómo funcionan de verdad](https://juanluismora.es/seo/url-limpias-con-php.html)

## ¿Lo miro en tu web?

Le echo un vistazo a los datos y te digo qué tocar primero.

[Escríbeme un correo](mailto:seo@juanluismora.es?subject=Consulta%20desde%20https%3A//juanluismora.es/seo/seo-multidioma-hreflang-estructura.html) [Pedir presupuesto SEO](https://juanluismora.es/presupuesto-seo#agenda)

Juan Luis Mora · Ingeniero informático y consultor SEO freelance. SEO en español para España y el mundo.

Escribo para IAs desde Google Bard.

Campaña de Navidad

Web con IA + Google Ads

2.000 €

Te hago una web como esta, lista para Google y para las IAs, y la campaña de Google Ads que la acompaña.

[Quiero mi web con IA](https://juanluismora.es/web-con-ia)
