"""تبدیل تاریخ میلادی به شمسی برای نمایش تاریخ انتشار مقاله — بدون وابستگی به پکیج خارجی (همان الگوریتم استاندارد تبدیل جلالی).""" _PERSIAN_MONTHS = [ "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ] _PERSIAN_DIGITS = str.maketrans("0123456789", "۰۱۲۳۴۵۶۷۸۹") def gregorian_to_jalali(date) -> tuple[int, int, int]: gy, gm, gd = date.year, date.month, date.day g_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] gy2 = gy - 1600 gm2 = gm - 1 gd2 = gd - 1 g_day_no = 365 * gy2 + (gy2 + 3) // 4 - (gy2 + 99) // 100 + (gy2 + 399) // 400 for i in range(gm2): g_day_no += g_days_in_month[i] if gm2 > 1 and ((gy % 4 == 0 and gy % 100 != 0) or gy % 400 == 0): g_day_no += 1 g_day_no += gd2 j_day_no = g_day_no - 79 j_np = j_day_no // 12053 j_day_no %= 12053 jy = 979 + 33 * j_np + 4 * (j_day_no // 1461) j_day_no %= 1461 if j_day_no >= 366: jy += (j_day_no - 1) // 365 j_day_no = (j_day_no - 1) % 365 j_days_in_month = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29] jm = 0 for i, days in enumerate(j_days_in_month): if j_day_no < days: jm = i break j_day_no -= days else: jm = 11 jd = j_day_no + 1 return jy, jm + 1, jd def format_jalali(date) -> str: jy, jm, jd = gregorian_to_jalali(date) text = f"{jd} {_PERSIAN_MONTHS[jm - 1]} {jy}" return text.translate(_PERSIAN_DIGITS)