Internacionalización más fácil (Parte 1 de 3)
2024-07-06
Una parte muy importante al hacer un sitio o app accesible es soportar múltiples lenguajes.
Hay muchas herramientas para manejar internacionalización (o i18n
-
una "i" seguida de 18 letras seguido de una "n"):
Rails tiene el módulo I18n
,
Phoenix usa gettext
,
en Heroic usamos
el paquete i18next
y el módulo Intl
,
y otros frameworks proveen más soluciones.
Pero esta serie de artículos no se va a enfocar en esas herramientas... Todas estas herramientas proveen métodos y funciones para traducir y localizar text, pero hay mucho más que traducir palabras cuando se trabaja con múltiples lenguajes
Durante esta serie, voy a usar ejemplo del código de Heroic pero casi todas las ideas se pueden usar en cualquier otra aplicación.
Dirección del Texto
No todos los lenguajes se escriben de izquierda a derecha, hay otros lenguajes como Hebreo, Árabe, o Persa, que se escriben en la dirección opuesta. También hay otros lenguajes como Chino Tradicional, Japonés Tradicional, o Koreano, que se escriben verticalmente!
Pero esperá! hay más! Algunos escritos antiguos usaban el estilo Bustrofedon: alternaba cada línea empezando de izquierda a derecha, la siguiente línea de derecha a izquierda (incluso las letras estaban espejadas), luego otra vez de izquierda a derecha, y así hasta el final.
Pero no te preocupes! Las chances de que un Etrusco use tu aplicación es probablemente cero.
La Propiedad direction
de CSS
El valor inicial de
esta propiedad
es ltr
(de "left to right"), por eso normalmente no pensamos en esto programando un sitio en español o inglés,
pero también suporta el valor rtl
(de "right to left") que impactan en cómo el navegador renderiza algunos elementos.
- elementos
p
se alinean a la derecha -
elementos con
display: grid
odisplay: flex
renderizan los hijos empezando desde la derecha y en orden "inverso", mientras que elementos condisplay: block
no se ven afectados! - el elemento
label
también renderiza los hijos con en orden inverso
by Ariel Juod (@arieljuod) on CodePen.
See the Pen LTR vs RTL direction
La lista podría seguir y seguir, pero lo importante es saber que la mayoría de los elementos HTML ya soportan
renderizar el contenido con la dirección correcta cuando direction
está definido, y que en muchos casos es
mejor usar flex
en lugar de block
si sabemos que el contenido se va a traducir.
Lo que me gusta hacer a mí es:
-
Si el lenguaje usado es RTL, agrego una clase
isRTL
al elementobody
(o cualquier elemento raíz como#root
en React) -
Agrego este CSS:
body.isRTL { direction: rtl; }
Y listo! Mucho de nuestro contenido va a ser más user-friendly (aunque aún lejos de ser perfecto).
Esto también nos da un selector CSS claro para personalizar elementos que no cambian automáticamente.
Estos son unos ejemplos de código de Heroic:
El Atributo dir
de HTML
El
atributo dir
es similar a la propiedad direction
de CSS cuando se usan los valores ltr
o rtl
(aunque no es exactamente igual,
hay más detalles en el link a la documentación de MDN sobre esto).
Pero hay un tercer valor posible: auto
. Este valor le dice al navegador que infiera la dirección basado en el contenido
del elemento! Entonces, si el contenido tiene (por ejemplo) un carácter en Árabe, el navegador va a considerar
que el elemento se tiene que renderizar de derecha a izquierda.
Y los Lenguajes que se Escriben en Vertical?
No tengo experiencia manejando estos casos, pero sabés qué? CSS también puede hacer eso!
Hay otra propiedad CSS llamada
writing-mode
que puede manejar las diferentes combinaciones.
Cuando se usan estos lenguajes, el layout de la página cambia mucho más que mover los elementos de la izquierda a la derecha. En estos casos seguramente se necesiten más cambios que sólo cambiar algo de CSS.
Si realmente necesitás soportar estos lenguajes, recomiendo este artículo que explica muchos de los desafíos.
Qué sigue?
Para lenguajes RTL, la expectativa no es sólo que el texto se escriba de derecha a izquierda, el layout también se tiene que espejar! Por ejemplo: Heroic tiene una barra lateral en el lado izquierdo, pero, cuando se usa un lenguaje RTL, esta se renderiza en el lado derecho de interface.
En el próximo artículo voy a hablar un poco sobre cómo manejar los cambios del layout y cómo usar las propiedades lógicas de CSS.