|

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

  • 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…

  • Valor por defecto en un combo de una plantilla de Thymeleaf

    Escenario En Thymleaf podemos usar el atributo th:field para enlazar la vista con el modelo:

    En caso de que hubiéramos cargado estos datos del servidor, nuestro select tendría esta pinta:

    Problema ¿Qué pasa si queremos seleccionar una divisa por defecto? En el caso de que fuera el euro tendríamos que hacer algo así,…

  • Instalación y configuración de Guacamole 1.3

    Escenario Necesitamos acceder de manera remota a nuestro entorno de trabajo y hemos decidido que guacamole es nuestra mejor opción. Permite el uso de protocoles estándares como VNC, RDP y SSH No requiere instalar software en las máquinas de los usuarios. Gracias a HTML5, una vez instalado en un servidor, puedes acceder a tu escritorio…

  • TemplateInputException

    Escenario Lo habré hecho centenares de veces. Desarrollo en local, pruebas y despliegue en remoto. Según el entorno en el que esté corriendo la aplicación, ésta podrá requerir una configuración distinta. Por ejemplo en un entorno de desarrollo querremos tener el caché deshabilitado o el nivel de los registros más bajo que en uno de…

  • Partición adicional en disco con tabla MBR

    Escenario Tengo un disco de 4TB que usa una tabla de particiones MBR. Hay una partición de 2TB ya creada y necesito crear otra en el espacio disponible. Problema Según parted para crear la nueva partición por el siguiente problema: Error: starting sector number, 4294967296 exceeds the msdos-partition-table-imposed maximum of 4294967295 [plain]marcos@technoage:~$ sudo parted /dev/sdb…

Deja una respuesta

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