|

Traducción de variables en javascript

Escenario

Estoy trabajando en una aplicación multi-lenguaje desarrollada con la plataforma spring boot. Para quien no conozca esta plataforma de desarrollo, spring boot te permite gestionar varios lenguajes gracias a un sistema que utiliza ficheros de tipo propiedades para almacenar las traducciones. Los nombres de estos ficheros han de respetar la siguiente convención, messages_{código ISO del lenguaje}.properties. Así, un fichero para la traducción en castellano se llamaría messages_es.properties, en el que las traducciones se asignarían a un nombre único: y para el inglés, messages_en.properties: Luego estas variables se pueden usar en código java o en plantillas html. En thymeleaf por ejemplo:

Problema

No existe una forma establecida para usar estas traducciones en javascript. En stackoverflow y blogs he visto soluciones en las que se propone incluir un array asociativo con las traducciones que se van a utilizar en el javascript en cuestión. O un controlador que devuelva las traducciones y luego se pinten en la vista para ser utilizadas por el código de javascript. Ninguna de las soluciones me parecían mantenibles. Algunas requerían actualizar las traducciones en dos sitios, otras no gestionaban bien el cambio de lenguaje dinámico.

Solución

La aplicación en cuestión usa un gestor de tareas (grunt) para preparar los archivos estáticos (js, css, etc) que va a usar la parte web. Se me ocurrió que bastaría con traducir la estructura de un fichero de tipo properties en un objecto de javascript y luego referenciarlo desde los ficheros javascript. Gracias a este módulo de nodejs, la conversión de un formato a otro resulta sencillo y rápido. Luego solo tenía que crear un plugin para grunt que genere los ficheros javascript a partir del contenido convertido. Por ejemplo messages_es.properties se convertiría en messages_es.js: Una vez generados se usarían en una plantilla thymleaf de esta manera: Por si alguien le interesa el plugin en cuestión es grunt-messages-js-localization

Publicaciones Similares

  • Tablas con nombre reservado en entidades en Spring Boot

    Escenario Tenemos una aplicación corriendo sobre Spring Boot que usa Hibernate como ORM. Una de las tablas se llama Group, se utiliza para almacenar los distintos grupos a los que puede pertenecer un usuario. Problema La entidad de java que representa la tabla de grupos tiene esta pinta:

    Sabía que group es una palabra…

  • Chart.js: cómo cambiar el idioma (locale) dinámicamente

    Escenario Por un lado una aplicación que permite al usuario personalizar el idioma del sitio. Por otro, una gráfica de tipo línea temporal generada con la biblioteca Chart.js, integrada en un módulo de React con react-chartjs-2. Problema Según un comentario de un usuario de Stackoverflow, basta con un require('moment/min/moment-with-locales'); y establecer el valor de la…

  • Can’t connect to local MySQL server through socket

    Escenario No conseguimos conectarnos al servidor de mysql desde la propia máquina, pero sí remotamente. Cuando el cliente de MySQL se conecta a localhost, lo intenta usando un fichero socket en vez de el protocolo TCP/IP. Una manera pues de solucionar el problema es especificando la IP del host: mysql -uroot -p -h 127.0.0.1 Para solucionarlo de manera permanente,…

  • Hibernate no puede resolver la propiedad…

    Escenario En una aplicación Spring Boot v2.3.4 hay dos entidades Balance y Shop. Una tienda (shop) puede tener varios saldos y un saldo (Balance) ha de estar relacionado con una tienda. Además existen panaderías (Bakery) y sastrerías (TailorShop) que extienden la clase Shop:

    Y necesito saber cuál es la fecha del…

  • Elemento personalizado en menú lateral de SonataAdmin

    Escenario Necesito añadir un enlace a una página personalizada en el menú lateral de Sonata Admin. En concreto uno que, en vez de dirigir a un listado de entidades, abra una página específica. La entidad en cuestión es Acme\Entity\CashOffice. Antes que nada tenemos que crear un CashOfficeAdmin en el cual usaremos el método configureRoutes para…

Deja una respuesta

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