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 locale con moment.locale('es'). Es necesario que la definamos antes de que se pinte la gráfica. De ahí que la incluyera en el primer método del ciclo de vida de React: Pero la figura no se entera del cambio de idioma, y sigue mostrando las fechas en el formato por defecto. Sin embargo si, por ejemplo, incluyo el js con las traducciones de las fechas, si que lo tiene en cuenta, import 'moment/locale/es'. Se me ocurre entonces que podría construir dinámicamente la inclusión del fichero con require: Ahora me topo con browserify, el bundler de javascript, que escupe el error siguiente: Uncaught Error: Cannot find module 'moment/locale/es' El problema es debido a que browserify no permite requires dinámicos (issue en GitHub). Una manera de solventarlo es incluyendo los requires en un bloque switch: E invocar setLocale en el constructor. Aunque funcionaba, la solución me parecía fea. Leyendo la documentación de chart.js la opción parser permite pasarle una función que devuelve un objeto de moment. Para que funcione hay que incluir el javascript con todas las traducciones require("moment/min/locales.min");, que pesa más de 300 KiB. Una vez importadas todas las locales, me digo que lo más sencillo es un moment.locale(this.props.userLocale); en el constructor. La aplicación en cuestión solo la usamos dos usuarios, pero aun así 300KiB son muchos kilobytes. Al final he optado por incluir solo los ficheros de los dos idiomas que usa la web, por un total de 10KiB sin minificar.

Publicaciones Similares

  • OsTicket y nginx

    Escenario Después de 5 años campando en un Ubuntu 16.04 ha llegado la hora de migrar la aplicación osTicket a un nuevo servidor. Para quien no la conozca osTicket es un sistema de incidencias que podemos desplegar en un servidor propio. La aplicación web cuenta con una herramienta que automáticamente detecta una diferencia de versiones…

  • Sonata Admin: el calendario no se cierra

    Escenario Incluir un filtro de rango de fechas en SonataAdmin que use un calendario para seleccionar la fecha es más o menos fácil. Primero añadimos el siguiente bloque en el admin de nuestra entidad:

    Y la siguiente clave bajo form_themesen el fichero config/packages/twig.yaml:

    Problema El calendario no se cierra automáticamente cuando se selecciona…

  • Cómo modificar las cabeceras de una petición con nginx

    Escenario Hay que migrar una servicio API a una nueva plataforma. Esto implica rehacer el código desde cero y al mismo tiempo respetar todos los endpoints y aceptar las peticiones de los clientes del API tal y como se estaban mandando hasta ahora. Problema Las peticiones del cliente vienen mal formadas: se estaban mandado usando…

  • Actualización de Mautic 4

    Este artículo va dedicado a aquellos administradores web entre cuyas labores se encuentre el mantenimiento de una instalación Mautic. Por eso no voy a explicar qué es Mautic: si no lo conoces, este artículo carece de interés. Vamos a partir de la base que el usuario UNIX, propietario de la instalación, es mautic y que…

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

Deja una respuesta

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