こんにちは。
これは実際には簡単なプロセスです。
ステップバイステップ:Discourse フロントエンドでシャムスィー日付を有効にする
1) テーマコンポーネントの作成
-
管理者 → カスタマイズ → テーマ に移動します。
-
コンポーネント をクリックします。
-
追加 → 新規作成 をクリックします。
-
名前を付けます: Shamsi Date Converter (または好きな名前)
2) スクリプトの追加(Headセクション)
コンポーネント内で:
-
共通 → Head を開きます。
-
以下すべて を貼り付けます。
-
保存します。
コード:
<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 はすでに通常のグレゴリオ暦の日付をブラウザに送信しています。このスクリプトはデータを変更するのではなく、ブラウザ自体を使用して日付のテキスト表示をシャムスィー(ジャラリ)に変換して置き換えるだけです。
スクリプトの機能(概要)
-
<time>要素を見つけます。 -
datetimeから実際の日付(グレゴリオ暦)を読み取ります。 -
シャムスィーに変換します。
-
表示されているテキストのみ を置き換えます。
-
新しい投稿が読み込まれるたびにこれを繰り返します。
それだけです。他には何もありません。
これにより、次のような日付が表示されます。
当社のインスタンスでオンラインで確認できます: https://forums.7ho.st
幸運を祈ります
