Converter to change gregorian date to jalali on view layer of discourse

こんにちは。

これは実際には簡単なプロセスです。


ステップバイステップ:Discourse フロントエンドでシャムスィー日付を有効にする

1) テーマコンポーネントの作成

  1. 管理者 → カスタマイズ → テーマ に移動します。

  2. コンポーネント をクリックします。

  3. 追加 → 新規作成 をクリックします。

  4. 名前を付けます: Shamsi Date Converter (または好きな名前)


2) スクリプトの追加(Headセクション)

コンポーネント内で:

  1. 共通 → Head を開きます。

  2. 以下すべて を貼り付けます。

  3. 保存します。

コード:

<script>
(function () {
  // サイトの言語がペルシア語の場合にのみ適用
  if (!document.documentElement.lang.startsWith("fa")) return;

  const formatter = new Intl.DateTimeFormat(
    "fa-IR-u-ca-persian",
    { dateStyle: "medium" }
  );

  function toDate(value) {
    if (!value) return null;

    // エポック(秒またはミリ秒)
    if (/^\\d{10,13}$/.test(value)) {
      const n = Number(value);
      return new Date(value.length === 10 ? n * 1000 : n);
    }

    const d = new Date(value);
    return isNaN(d) ? null : d;
  }

  function process(el) {
    if (el.dataset.shamsi === "1") return;

    const date =
      toDate(el.getAttribute("datetime")) ||
      toDate(el.dataset.time) ||
      toDate(el.getAttribute("title"));

    if (!date) return;

    el.textContent = formatter.format(date);
    el.dataset.shamsi = "1";
  }

  function run(root = document) {
    root.querySelectorAll("time, .relative-date").forEach(process);
  }

  // 初期ロード
  run();

  // 無限スクロール/ライブ更新を処理
  new MutationObserver(muts => {
    muts.forEach(m => m.addedNodes.forEach(n => {
      if (n.nodeType === 1) run(n);
    }));
  }).observe(document.documentElement, { childList: true, subtree: true });
})();
</script>
___

または、エクスポートしたものをアップロードし、テーマに割り当てることもできます。

discourse-shamsi-date.zip (1.1 KB)


仕組み

Discourse はすでに通常のグレゴリオ暦の日付をブラウザに送信しています。このスクリプトはデータを変更するのではなく、ブラウザ自体を使用して日付のテキスト表示をシャムスィー(ジャラリ)に変換して置き換えるだけです。

スクリプトの機能(概要)

  1. <time> 要素を見つけます。

  2. datetime から実際の日付(グレゴリオ暦)を読み取ります。

  3. シャムスィーに変換します。

  4. 表示されているテキストのみ を置き換えます。

  5. 新しい投稿が読み込まれるたびにこれを繰り返します。

それだけです。他には何もありません。


これにより、次のような日付が表示されます。

当社のインスタンスでオンラインで確認できます: https://forums.7ho.st

幸運を祈ります

「いいね!」 1