In un plugin, come posso forzare i client a ricaricare il file extra-locales?

Abbiamo creato un metodo JS personalizzato per alcuni lavori di localizzazione personalizzati che carica l’oggetto I18n lato browser con un attributo personalizzato.

Voglio attivare una rivalutazione di questo metodo JsLocaleHelper su ciascuno dei client dipendenti.

Sto cercando un modo per attivarlo dal lato server.

Questo funzionava ma sembra essere cambiato di recente.

I dati sono corretti quando elimino la cache locale del client dal browser, ma ovviamente questo non è sostenibile per l’uso in produzione. Dimostra però che il problema è la cache locale.

Tra le cose che ho provato ci sono:

 Discourse.request_refresh!

o il più mirato:

Discourse.request_refresh!(user_ids: user_ids)

che sembra forzare il refresh alla navigazione. Tuttavia, sospetto che lo script venga memorizzato nella cache, quindi questa non è una soluzione.

Qualsiasi aiuto è apprezzato!

1 Mi Piace

Nota che questa funzione si comporta in modo molto diverso quando il parametro user_ids è presente e quando non lo è.

Hai provato MessageBus.publish \"/file-change\", [\"refresh\"]?

3 Mi Piace

Ottima idea, funziona! Grazie

Ma è scalabile?

2 Mi Piace

No, non credo :frowning:

2 Mi Piace

Questo aiuta molto, anche se continuerò a scavare.

Se riesco a trovare un tipo di diffusione nel tempo, potremmo essere a posto.

Anche se sarebbe meglio puntare al file esatto.

2 Mi Piace

OK, quindi tra l’incudine e il martello qui.

Ecco cosa ho imparato:

  1. I bundle extra-locales vengono aggiunti come tag script.
  2. Contengono un parametro di versione che dipende dal nome del bundle
  3. Il numero di versione viene valutato solo all’avvio, credo, quindi rimarrà memorizzato nella cache fino a quando:
  • non si forza i client a eseguire un aggiornamento completo, che apparentemente può avvenire solo in massa?
  • non si riavvia il server
  • o un client non cancella la cache del browser

Questo è sfortunato, per non dire altro, che non ci sia un controllo più granulare.

  • Potremmo introdurre un “aggiornamento totale” sul messaggio di navigazione?
2 Mi Piace

Ho appena testato Discourse.request_refresh! e sembra che stia ricaricando tutte le risorse javascript alla prossima navigazione. Potrebbe non attivare un aggiornamento di JsLocaleHelper, non sono sufficientemente informato su come funzioni.

C’è una cosa sottile che sta succedendo.

Il “200” è in realtà “200 (cached)” che è lato browser.

Buon post su Stack Overflow a riguardo.

1 Mi Piace

Argh…:scream: … non l’ho controllato.

2 Mi Piace

Hai provato a chiamare ExtraLocalesController.clear_cache! dopo aver apportato modifiche a extra-locales? Dovrebbe ricalcolare la versione durante la richiesta successiva.

2 Mi Piace

Grazie. Sì, l’ho fatto. Credo che sia solo lato server e non cambi il numero di versione sul file JS fornito impostato durante il bootstrap. Lato server non c’è problema.

Sto pensando di spostare questi dati nell’oggetto del sito e nel serializzatore per vedere se riesco ad avere più controllo.

Beh, immagino di non capire cosa stai cercando di realizzare. :thinking:
Presumevo volessi che il client semplicemente prelevasse i dati che hai aggiunto sul server al prossimo ricaricamento. Se vuoi fare tutto sul client, perché non aggiornare I18n.extras direttamente sul client.

2 Mi Piace

Sì, esattamente questo.

Se eseguo quel comando dalla console di Rails, come invalida gli script sul client?

(A titolo informativo, i tag sono un caso speciale poiché vengono utilizzati negli slug, quindi devo aggiungere un oggetto speciale per includere le traduzioni, non posso serializzare una traduzione di tag ovunque poiché le route non funzionerebbero).

La prossima volta che il client ricaricherà la pagina, vedrà un hash diverso nell’HTML e caricherà il nuovo script. È così che funziona la funzionalità “Personalizza testo” (utilizza il bundle “override”).

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

Sono in grado di riprodurlo.

Quindi non sto usando le sovrascritture per questo, poiché non stiamo parlando della localizzazione JS lato client vanilla.

Per qualche motivo, l’uso attuale del nostro file personalizzato JsLocaleHelper non si aggancia a quel sistema di aggiornamento del numero di versione.

Ma questo è estremamente utile, grazie Gerhard, poiché potrò studiare come il server causa l’aggiornamento di quel numero di versione.

Noto anche che il file delle sovrascritture è discrezionale, interessante!

1 Mi Piace

@gerhard è stato estremamente utile, grazie.

Problema risolto. Ho semplicemente dovuto assicurarmi che il numero di versione fosse basato sul contenuto del file js personalizzato. Ora funziona in dev :rocket:

4 Mi Piace

I risultati completi di questa conversazione sono impliciti in questa PR: FIX: Tag caching fixes by merefield · Pull Request #52 · paviliondev/discourse-multilingual · GitHub

4 Mi Piace