Catálogo · Navegación
Selector de idioma
Permite acceder desde un botón de la cabecera a la misma página en otro idioma.
Encaja mejor en: cualquier sitio — cuando el sitio está en más de un idioma
Ejemplo
El selector de idioma de una cabecera, con inglés, español y árabe.
The links go to this site’s home page in each language. The list opens under the header, at the end of the row, as it does on the home page; this documentation is in English only.
Problemas conocidos
La lista se abre en una posición fija bajo la cabecera, no bajo su botón: para colocarla junto al botón hace falta el posicionamiento mediante anclas CSS, que aún no está disponible en todos los navegadores. Por debajo de 360 px de ancho, el botón solo muestra el globo para que la cabecera quepa en una fila; el nombre del idioma sigue siendo su nombre accesible, así que quien lo ve tiene que reconocer el globo.
Todavía no se ha probado con un lector de pantalla.
Código
Copiar el marcado
import "@luz-ds/catalog/components/lang-switch.css";
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/components/lang-switch.min.css" integrity="sha384-/CoO68kAJcVIGedf4xHY5JsMuUcSTkQs3MhJyc+jKvjJO1IN62ztsedeqNDvsVUj" crossorigin="anonymous">
Un enlace por idioma, a la misma página en ese idioma, en la cabecera de cada página traducida. En cada página, marca el idioma actual con aria-current="page" y escribe la etiqueta en el idioma de la página.
<luz-lang-switch>
<button class="luz-lang-switch__button" type="button" popovertarget="lang-menu">
<span class="u-sr-only">Language: </span><span class="luz-lang-switch__name">English</span>
</button>
<nav class="luz-lang-switch__menu" id="lang-menu" popover aria-labelledby="lang-title">
<p class="luz-lang-switch__title" id="lang-title">Language</p>
<ul class="luz-lang-switch__list">
<li><a class="luz-lang-switch__link" href="/" hreflang="en" lang="en" aria-current="page">English</a></li>
<li><a class="luz-lang-switch__link" href="/es/" hreflang="es" lang="es">Español</a></li>
<li><a class="luz-lang-switch__link" href="/ar/" hreflang="ar" lang="ar">العربية</a></li>
</ul>
</nav>
</luz-lang-switch>
Variantes y opciones
No hay variantes. Una propiedad personalizada coloca la lista.
| Etiqueta, clase o propiedad | Efecto |
|---|---|
<luz-lang-switch> | El bloque contiene el botón y la lista. Es una etiqueta que ningún script define y que no tiene clase ni rol propios |
.luz-lang-switch | Un botón de 44 px con el nombre del idioma actual; se rellena cuando la lista está abierta |
.luz-lang-switch | Un globo opcional antes del nombre, dibujado en el color del texto. Es decorativo: aria-hidden="true" |
.luz-lang-switch | El nombre del idioma actual. Por debajo de 360 px queda recortado y solo se ve el globo; el nombre sigue formando parte del nombre del botón |
.luz-lang-switch | El popover: fijo bajo la cabecera, al final de la fila (en el borde izquierdo en texto de derecha a izquierda) |
.luz-lang-switch | El nombre visible de la lista |
.luz-lang-switch | La lista de idiomas, sin viñetas |
.luz-lang-switch | Una fila de 44 px por idioma. Con aria-current: en negrita y subrayada |
--luz-lang-switch-top | Distancia desde la parte superior de la pantalla a la que se abre la lista. Por defecto es --luz-bar-h, la altura de una barra de una fila con controles de 44 px; establécela en la etiqueta si tu cabecera es más alta. |
Cómo funciona
Cambiar de idioma implica ir a otra página, así que el selector es una lista de enlaces. El botón la abre con el popovertarget nativo y @luz-ds/catalog solo le da estilo: no hay ningún script.
<luz-lang-switch> es una etiqueta que ningún script define; solo da un nombre al bloque en el marcado y en CSS, y no añade ningún rol: el significado lo aportan el botón y nav.
- Cada idioma se nombra en ese mismo idioma, con
langpara que lo pronuncie un lector de pantalla yhreflangpara indicar el idioma del enlace. - La lista es un popover en la capa superior, fijo bajo la cabecera al final de la línea; se refleja en texto de derecha a izquierda.
- La propia página declara su idioma y dirección:
<html lang="ar" dir="rtl">. Añade un<link rel="alternate" hreflang="…">por idioma en el<head>para que los buscadores encuentren las demás versiones. - Core cambia el texto en árabe a la sans serif del sistema y elimina el espaciado entre letras: la serif no tiene caracteres árabes y el espaciado rompe las ligaduras de la escritura.
Sin JavaScript
Nada cambia: el botón abre la lista con la API de popover y los enlaces siguen siendo enlaces. En navegadores sin la API de popover, el botón se oculta y los enlaces se muestran en una fila.
Teclado y ARIA
Pulsa Tab hasta el botón y Enter o Espacio para abrir la lista; Tab recorre los idiomas y Enter sigue el enlace seleccionado. Escape o un clic fuera cierra la lista.
- El navegador indica a las tecnologías de asistencia si la lista está abierta mediante
popovertarget. - El nombre del botón es «Idioma: English»: primero qué es y luego el texto visible (WCAG 2.5.3). Por debajo de 360 px solo se ve el globo, pero el nombre no cambia.
- El idioma actual es un enlace con
aria-current="page".
El contraste y el foco están en la pestaña Diseño.
Diseño
Cuándo usarlo
Úsalo en sitios cuyas páginas estén disponibles en dos o más idiomas, en el mismo lugar de la cabecera de cada página traducida.
Cuándo no usarlo
No lo añadas a páginas disponibles en un solo idioma, aunque el resto del sitio esté traducido.
- No elijas el idioma por el lector según los ajustes del navegador o su ubicación: deja que lo elija y enlaza cada página con sus otras versiones.
- No lo uses para traducir la página en el sitio mediante un script: cada idioma tiene su propia página y dirección.
No sustituye nada de LUZ. Hace innecesario usar un <select> con un script que cambie la dirección.
Qué hacer y qué no
Cómo escribir el contenido
Escribe el nombre de cada idioma como lo escriben sus hablantes: «English», «Español», «العربية», nunca «EN» ni una bandera.
- Escribe la etiqueta en el idioma de la página: «Language», «Idioma», «اللغة».
- Muestra los idiomas en el mismo orden en todas las páginas.
- Si algunas páginas no están traducidas, enlaza a la página traducida más cercana e indica en su idioma que el resto está en otro idioma.
Contraste y foco
El botón está sobre la página; la lista es una superficie elevada con borde y sombra.
| Parte | Color sobre el fondo | Claro | Oscuro | Alto contraste | Mínimo necesario |
|---|---|---|---|---|---|
Texto y globo del botón | --luz-text-secondary on --luz-surface-page | 6.2:1 | 7.5:1 | 19.3:1 | 4.5:1 |
Botón, al pasar el puntero o al abrirse | --luz-text-primary on --luz-surface-muted | 15.8:1 | 15.1:1 | 20.1:1 | 4.5:1 |
Título de la lista | --luz-text-secondary on --luz-surface | 6.4:1 | 6.9:1 | 19.3:1 | 4.5:1 |
Enlace de idioma | --luz-text-primary on --luz-surface | 16.5:1 | 14.0:1 | 21.0:1 | 4.5:1 |
Enlace de idioma, al pasar el puntero | --luz-text-primary on --luz-surface-muted | 15.8:1 | 15.1:1 | 20.1:1 | 4.5:1 |
Anillo de foco del botón | --luz-focus-ring on --luz-surface-page | 5.6:1 | 7.7:1 | 21.0:1 | 3:1 |
Anillo de foco de un enlace | --luz-focus-ring on --luz-surface | 5.9:1 | 7.2:1 | 21.0:1 | 3:1 |
Calculado a partir de los valores de los tokens de cada modo y redondeado hacia abajo. El mínimo necesario es el de WCAG 2.2 AA: 4,5:1 para texto y 3:1 para anillos de foco, bordes e iconos.
- Foco: un contorno
--luz-focus-ringde 2 px, por fuera del botón y justo por dentro de cada enlace, para que las esquinas redondeadas de la lista nunca lo recorten. - El idioma actual aparece en negrita y subrayado, no solo con un color.
Tokens que usa
Los 20 tokens que leen las reglas de components/lang-switch.css del catálogo, agrupados por familia. Cada familia enlaza a su página, con los valores de todos los modos. En Figma son variables con los mismos nombres: consulta Tokens en Figma.
- Color
--luz-brand-primary,--luz-divider,--luz-focus-ring,--luz-surface,--luz-surface-hover,--luz-surface-muted,--luz-text-muted,--luz-text-primary,--luz-text-secondary- Spacing and sizing
--luz-control-lg,--luz-space-2xs,--luz-space-xs,--luz-space-sm,--luz-space-md- Typography
--luz-font-sans,--luz-text-sm,--luz-text-md- Radius
--luz-radius-md- Shadows
--luz-shadow-md- Layout and breakpoints
--luz-bar-h
El teclado y ARIA están en la pestaña Código.