Ir al contenido principal

ArtinTech Solution

A Multilingual, Right-to-Left Newspaper Reader in Laravel

Una gran parte de los periódicos que quieren un e-paper publican en bengalí, hindi, urdu o árabe. Sus lectores no deberían encontrar una barra en inglés sobre una portada en bengalí. Para Inkfold 1.1 tradujimos todo el sitio de lectura al bengalí, hindi y árabe, incluido el diseño de derecha a izquierda, mientras la redacción sigue en inglés para el equipo que la gestiona.

Todo el texto visible por una sola función

El primer paso fue el menos vistoso: todo el texto del sitio público pasa ahora por __() de Laravel, los plurales por trans_choice() y las fechas por translatedFormat() de Carbon, de modo que «Monday, 26 October» se convierte en «সোমবার, 26 অক্টোবর» sin plantillas separadas. Las traducciones viven en archivos JSON sencillos, uno por idioma, con la frase en inglés como clave. Añadir francés o urdu más adelante es copiar un archivo y traducir los valores.

Elegir el idioma

Un pequeño middleware elige el idioma de cada petición en este orden: la elección explícita del visitante guardada en la sesión, el idioma guardado en la cuenta del lector que ha iniciado sesión, la cabecera Accept-Language del navegador cuando se ofrece más de un idioma y, por último, el idioma por defecto. Las peticiones a la redacción se saltan el middleware. El editor decide en los ajustes qué idiomas se ofrecen.

Ajustes de idioma en la redacción de Inkfold con inglés, bengalí, hindi y árabe
La redacción elige los idiomas ofrecidos y el predeterminado.

De derecha a izquierda sin reflejar el periódico

Cada idioma lleva su dirección en la configuración y la plantilla la escribe en el atributo dir de la página. La mayor parte de la interfaz se adapta sola. Un bloque de reglas RTL se ocupa del resto: los paneles laterales cambian de lado, las flechas de anterior y siguiente se invierten y la marca «continúa en» de la ventana de noticia pasa al otro lado.

Hay algo que a propósito no se invierte: las páginas. Un periódico en bengalí o en inglés se imprimió de izquierda a derecha, y el orden de páginas y la posición de las noticias deben seguir como se imprimieron aunque la interfaz se lea de derecha a izquierda. El contenedor de páginas mantiene direction: ltr, así que las coordenadas de cada noticia clicable siguen siendo correctas.

El lector de Inkfold con la interfaz en árabe de derecha a izquierda
Interfaz en árabe, páginas impresas sin cambios.

Fuentes solo para el idioma activo

El bengalí, el devanagari y el árabe necesitan sus propias fuentes. Cargarlas todas para cada visitante añadiría peso sin beneficio, así que la plantilla solo pide la fuente Noto del idioma activo y la añade a la pila tipográfica mediante variables CSS.

Una prueba que falla si falta una traducción

Las traducciones se degradan en silencio: alguien añade un botón y olvida los archivos JSON. Ahora una prueba recorre las plantillas del sitio de lectura en busca de textos traducibles y falla si algún archivo de idioma no los tiene. Encontró una sorpresa: una clave llamada «Pagination», en un sistema de archivos que no distingue mayúsculas, se resolvía con el propio pagination.php de Laravel y devolvía un array. Evita claves que coincidan con el nombre de un archivo de traducción.

Ideas clave

  • Pasar todo el texto público por __() y guardar traducciones en JSON con la frase original como clave.
  • Resolver el idioma por sesión, cuenta, navegador y valor por defecto, en ese orden.
  • Poner dir en el documento y escribir reglas RTL concretas, manteniendo el contenido impreso en su dirección.
  • Cargar fuentes de escrituras especiales solo para el idioma activo y probar que no falten textos.

Antes en la serie: lectura sin conexión con un service worker. Cambia de idioma en la cabecera de la demo de Inkfold; el software está en Charming Theme.

¿Necesitas un sitio Laravel o WordPress en bengalí, árabe o varios idiomas a la vez? Hablemos — ArtinTech Solution crea sitios multilingües cada semana.

Share this article

Deja una respuesta

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