Product Craft Bible
Internacionalización
Inicio Avanzado Internacionalización
Avanzado

Internacionalización

10 reglas mdn · smashing magazine · w3cmaterial design · apple higsmashing magazine · w3cmdn · unicode cldr · w3c
178

Internacionalización

10 reglas
1548

Layout RTL desde el inicio

Arabe, hebreo y persa se escriben de derecha a izquierda. Implementar soporte RTL desde el principio es barato; retrofitearlo en un sistema existente puede triplicar el esfuerzo. En CSS moderno, usar propiedades logicas (margin-inline-start, padding-inline-end) en lugar de margin-left y padding-right para que el layout se espeje automáticamente.

mdn · smashing magazine · w3c
Preferir
Same UI mirrored with dir="rtl" + logical properties
الملف الشخصي
معلومات الحساب
الأمان
dir="rtl" + CSS logical properties (margin-inline-start, padding-inline-end) espeja todo automáticamente
Evitar
Arabic UI forced into LTR layout
الملف الشخصي
معلومات الحساب
الأمان
Texto arabe alineado a la izquierda, sidebar en el lado equivocado, chevron apunta mal
1549

No espejar iconos universales, si los direccionales

En RTL, los iconos que representan dirección o flujo deben espejarse: flechas de navegación, iconos de reproductor, chevrons de breadcrumb. Los iconos universales nunca deben espejarse: checkmark, warning, logo, reloj, telefono, corazón. Aplicar [dir="rtl"] .icon-directional { transform: scaleX(-1); } solo a los iconos de flujo.

material design · apple hig
Preferir
Direccionales: espejar en RTL
Back LTR / RTL ok
Flecha LTR / RTL ok
Redo LTR / RTL ok
Universales: sin espejar
Buscar ok
Casa ok
Checkmark ok
Estrella ok
Evitar
RTL: todos los iconos espejados (incorrecto)
Buscar espejado
Telefono espejado
Casa espejado
Ajustes espejado
Checkmark espejado
1550

Reservar 30-40% extra de espacio para traducción

El ingles es uno de los idiomas más cortos. "Submit" en aleman es "Einreichen". "Delete account" en frances es "Supprimer le compte". Los textos en UI suelen expandirse 30-40% al traducir del ingles. Los layouts deben ser elasticos: evitar anchos fijos en botones y labels, usar min-width en lugar de width en CTAs.

smashing magazine · w3c
Preferir
min-width: el botón crece con el idioma
Evitar
Ancho fijo trunca DE y ES
1551

Interpolación de variables, nunca concatenación

Las concatenaciones de cadenas asumen un orden gramatical fijo que no funciona en todos los idiomas. En español "Hola " + nombre funciona, pero en japones el sujeto va al final y el verbo cambia de posición. Usar siempre interpolación con plantillas: t('greeting', { name, count }) permite que el traductor reordene las variables dentro de la cadena según la gramatica del idioma destino, sin tocar código.

smashing magazine · w3c
Preferir
t('greeting', { name, count }) // es: "Hola {name}, tienes {count} mensajes" // ja: "{name}san, {count}ken no messeeji"
Los traductores reordenan las variables libremente dentro de la plantilla.
Evitar
"Hola " + nombre + ", tienes " + count + " mensajes"
En japones el orden es sujeto-objeto-verbo. La concatenación rompe la estructura gramatical al traducir.
1552

Pluralización correcta (reglas CLDR)

En español hay dos formas plurales (1 archivo / 2 archivos). En arabe hay seis. En polaco hay cuatro. En ruso hay cuatro. Usar una libreria de i18n que soporte las reglas de pluralización del Unicode CLDR (como i18next o la API nativa Intl.PluralRules). Nunca concatenar manualmente con count + " archivo(s)", porque el resultado es incorrecto en la mayoría de idiomas con reglas plurales complejas.

mdn · unicode cldr · w3c
Preferir
CLDR vía Intl.PluralRules
const pr = new Intl.PluralRules("es"); pr.select(0) // "other" -> "0 archivos" pr.select(1) // "one" -> "1 archivo" pr.select(2) // "other" -> "2 archivos"
0 archivos ES
1 archivo ES
2 archivos ES
Categorías CLDR por idioma
ES one other
PL one few many other
AR zero one two few many other
RU one few many other
Evitar
Pluralización ingenua: count + " archivo(s)"
count + " archivo(s)"
0 archivo(s) ES
1 archivo(s) ES
5 archivo(s) ES
Perezoso y roto en idiomas con reglas plurales complejas (arabe tiene 6 formas, polaco tiene 4)
1553

