プラグインで、クライアントに追加のロケールファイルを強制的に再読み込みさせるにはどうすればよいですか?

ブラウザ側の I18n オブジェクトにカスタム属性をロードする、カスタムのJSメソッドを作成しました。

この JsLocaleHelper メソッドの再評価を、依存する各クライアントでトリガーしたいと考えています。

サーバー側からこれをトリガーする方法を探しています。

以前は機能していましたが、最近変更されたようです。

ブラウザからローカルクライアントキャッシュを削除するとデータは正しいのですが、これは明らかに本番環境では現実的ではありません。しかし、ローカルキャッシュに問題があることは証明されています。

試したこと:

Discourse.request_refresh!

または、よりターゲットを絞った:

Discourse.request_refresh!(user_ids: user_ids)

これはナビゲーション時に強制的にリフレッシュするようですが、スクリプトがキャッシュされている可能性があり、これは解決策ではありません。

何か助けていただけると幸いです!

「いいね!」 1

この関数は、user_ids パラメータが存在する場合と存在しない場合で、動作が大きく異なることに注意してください。

MessageBus.publish \"/file-change\", [\"refresh\"] を試しましたか?

「いいね!」 3

素晴らしいアイデアです、うまくいきました!ありがとうございます。

しかし、これはスケーラブルですか?

「いいね!」 2

いいえ、そうは思いません :frowning:

「いいね!」 2

それは大いに役立ちますが、さらに調査を続けます。

時間とともに広がるそのような風味を見つけることができれば、うまくいくだろう。

ただし、_正確な_ファイルをターゲットにできれば、もっと良いだろう。

「いいね!」 2

了解しました。まさに板挟みの状況です。

学んだことは以下の通りです。

  1. extra-locales バンドルはスクリプトタグとして追加されます。
  2. それらには、バンドルの名前に依存するバージョンパラメータが含まれています。
  3. バージョン番号はブートストラップ時にのみ評価されると信じています。そのため、以下までキャッシュされたままになります。
  • クライアントに完全にリフレッシュを強制する。これは一括でしかできないようです。
  • サーバーを再起動する
  • またはクライアントがブラウザキャッシュをクリアする

少なくとも、これは残念なことです。より詳細な制御ができないとは。

  • ナビゲーションメッセージで「完全リフレッシュ」を導入することは可能でしょうか?
「いいね!」 2

Discourse.request_refresh! をテストしたところ、次のナビゲーションで全ての JavaScript アセットがリロードされるようです。JsLocaleHelper のリフレッシュがトリガーされないかもしれませんが、その仕組みについては十分な情報がありません。

微妙なことが起こっています。

「200」は実際にはブラウザ側の「200 (cached)」です。

それについての優れたStack Overflowの投稿。

「いいね!」 1

うわー…:scream: ……確認しなかった。

「いいね!」 2

extra-locales に変更を加えた後、ExtraLocalesController.clear_cache! を呼び出してみましたか? 次のリクエスト時にバージョンが再計算されるはずです。

「いいね!」 2

ありがとうございます。はい、あります。それはサーバーサイドのみであり、ブートストラップ中に設定された提供されたJSファイルセットのバージョン番号を変更しないと信じています。サーバーサイドでは問題ありません。

より多くの制御ができるように、このデータをサイトオブジェクトとシリアライザーに移動することを検討しています。

どうやら、あなたが何を達成しようとしているのか理解できていないようです。 :thinking:
クライアントがサーバーに追加したデータを次のリロード時に単純に取得することを想定していました。クライアント側で全てを行いたいのであれば、クライアントで直接 I18n.extras を更新してはどうでしょうか。

「いいね!」 2

はい、その通りです。

レールコンソールからそのコマンドを実行すると、クライアントのスクリプトが無効になるのはどのように処理されるのですか?

(FYI タグはスラッグで使用されるため特殊なケースであり、ルーティングが機能しないため、翻訳を含む特別なオブジェクトを追加する必要があります。)

次回クライアントがページをリロードすると、HTML で異なるハッシュが表示され、新しいスクリプトが読み込まれます。「テキストのカスタマイズ」機能(「overrides」バンドルを使用)は、このように機能します。

<link rel="preload" href="/extra-locales/overrides?v=ecb7809c205de318b2c16d1b51d4b6f6" as="script">
「いいね!」 3

再現できました。

そのため、バニラクライアントサイドのJavaScriptローカライゼーションの話ではないため、オーバーライドは使用していません。

何らかの理由で、カスタムJsLocaleHelperファイルの現在の使用法が、そのバージョン番号更新システムにフックされません。

しかし、それは非常に役立ちます、Gerhard、サーバーがそのバージョン番号を更新させる方法を研究できるからです。

オーバーライドファイルは任意であることにも注目しました。興味深いですね!

「いいね!」 1

@gerhard 非常に役立ちました、ありがとうございます。

問題は解決しました。カスタムJSファイルの内容に基づいてバージョン番号を設定する必要がありました。これで開発環境で動作するようになりました :rocket:

「いいね!」 4

この会話の全結果は、このPRに暗黙的に示されています: FIX: Tag caching fixes by merefield · Pull Request #52 · paviliondev/discourse-multilingual · GitHub

「いいね!」 4