En un plugin, ¿cómo puedo forzar a los clientes a volver a cargar el archivo extra-locales?

Hemos creado un método JS personalizado para un trabajo de localización personalizado que carga el objeto I18n del lado del navegador con un atributo personalizado.

Quiero activar una reevaluación de este método JsLocaleHelper en cada uno de los clientes dependientes.

Estoy intentando encontrar una manera de activar esto desde el lado del servidor.

Esto solía funcionar, pero parece haber cambiado recientemente.

Los datos son correctos cuando elimino la caché local del cliente del navegador, pero obviamente esto no es viable para uso en producción. Demuestra que el problema es el almacenamiento en caché local.

Las cosas que he intentado incluyen:

 Discourse.request_refresh!

o el más específico:

Discourse.request_refresh!(user_ids: user_ids)

que parece forzar la actualización al navegar. Sin embargo, sospecho que el script se está almacenando en caché, por lo que esta no es una solución.

¡Cualquier ayuda es apreciada!

1 me gusta

Ten en cuenta que esta función se comporta de manera muy diferente cuando el parámetro user_ids está presente y cuando no lo está.

¿Probaste MessageBus.publish \"/file-change\", [\"refresh\"]?

3 Me gusta

¡Excelente idea, funciona! Gracias

Pero, ¿es escalable?

2 Me gusta

No, no creo :frowning:

2 Me gusta

Eso ayuda mucho, aunque seguiré investigando.

Si puedo encontrar una variante de eso que se propague con el tiempo, podríamos estar listos.

Aunque sería mejor apuntar al archivo exacto.

2 Me gusta

OK, así que estoy entre la espada y la pared aquí.

Esto es lo que he aprendido:

  1. Los paquetes extra-locales se añaden como etiquetas de script.
  2. Contienen un parámetro de versión que depende del nombre del paquete.
  3. Creo que el número de versión solo se evalúa al arrancar, por lo que permanecerá en caché hasta que:
  • fuerces a los clientes a refrescar completamente, lo que aparentemente solo puede ocurrir en masa.
  • reinicies el servidor.
  • o un cliente borre la caché de su navegador.

Esto es desafortunado, por decir lo menos, que no haya un control más granular.

  • ¿Podríamos introducir una “actualización total” en el mensaje de navegación?
2 Me gusta

Acabo de probar Discourse.request_refresh! y parece que está recargando todos los activos de javascript en la próxima navegación. Puede que no esté activando una actualización de JsLocaleHelper, no estoy suficientemente informado sobre cómo funciona eso.

Hay algo sutil sucediendo.

el “200” es en realidad “200 (caché)” que está del lado del navegador.

Buena publicación en Stack Overflow al respecto.

1 me gusta

Argh…:scream: … no revisé eso.

2 Me gusta

¿Intentaste llamar a ExtraLocalesController.clear_cache! después de realizar cambios en extra-locales? Debería recalcular la versión durante la próxima solicitud.

2 Me gusta

Gracias. Sí, lo he hecho. Creo que eso es solo del lado del servidor y no cambia el número de versión en el archivo JS proporcionado configurado durante el arranque. Del lado del servidor, no hay ningún problema.

Estoy considerando mover estos datos al objeto del sitio y al serializador para ver si puedo tener más control.

Bueno, supongo que no entiendo qué intentas lograr. :thinking:
Asumí que querías que el cliente simplemente recogiera los datos que agregaste en el servidor en la próxima recarga. Si quieres hacer todo en el cliente, ¿por qué no actualizar I18n.extras directamente en el cliente?

2 Me gusta

Sí, exactamente eso.

Si ejecuto ese comando desde la consola de Rails, ¿cómo invalida los scripts en el cliente?

(Para tu información, las etiquetas son un caso especial ya que se usan en las rutas, por lo que tengo que agregar un objeto especial para incluir traducciones, no puedo serializar una traducción de etiqueta en todas partes ya que las rutas no funcionarían).

La próxima vez que el cliente recargue la página, verá un hash diferente en el HTML y cargará el nuevo script. Así es como funciona la función “Personalizar texto” (utiliza el paquete “overrides”).

<link rel="preload" href="/extra-locales/overrides?v=ecb7809c205de318b2c16d1b51d4b6f6" as="script">
3 Me gusta

Puedo reproducir eso.

Por lo tanto, no estoy utilizando anulaciones para esto, ya que no estamos hablando de la localización de JavaScript del lado del cliente normal.

Por alguna razón, el uso actual de nuestro archivo JsLocaleHelper personalizado no se integra en ese sistema de actualización del número de versión.

Pero eso es extremadamente útil, gracias Gerhard, ya que podré estudiar cómo el servidor provoca la actualización de ese número de versión.

También observo que el archivo de anulaciones es discrecional, ¡interesante!

1 me gusta

@gerhard fue extremadamente útil, gracias.

Problema resuelto. Simplemente tuve que asegurarme de que el número de versión se basara en el contenido del archivo js personalizado. Ahora lo tengo funcionando en desarrollo :rocket:

4 Me gusta

Los resultados completos de esta conversación están implícitos en esta PR: FIX: Tag caching fixes by merefield · Pull Request #52 · paviliondev/discourse-multilingual · GitHub

4 Me gusta