Formatos de fecha, número y moneda por locale

12/03/2025 es el 12 de marzo en EE.UU. y el 3 de diciembre en gran parte del mundo. Lo mismo con números: 1,234.56 en EE.UU. es 1.234,56 en Alemania. Usar siempre Intl.DateTimeFormat, Intl.NumberFormat e Intl.RelativeTimeFormat para formatear según el locale del usuario. Nunca formatear fechas, números o monedas manualmente. Código: new Intl.DateTimeFormat(locale).

mdn · w3c
Preferir
Formateado con Intl API por locale
LocaleFechaMoneda
en-US12/3/2025$1,234.56
de-DE3.12.20251.234,56 EUR
es-MX3/12/2025$1,234.56 MXN
Cada locale ve el formato que espera, sin lógica manual.
Evitar
Formato fijo US en todas las locales
CampoValor
Fecha12/03/2025
Precio$1,234.56
Hora3:00 PM
Es 12 de marzo o 3 de diciembre? Ambiguo para usuarios no-US.
1554

No texto en imagenes

El texto embebido en imagenes no es traducible, no es accesible para lectores de pantalla, no escala bien en alta densidad, y dificulta el SEO. Todo texto que deba ser localizado debe ser HTML sobre la imagen (posicionado con CSS), nunca parte del archivo de imagen. Excepción: logos y marcas registradas.

wcag · smashing magazine
Preferir
Summer Sale HTML overlay, swappable per locale
EN Summer Sale
ES Rebajas de Verano
DE Sommerschlussverkauf
Misma imagen, texto HTML intercambiable por locale.
Evitar
Summer Sale · 50% Off Limited time only
Texto dentro de la imagen: no se puede traducir, no escala, no se puede refluir.
1555

Significado cultural de colores

El rojo significa peligro en Occidente pero suerte y prosperidad en China. El blanco es el color del luto en Japon y partes de Asia. El verde de "exito" no es universal. Cuando el color carga significado funcional (error, exito, advertencia), siempre acompañarlo con un icono o texto. El color solo nunca debe ser la única señal de significado cultural.

nielsen norman · smashing magazine
Preferir
US Western
Revenue +12.4%
Expenses -3.1%
CN China
Revenue +12.4%
Expenses -3.1%
Cada mercado usa sus asociaciones culturales de color, con iconos direccionales (flechas arriba/abajo) que refuerzan el significado independientemente del color.
Evitar
Portfolio Overview Q2
Revenue +12.4%
Expenses -3.1%
Net Growth +9.3%
Color meaning assumed universal. In China, red = prosperity, green can mean infidelity.
Verde = ganancias, rojo = perdidas, sin iconos ni etiquetas semánticas. La asociación cultural del color se asume universal.
1556

Ordenamiento locale-aware

En español, "ch" y "ll" se ordenaban como letras independientes. En sueco, "a" con umlauts va después de "z". JavaScript Array.sort() por defecto usa orden Unicode, no lingüístico. Usar siempre Intl.Collator o el método localeCompare() con el locale correcto para listas de nombres, paises o cualquier texto ordenado alfabeticamente.

mdn · w3c
Preferir
Apfel
Ärzte
Über
Zebra
items.sort(new Intl.Collator('de').compare)
DE (aleman)
Apfel
Ärzte
Über
Zebra
Öl
SV (sueco)
Apfel
Uber
Zebra
Ärzte
Öl
En sueco, Ä y Ö van DESPUÉS de Z, no junto a A y O como en aleman.
Evitar
Apfel
Zebra
Ärzte
Über
items.sort()
sort() usa codepoints Unicode, no reglas lingüísticas. Las vocales acentuadas quedan después de Z.
1557

Probar con traducciones reales desde sprint 1

Las pruebas de i18n con Lorem Ipsum o texto en ingles no revelan los problemas reales. Usar traducciones reales desde el primer sprint, aunque sea con un solo idioma adicional. Los errores de layout, truncamiento, orden RTL y pluralización solo aparecen con texto real. Encontrar estos problemas en sprint 1 cuesta 10x menos que en producción.

smashing magazine · nielsen norman
Preferir
EN
DE
FR
S1
S2
S3
S4
S5
i18n testing runs every sprint, not just at the end
i18n visual regressión: pass
Evitar
EN, fits
DE, tight/clipped
FR, overflows
Translations tested only before launch