Detectar el idioma del usuario y redirigir a la versión correcta
Aprende a leer el idioma del navegador, normalizar locales y redirigir de forma segura a la versión web adecuada sin crear bucles ni romper la experiencia del usuario.
Una web multidioma no debería obligar al usuario a buscar manualmente su versión si el navegador ya nos da pistas fiables sobre su preferencia.
La clave no es solo leer `navigator.language`, sino convertir ese dato en una decisión controlada: idioma soportado, fallback y redirección sin bucles.
En trabajo real también importa respetar una elección manual previa, porque el idioma detectado por el navegador no siempre coincide con lo que la persona quiere ver.
Al terminar esta lección podrás construir un snippet reutilizable para detectar el idioma del usuario y llevarlo a la ruta correcta con criterio profesional.
- Detectar idioma no va de impresionar con una API: va de reducir fricción en una web internacional.
- Piensa en una landing con versiones en español, inglés y francés. Si un usuario entra por la raíz `/`, lo razonable es enviarlo a la versión que mejor encaja con su navegador, pero sin secuestrar su navegación si ya eligió otra.
- Ese matiz cambia mucho la implementación. Una redirección útil debe tomar una decisión clara, aplicar un fallback y evitar comportamientos molestos como volver a redirigir cada vez que se recarga la página.
- La API más conocida es `navigator.language`, pero conviene conocer también `navigator.languages`.
- `navigator.language` devuelve el idioma principal del navegador, por ejemplo `es-ES`, `es-MX` o `en-US`. Es suficiente para muchos casos simples, pero no te cuenta si el usuario tiene varias preferencias configuradas.
Qué problema resuelve esta redirección
Detectar idioma no va de impresionar con una API: va de reducir fricción en una web internacional.
Piensa en una landing con versiones en español, inglés y francés. Si un usuario entra por la raíz `/`, lo razonable es enviarlo a la versión que mejor encaja con su navegador, pero sin secuestrar su navegación si ya eligió otra.
Ese matiz cambia mucho la implementación. Una redirección útil debe tomar una decisión clara, aplicar un fallback y evitar comportamientos molestos como volver a redirigir cada vez que se recarga la página.
Paso 1: leer el idioma del navegador sin asumir demasiado
La API más conocida es `navigator.language`, pero conviene conocer también `navigator.languages`.
`navigator.language` devuelve el idioma principal del navegador, por ejemplo `es-ES`, `es-MX` o `en-US`. Es suficiente para muchos casos simples, pero no te cuenta si el usuario tiene varias preferencias configuradas.
`navigator.languages` devuelve una lista ordenada por prioridad. Si existe, es mejor empezar por ahí porque te permite probar primero la preferencia principal y luego otras opciones válidas antes de caer en el fallback.
- Usa `navigator.languages` si está disponible.
- Mantén un fallback por si el navegador no expone esa lista.
- No compares todavía contra rutas: primero normaliza.
Paso 2: normalizar el locale y traducirlo a una ruta real
El navegador te da locales completos; tu web suele trabajar con códigos más simples.
Lo habitual es que tu web soporte idiomas base como `es`, `en` o `fr`, mientras que el navegador te devolverá variantes regionales como `es-AR` o `fr-CA`. Por eso conviene convertir `es-ES` en `es` antes de buscar la ruta.
Este paso evita condicionales interminables y te permite añadir idiomas nuevos editando un único objeto de configuración.
Paso 3: redirigir sin crear bucles ni pelearte con el botón atrás
El error típico no está en detectar el idioma, sino en redirigir con demasiada agresividad.
Antes de redirigir debes comprobar si ya estás en la ruta correcta. Si no haces esa verificación, entrar en `/es/` podría lanzar otra redirección innecesaria y complicar el flujo.
Además, en este caso `window.location.replace()` suele ser mejor que `window.location.href = ...` porque sustituye la entrada actual del historial. Así evitas que el usuario pulse Atrás y vuelva a una página que lo redirige otra vez.
- Comprueba siempre si ya estás en la versión correcta.
- Usa `replace()` si no quieres ensuciar el historial.
- Si hay selector manual de idioma, guarda esa decisión y salta la detección automática.
Paso 4: montar el snippet final bien atado
Ahora sí: junta detección, normalización, preferencia guardada y redirección segura en una sola pieza reutilizable.
El snippet final de esta lección sigue cuatro reglas: primero respeta un idioma guardado, después revisa la lista de idiomas del navegador, luego cae en un fallback estable y por último evita redirigir si ya estás en la ruta correcta.
Ese orden importa. Si cambias la prioridad y obligas siempre a seguir el idioma del navegador, puedes romper la experiencia de alguien que prefiere ver la web en inglés aunque tenga el sistema en español.
Debug común: por qué a veces redirige mal
Los fallos más habituales son de criterio, no de sintaxis.
- Comparar `es-ES` directamente contra una clave `es` y no normalizar el locale.
- Olvidar el fallback y romper la navegación cuando llega un idioma no soportado como `de-DE`.
- Usar `href` o `assign()` sin pensar en el historial y generar sensación de rebote al pulsar Atrás.
- Forzar redirección incluso cuando la ruta actual ya pertenece a un idioma válido.
- No respetar una preferencia guardada por el usuario y sobreescribirla en cada visita.