La Guía Completa de Accesibilidad para Sitios Multilingües y Multiculturales: Diseñar con Cuidado el Cambio de Idioma, la Lectura de Pantalla, las Variantes Ortográficas y los Campos de Formulario
Resumen (Puntos Clave por Adelantado)
- El conmutador de idioma debe ser detectable desde cualquier lugar, y debe quedar claro en qué idioma estás y qué idiomas hay disponibles.
- El uso preciso de los atributos
lang
y de la dirección del texto (dir
) en páginas y secciones afecta directamente la pronunciación y el ritmo de habla de los lectores de pantalla.- Incorpora reglas de localización para orden del nombre, direcciones, fechas, divisas y números en la interfaz y la validación para que las diferencias se traten como “variación cultural”, no “errores del usuario.”
- Usa ruby (furigana)/lecturas para CJK y maneja siglas, nombres propios y préstamos lingüísticos con ayudas de pronunciación conscientes del lector de pantalla para reducir la carga de comprensión.
- Cubre los diseños RTL (de derecha a izquierda), alternativas cuando las traducciones se retrasan o faltan, texto alternativo y subtítulos multilingües, y búsqueda/orden coherentes con la configuración regional: los lugares donde los equipos suelen atascarse.
Para quién es esto (roles concretos):
Gestores de producto para sitios multilingües, diseñadores UI/UX, ingenieros frontend, redactores técnicos/gestores de localización, QA/CS y operadores web para PR y recruitingObjetivo de accesibilidad: WCAG 2.1 AA como base, apuntando a AAA cuando sea factible (ayudas de lectura, mayor contraste, explicaciones más claras)
1. Introducción: Multilingüe ≠ solo traducir—es crear el camino más corto hacia la comprensión
Ofrecer el mismo valor en todos los idiomas y culturas exige más que cambiar cadenas. Debes codificar en la interfaz las reglas que cada cultura da por supuestas—pronunciación, formatos de entrada, estilos de fecha/divisa, orden del nombre, y más. Si añadimos diferencias de necesidades visuales, auditivas, motoras y cognitivas, las consideraciones se multiplican.
Esta guía resuelve barreras impulsadas por idioma y cultura con estructura, semántica e interacción, y muestra—mediante código de ejemplo y listas de verificación—cómo construir caminos hacia la misma comprensión para todos.
2. Principios para Cambiar de Idioma: Siempre, en Cualquier Lugar, Sin Confusión
2.1 Ubicación y etiquetado consistentes
- Colócalo en la misma ubicación en todas las páginas (p. ej., arriba a la derecha en el encabezado).
- Usa etiquetas de texto visibles (p. ej.,
日本語
/English
→ Japanese / English). No uses banderas en solitario (los idiomas ≠ países).
<nav aria-label="Language switch">
<ul class="lang-switcher">
<li><a href="/ja/" hreflang="ja" lang="ja" aria-current="page">Japanese</a></li>
<li><a href="/en/" hreflang="en" lang="en">English</a></li>
<li><a href="/fr/" hreflang="fr" lang="fr">Français</a></li>
</ul>
</nav>
2.2 Exponer el idioma y el estado actuales
- Marca el idioma actual con
aria-current="page"
y una señal visual. - Asegura que el conmutador navegue a el mismo contenido en otro idioma, usando URL alineadas (p. ej.,
/ja/
,/en/
).
2.3 Operación por teclado y lector de pantalla
- Haz que el conmutador sea alcanzable con Tab y accionable con Enter/Espacio (
<button>
o<a>
). - Evita atajos personalizados en exceso; no choques con funciones definidas por el SO/AT.
3. lang
y Dirección del Texto: Dale a la AT la “Pronunciación y Orden” Correctos
3.1 Idioma predeterminado a nivel de página
<html lang="ja">
- Declara siempre el idioma principal de la página. Los lectores de pantalla eligen voces y reglas en base a esto.
3.2 Cambio de idioma en línea
- Para préstamos lingüísticos, citas y nombres de producto, envuelve con
lang
para obtener pronunciación correcta.
<p>We value <span lang="en">Accessibility</span> and <span lang="fr">Inclusivité</span>.</p>
3.3 Idiomas de derecha a izquierda (RTL)
- Para árabe/hebreo, establece
dir="rtl"
. En texto mixto, aplica BiDi con cuidado; envuelve números, puntuación y abreviaturas con ladir
adecuada para evitar problemas de reordenación.
<p lang="ar" dir="rtl">هذا مثال <span dir="ltr">2025-10-06</span>.</p>
3.4 Consideraciones de maquetación
- En RTL, el orden de navegación, dirección de flechas e iconos pueden invertirse. Usa propiedades lógicas CSS (p. ej.,
margin-inline-start
) para reducir dependencias izquierda/derecha.
4. Texto Alternativo, Subtítulos y Audiodescripción: Entregar “la Misma Comprensión” en Todos los Idiomas
4.1 Texto alternativo de imágenes
- Ajusta el tono y el estilo del resumen por idioma; define política para la localización de terminología.
- Usa
alt
vacío para decoración; mantén losalt
informativos breves y esenciales.
<img src="chart.png" alt="Tendencia de ventas en el 1S de 2025; marzo es el pico.">
4.2 Subtítulos/captions de video
- Proporciona subtítulos cerrados (incluye hablante y efectos) en varios idiomas.
- Usa
track
con múltiples archivos VTT.
<video controls>
<source src="promo.mp4" type="video/mp4">
<track kind="captions" srclang="ja" src="captions.ja.vtt" label="Japanese" default>
<track kind="captions" srclang="en" src="captions.en.vtt" label="English">
</video>
4.3 Audiodescripción (AD)
- Para videos visualmente densos, ofrece AD específica por idioma y asegúrate de conmutadores accesibles por teclado.
5. Nombres, Direcciones, Fechas y Divisas: Internacionalizar Formularios = Ajustarse a “Su Normalidad”
5.1 Orden de nombre y estructura de campos
- Apellido→Nombre vs Nombre→Apellido varía por cultura. Cambia etiquetas por configuración regional y almacena en campos separados.
<!-- Ejemplo para configuración regional japonesa -->
<label for="family-name">Family name</label>
<input id="family-name" name="familyName" autocomplete="family-name" required>
<label for="given-name">Given name</label>
<input id="given-name" name="givenName" autocomplete="given-name" required>
5.2 Estructura de dirección
- Soporta flexibilidad de texto libre y componentes localizados (prefectura/estado/código postal).
- La validación debe solicitar confirmación en lugar de declarar entradas “incorrectas” (los topónimos varían).
5.3 Fechas, horas y zonas horarias
- Acepta entrada ISO (AAAA-MM-DD) mientras muestras en la configuración regional del usuario.
- En flujos sensibles al tiempo, muestra la zona horaria del usuario y permite cambios.
<label for="date">Date</label>
<input id="date" name="date" type="date" inputmode="numeric" aria-describedby="date-hint">
<small id="date-hint" lang="en">Format: YYYY-MM-DD</small>
5.4 Números, divisas y separación de dígitos
- La agrupación y los separadores decimales (
,
vs.
) difieren. Sé tolerante en la entrada, normaliza al guardar (ISO/código de moneda). - Coloca símbolo de divisa e información fiscal cerca; nombra las unidades explícitamente para lectores de pantalla.
6. Cuidados Específicos CJK: Ruby/Furigana, Lecturas, Acrónimos y Préstamos
6.1 Ruby (furigana)
- Para nombres, lugares y términos especializados en los que una mala lectura perjudica la UX, añade
<ruby>
.
<p>Directions to <ruby>Yamashina<rt>やましな</rt></ruby> Station</p>
- Ruby puede ser visual y auditivamente prolijo—úsalo de forma selectiva.
6.2 Abreviaturas e inicialismos
- Usa
<abbr title="…">
para aportar expansiones y pistas de pronunciación.
<abbr title="User Experience">UX</abbr>
6.3 Pronunciación de préstamos
- Para nombres de producto difíciles, añade texto auxiliar solo para SR (p. ej., mediante un
span.sr-only
).
7. Búsqueda, Orden y Resaltado: La Configuración Regional Cambia el “Orden Significativo”
- Ordena según expectativas locales (orden de diccionario, lecturas, tratamiento de acentos). Usa comparadores conscientes de la configuración regional en frontend y backend (p. ej.,
Intl.Collator
de JavaScript). - Busca normalizando full/half width, kana/romaji y diacríticos.
- Resalta coincidencias con negrita o chip de fondo además de color.
// Ejemplo: orden gojūon en japonés
const collator = new Intl.Collator('ja', { sensitivity: 'base', numeric: true });
items.sort((a,b)=> collator.compare(a.label, b.label));
8. Prepárate para Retrasos/Faltas de Traducción: Alternativas y Consistencia de Etiquetas
- Define un idioma de respaldo (p. ej.,
en
) y asegura que las claves faltantes se muestren como frases significativas. - Mantén la granularidad de etiquetas consistente (no mezcles “Save” vs “Save it”).
- En pruebas, sustituye un único idioma para detectar roturas de maquetación y problemas de ajuste.
9. Diseño de Componentes: ARIA Mínimo + Nativo Primero para no Romperse entre Idiomas
9.1 Conmutador de idioma (disclosure)
<div class="i18n" aria-labelledby="lang-label">
<h2 id="lang-label" class="sr-only">Language switch</h2>
<button aria-expanded="false" aria-controls="lang-list" aria-haspopup="listbox">Japanese</button>
<ul id="lang-list" role="listbox" hidden>
<li role="option" aria-selected="true"><a lang="ja" hreflang="ja" href="/ja/">Japanese</a></li>
<li role="option"><a lang="en" hreflang="en" href="/en/">English</a></li>
<li role="option"><a lang="ar" hreflang="ar" dir="rtl" href="/ar/">العربية</a></li>
</ul>
</div>
<script>
const btn = document.querySelector('.i18n button');
const list = document.getElementById('lang-list');
btn.addEventListener('click', ()=>{
const open = btn.getAttribute('aria-expanded')==='true';
btn.setAttribute('aria-expanded', String(!open));
list.hidden = open;
if(!open) list.querySelector('a')?.focus();
});
document.addEventListener('keydown', e=>{
if(e.key==='Escape'){ btn.setAttribute('aria-expanded','false'); list.hidden = true; btn.focus(); }
});
</script>
9.2 CSS para derecha a izquierda
:root { --space: 1rem; }
html[dir="ltr"] .nav li { margin-inline-end: var(--space); }
html[dir="rtl"] .nav li { margin-inline-start: var(--space); }
9.3 Texto solo para lectores de pantalla
.sr-only{
position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;border:0;
clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap
}
10. Localizar Microcopy: Reduce Tropiezos con las Palabras
- Usa prosa directa y concisa (evita la voz pasiva; empieza con el verbo de acción).
- Evita cadenas de negaciones (malentendidos dependientes de la cultura).
- Aclara números/unidades/fechas con ejemplos y ofrece una corrección breve.
- Al usar memoria de traducción, añade etiquetas de contexto (escena, elemento de UI, concordancia de género/número) para prevenir reutilizaciones erróneas.
11. Rendimiento × Accesibilidad: Tipografías, Anchos, Interlineado
- Web fonts: Los archivos CJK son grandes—subconjunta y usa
font-display: swap
para evitar FOIT. - Interlineado y tamaño: Las longitudes de palabra y reglas de salto difieren por idioma; apunta a ~1.6 de interlineado y deja margen para saltos en línea.
- Para palabras largas (p. ej., compuestos alemanes), usa
overflow-wrap: anywhere;
para evitar desbordes.
html { font-size: 100%; line-height: 1.6; }
p { overflow-wrap: anywhere; }
12. Pruebas con Usuarios: Usa la “Normalidad” de los Participantes como Estándar
- Participantes diversos: usuarios de lector de pantalla, usuarios centrados en teclado, diversidad en visión del color, multilingües, usuarios RTL.
- Tareas: cambiar de idioma → buscar → rellenar un formulario → confirmar correo (revisa hora/divisa).
- Puntos de observación:
- ¿Pueden cambiar de idioma sin buscar?
- ¿El idioma anunciado evita mezclas inesperadas?
- ¿Los errores distinguen variación cultural de errores reales?
- ¿Se entienden y muestran las fechas/divisas/unidades como se pretende?
13. Errores Comunes y Cómo Evitarlos
Error | ¿Qué pasa? | Solución |
---|---|---|
Banderas para idioma | Idiomas ≠ países; problemas políticos | Usa nombres de idiomas; añade hreflang /lang |
Falta lang |
Pronunciación torpe | Declara lang para página y partes |
Sin soporte RTL | Dirección de navegación e iconos incorrectos | Usa dir="rtl" + propiedades lógicas |
Cadenas faltantes muestran [MISSING_KEY] |
Inutilizable; erosiona confianza | Idioma de respaldo + tests de monitorización |
Formato fijo de nombre/dirección | La variación cultural se trata como error | Localiza y valida con suavidad |
Estado solo con color | No llega a todos | Redundancia de texto + forma |
Video monolingüe | Brecha de información | Proporciona subtítulos/AD multilingües |
Búsqueda no normaliza (ancho/diacríticos) | No se encuentran ítems | Normaliza y ordena por configuración regional |
14. Rutina de Prueba Manual de Cinco Minutos
- Cambio de idioma: Tab hasta el conmutador → salta a la misma página en otro idioma.
lang
en línea: El inglés/francés incrustado se pronuncia correctamente.- RTL: Con
dir="rtl"
, la navegación/migas/flechas/orden de foco se sienten naturales. - Formularios: Nombres/direcciones/fechas/divisa se introducen, guardan y muestran según la configuración regional.
- Subtítulos: Cambia el idioma de los subtítulos; funciona con teclado.
- Orden/búsqueda: Cumple expectativas locales; los resaltados son redundantes (no solo color).
15. Incorpóralo al Sistema de Diseño
- Tokens: idioma, dirección (
dir
), formatos de fecha/divisa/número, ajuste de palabras largas. - Componentes: conmutador de idioma, conmutador de subtítulos, entradas de dirección, selectores de fecha/hora, campo de divisa.
- Docs:
- Nombre/rol/valor (ARIA)
- Interacciones clave (Tab/Flechas/Enter/Esc)
- Transmisión redundante (visual + auditiva)
- Política de localización (cortesía, tono, formato numérico)
16. Ejemplo: Un Formulario Internacionalizado Pequeño pero Robusto
<form id="profile" lang="ja" novalidate aria-describedby="note">
<p id="note">* Required. Input rules adapt to your region.</p>
<fieldset>
<legend>Name <span aria-hidden="true">*</span></legend>
<div class="field">
<label for="family-name">Family name</label>
<input id="family-name" name="familyName" autocomplete="family-name" required>
</div>
<div class="field">
<label for="given-name">Given name</label>
<input id="given-name" name="givenName" autocomplete="given-name" required>
</div>
<div class="field">
<label for="name-kana">Reading (kana)</label>
<input id="name-kana" name="nameKana" aria-describedby="kana-hint">
<small id="kana-hint">Only if pronunciation needs to be conveyed.</small>
</div>
</fieldset>
<fieldset>
<legend>Address</legend>
<div class="field">
<label for="country">Country</label>
<select id="country" name="country" autocomplete="country-name">
<option value="JP" selected>Japan</option>
<option value="US">United States</option>
<option value="DE">Deutschland</option>
<option value="AE" dir="rtl" lang="ar">الإمارات العربية المتحدة</option>
</select>
</div>
<div class="field">
<label for="postal">Postal code</label>
<input id="postal" name="postal" inputmode="numeric" autocomplete="postal-code">
</div>
<div class="field">
<label for="line1">Address line 1</label>
<input id="line1" name="address1" autocomplete="address-line1">
</div>
<div class="field">
<label for="city">City / ward</label>
<input id="city" name="city" autocomplete="address-level2">
</div>
</fieldset>
<fieldset>
<legend>Contact</legend>
<div class="field">
<label for="email">Email</label>
<input id="email" name="email" type="email" autocomplete="email" lang="en" aria-describedby="email-hint">
<small id="email-hint" lang="en">Example: user@example.com</small>
</div>
<div class="field">
<label for="tel">Phone number</label>
<input id="tel" name="tel" type="tel" inputmode="tel" autocomplete="tel">
</div>
</fieldset>
<button type="submit">Save</button>
<div id="status" role="status" aria-atomic="true" class="sr-only"></div>
</form>
<script>
const form = document.getElementById('profile');
const country = document.getElementById('country');
country.addEventListener('change', ()=>{
const html = document.documentElement;
// Alternar RTL (ejemplo simple)
html.setAttribute('dir', country.value==='AE' ? 'rtl' : 'ltr');
// Pistas e input modes por país (usa un diccionario real en producción)
const postal = document.getElementById('postal');
if(country.value==='US'){ postal.placeholder='ZIP (e.g., 94105)'; postal.setAttribute('inputmode','numeric'); }
if(country.value==='JP'){ postal.placeholder='e.g., 1000001'; }
});
form.addEventListener('submit', e=>{
e.preventDefault();
document.getElementById('status').textContent='Saved.';
});
</script>
17. Prácticas Organizacionales: No Trates Traducción y UI como Cosas Separadas
- Automatiza la sincronización entre ramas de release y traducción (alertas por claves faltantes).
- Añade ítems a la checklist de PR para
lang
/dir
/subtítulos/alt text. - Documenta en wiki el conocimiento regional de CS (normas de dirección, correo, tratamientos, festivos) para mantener microcopy consistente.
- Revisiones trimestrales: inspecciona datos reales de búsqueda/orden/formulario (tasas de error, abandonos) y itera.
18. Quién se Beneficia—y Cómo (Impacto Concreto)
- Usuarios de lector de pantalla: Pronunciación natural con
lang
correcto; igual comprensión vía subtítulos/AD. - Usuarios de teclado/voz: Conmutadores de idioma y subtítulos comparten patrones de teclas consistentes.
- Personas mayores y aprendices: CJK ruby y soporte de abreviaturas suavizan la comprensión.
- Usuarios internacionales: Nombres, direcciones, fechas y divisas se ajustan a su “normalidad”, reduciendo errores.
- Equipos de operaciones: Menos incidentes por traducciones faltantes, fallos de dirección y orden incoherente.
- Negocio: Menor rebote y menos tickets; la confianza en la localización impulsa la conversión.
19. Cierre: Cada idioma añade una nueva forma de ser amables
- Mantén el conmutador de idioma siempre disponible y en el mismo lugar, con estado preciso.
- Define
lang
ydir
en página y fragmentos para entregar pronunciación y dirección a la tecnología asistiva. - Nombres/direcciones/fechas/divisas deben ajustarse a la “normalidad” local, con validación amable.
- Proporciona subtítulos y texto alternativo multilingües para que todos lleguen a la misma comprensión.
- Haz que búsqueda/orden sean conscientes de la configuración regional con normalización, y no dependas solo del color.
- Incluye RTL, texto largo y tipografías en el trabajo de legibilidad y operabilidad.
- Incorpóralo a tu sistema de diseño y operaciones para que traducción y UI crezcan juntas.
Construyamos un sitio multilingüe donde las personas de todo el mundo puedan entender con confianza tu intención en su idioma. Te acompaño en cada paso del camino.