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

Thank you :slight_smile:

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 ?

2 个赞

Any help ? :worried:

1 个赞

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?

1 个赞

Thank you for your response.

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

to jalali :
09
اردیبهشت ( ordibehesht )
1396

Maybe you can do that with a simple js script JalaliJSCalendar

6 个赞

are you looking for a date-convertor or do you want to know how to change the dates in discourse in a plugin without knowing ruby?

if you want the second one, a simple-stupid way is to change it in the front-end side using js, with the data in json pages. e.g. check this page:

https://meta.discourse.org/t/converter-to-change-gregorian-date-to-jalali-on-view-layer-of-discourse/61671.json

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!

4 个赞

@Trash Thank you, I know how to convert dates to jalali. I did this in PHP before. I just don’t know how to do it in Ruby on Rails Project.

@Pad_Pors Thanks, I want to do the second one.
Which .rb file generates this json file ?
Converter to change gregorian date to jalali on view layer of discourse

1 个赞

you don’t need to generate the json files, it already exists and you only need to use it.

@Alavi1412 can help you better about this.

1 个赞

@Pad_Pors
I’m not trying to generate json file. I want to change date before sending to client.

2 个赞

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

Hi
Is it possible for anyone to write a date conversion plugin written by Jalali?
We need such a plugin.
If anyone can guide, thank you.

您好,

这实际上是一个简单的过程。


步骤:在 Discourse 前端启用 Shamsi 日期

1) 创建主题组件

  1. 前往 Admin → Customize → Themes
  2. 点击 Components
  3. 点击 Add → Create new
  4. 命名为:Shamsi Date Converter (或者您想要的任何名称)

2) 添加脚本(头部部分)

在组件内部:

  1. 打开 Common → 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;

    // epoch (秒或毫秒)
    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 已经向您的浏览器发送正常的公历日期;此脚本不会更改数据,它仅通过浏览器本身将日期文本的显示方式转换为 Shamsi(Jalali)。

脚本的作用(高层级)

  1. 查找那些 time 元素
  2. datetime 读取真实的公历日期
  3. 转换为 Shamsi
  4. 仅替换可见文本
  5. 每当加载新帖子时重复此操作

就这样。仅此而已。


这将使您看到如下日期:

您可以在我们的实例上在线查看:https://forums.7ho.st

祝您好运

1 个赞