I have a question about making plugins for discourse.
Iran calendar is Solar hijri or jalali, I want to make a converter to change gregorian date to jalali on view layer of discourse (without changing database).
wordpress has a plugin that convert all dates on website to jalali.
I want to do exact same thing and globally override the date method on view layer and display jalali date if forum language is persian.
How can I do this without changing discourse core codes and database ?
I’ve looked at a few sites here that I thought might be using different calendars.
A Chinese site is using English and Gregorian dates.
Hebrew sites look to be using Hebrew month names with Gregorian years.
I’m guessing this hasn’t come up before because much of the world uses Gregorian / countries with alternate calendar systems also understand Gregorian?
I know the database has a great many timestamp fields, I wouldn’t mess with those.
Sorry, but I am completely ignorant about converting one calendar to another.
Do you know of any Gems that do this?
You are right, a lot of countries use gregorian dates. But most people (I guess +99%) of people in Iran use jalali calendar.
I found this gem called parsi date but I’m not familiar with ruby language and I don’t know how to use it.
as I said before, I don’t want to change discourse’s core or database. just changing the dates on view layer would be great.
ps : jalali date is not just about month names. years and month length are different too.
for example :
29
Apr
2017
all the post information exists there! if you search for “2017” you’ll find some dates there, and you can then use some third party calendars and change between the two.
so far we’ve used this simple way a lot. it’ll work for short-time until you learn ruby+discourse!
So not try to change the source code.
You just need a javascript to select the date element at your page and change it and add it to your page.
I think Topic controller is making this for you but for changing this you need to know some Ruby.
I suggest you to create a very simple plugin and change the date by selecting elements completely in javascript
Étape par étape : activer les dates Shamsi sur l’interface Discourse
1) Créer un composant de thème
Allez dans Admin → Personnaliser → Thèmes
Cliquez sur Composants
Cliquez sur Ajouter → Créer nouveau
Nommez-le : Convertisseur de date Shamsi (Ou ce que vous voulez)
2) Ajouter le script (section Tête)
À l’intérieur du composant :
Ouvrez Commun → Tête
Collez tout ce qui suit
Enregistrez
Code :
<script>
(function () {
// Appliquer uniquement lorsque la langue du site est le persan
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;
// epoch (secondes ou ms)
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);
}
// chargement initial
run();
// gérer le défilement infini / les mises à jour en direct
new MutationObserver(muts => {
muts.forEach(m => m.addedNodes.forEach(n => {
if (n.nodeType === 1) run(n);
}));
}).observe(document.documentElement, { childList: true, subtree: true });
})();
</script>
___
Alternativement, vous pouvez télécharger ce que j’ai exporté et l’attribuer à vos thèmes.
Discourse envoie déjà des dates grégoriennes normales à votre navigateur ; ce script ne modifie pas les données, il remplace seulement la façon dont le texte de la date est affiché sur la page, en le convertissant en Shamsi (Jalali) en utilisant le navigateur lui-même.
Ce que fait le script (vue d’ensemble)
Trouve ces éléments <time>
Lit la vraie date grégorienne à partir de datetime
La convertit en Shamsi
Remplace uniquement le texte visible
Répète cette opération chaque fois que de nouveaux messages sont chargés