Web accessibility glyph color icon. Silhouette symbol on white background with no outline. Universal access. Negative space. Vector illustration
目次

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 recruiting

Objetivo 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 supuestaspronunciació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., 日本語 / EnglishJapanese / 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 la dir 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 los alt 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:
    1. ¿Pueden cambiar de idioma sin buscar?
    2. ¿El idioma anunciado evita mezclas inesperadas?
    3. ¿Los errores distinguen variación cultural de errores reales?
    4. ¿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

  1. Cambio de idioma: Tab hasta el conmutador → salta a la misma página en otro idioma.
  2. lang en línea: El inglés/francés incrustado se pronuncia correctamente.
  3. RTL: Con dir="rtl", la navegación/migas/flechas/orden de foco se sienten naturales.
  4. Formularios: Nombres/direcciones/fechas/divisa se introducen, guardan y muestran según la configuración regional.
  5. Subtítulos: Cambia el idioma de los subtítulos; funciona con teclado.
  6. 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

  1. Mantén el conmutador de idioma siempre disponible y en el mismo lugar, con estado preciso.
  2. Define lang y dir en página y fragmentos para entregar pronunciación y dirección a la tecnología asistiva.
  3. Nombres/direcciones/fechas/divisas deben ajustarse a la “normalidad” local, con validación amable.
  4. Proporciona subtítulos y texto alternativo multilingües para que todos lleguen a la misma comprensión.
  5. Haz que búsqueda/orden sean conscientes de la configuración regional con normalización, y no dependas solo del color.
  6. Incluye RTL, texto largo y tipografías en el trabajo de legibilidad y operabilidad.
  7. 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.


por greeden

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)