آی تی نرد

اشتراک اطلاعات و تجربیات در زمینه ی توسعه ی دات نت و البته شیرپوینت

تاریخ و تقویم شمسی برای BlogEngine - Frontend

اصولا می بایست با تغییر فرهنگ(Culture) یک برنامه ی Asp.net که در زمان تغییر زبان برنامه صورت میگیرد، تمام محیط برنامه که از این فرهنگ پشتیبانی میکند به فرهنگ مورد نظر تغییر یابد.

بنابراین برنامه ای مانند بلاگ انجین هم از این قاعده مستثنا نیست، بنابراین با تغییر زبان یا فرهنگ برنامه محیط هم به فرهنگ مورد نظر تغییر خواهد کرد البته به جز تاریخ برنامه که همان میلادی باقی خواهند ماند.

این هم به این دلیل هست که کلاس PersianCalendar ی که مایکروسافت به صورت پیشفرض در دات نت قرار داده دچار مشکل هست یا به هر حال کامل نیست به همین دلیل با فیکس کردن این کلاس و اختصاص آن به فرهنگ fa-ir این مشکل یا ضعف برطرف خواهد شد.

از این رو برای حل مشکل تاریخ و تقویم شمسی در بلاگ انجین به صورت زیر عمل کنید:

ابتدا کلاس PersianCulture رو از انتهای پست دانلود کنید. بعد اون رو به پروژه ی وب و در پوشه ی برای مثال app_code اضافه کنید.

در مرحله ی بعد هم کلاس site.master.cs مربوط به تم مورد نظرتان را باز کرده و دو خط کد زیر رو به قسمت لود صفحه اضافه کنید(این کد چک میکنه که اگر فرهنگ برنامه به فارسی تغییر کرده، فرهنگ به همراه تاریخ اصلاح شده رو با فرهنگ جاری جایگزین میکنه):

      if (System.Threading.Thread.CurrentThread.CurrentCulture.LCID == 1065)
         System.Threading.Thread.CurrentThread.CurrentCulture = new PersianCulture();

بعد از اعمال تغییرات بالا مشاهده خواهید کرد که محیط برنامه و تاریخ آن به شمسی تغییر کرده است.

البته یه مشکلی در ویجت تقویم وجود خواهد داشت که با کلیک برروی روز های آن به آدرس شمسی خواهد رفت که از اونجایی که پست ها با تاریخ میلادی در Url ایجاد میشوند هیچ پستی به نمایش در نخواهد آمد البته این مشکل به سادگی قابل رفع خواهد بود.

وارد فایل PostCalendar در پوشه ی App_Code و سپس Controls بشید و فایل اشاره شده رو باز کرده و متد OnDayRender رو با مقایسه با کد زیر که البته بیشتر تغییرات در قست ToString ها خواهد بود تغییر بدید:

        protected override void OnDayRender(TableCell cell, CalendarDay day)
        {
            if (day.IsToday)
            {
                cell.Attributes["id"] += "today";
            }
            DateTime date = day.Date;
            var list = Post.GetPostsByDate(date, date);
            if (list.Count > 0)
            {
                cell.Controls.Clear();
                if (this.ShowPostTitles)
                {
                    cell.Controls.Add(new LiteralControl(day.DayNumberText));
                    foreach (var a in
                        list.Where(post => post.IsVisible).Select(post => new HtmlAnchor { InnerHtml = string.Format("<br /><br />{0}", post.Title), HRef = post.RelativeOrAbsoluteLink }))
                    {
                        cell.Controls.Add(a);
                    }
                }
                else
                {
                    if (list[0].IsVisible)
                    {
                        var a = new HtmlAnchor
                            {
                                InnerHtml = day.DayNumberText,
                                HRef =
                                    string.Format("{0}{1}/{2}/{3}/default{4}", Utils.RelativeOrAbsoluteWebRoot, date.Year, date.Month.ToString("00"), date.Day.ToString("00"), BlogConfig.FileExtension)
                            };
                        a.Attributes["class"] = "exist";
                        cell.Controls.Add(a);
                    }
                    else
                    {
                        cell.Text = day.DayNumberText;
                    }
                }
            }
            else
            {
                cell.Controls.Clear();
                cell.Text = day.DayNumberText;
            }
        }

بعد از تغییرات بالا آدرس های Url روزهای تقویم هم به تاریخ درست هدایت خواهد شد و پست ها در روز انتخاب شده به نمایش در خواهند آمد.

Download PersianCulture class:
PersianCulture_Class.zip (1,021.00 bytes)

نظرات (8) -

  • مجتبی ولی

    1/30/1393 09:07:13 ق.ظ | پاسخ به این نظر

    سلام.شما چرا پروژه بلاگ انجین را Fork  نمی کنید؟این جوری مشکل یک برای و برای همیشه حل می شه.من خواستم این تغییرات رو بدم اما دیدم صاحبش شما هستید و این کار رو نکردم.

  • مجتبی ولی

    4/8/1393 06:56:56 ب.ظ | پاسخ به این نظر

    این قسمت به سورس اصلی پروژه اضافه شده و توی نسخه بعدی اعمال می شه.من کد رو fork  کردم و درخواست pull  من هم قبول شد.

    • Hamid

      4/13/1393 07:10:58 ب.ظ | پاسخ به این نظر

      بسیار هم خوب. فقط انتظار داشتم حداقل یه لینکی به این مطلب میدادی!

  • صالح باقری

    2/31/1395 01:35:04 ق.ظ | پاسخ به این نظر

    بسیارعالی بابت مطلب خوبتون!
    از بسیاری از لحاظ ها مشکل فارسی شدن تاریخ حل شد الا تاریخهای DateTimePicker‌ ها و کلا مواردی که در قسمت کلاینت توسط Javascript‌ رندر میشن!
    برای این موارد چه راه حلی دارید؟

    • حمید

      7/7/1395 11:13:07 ب.ظ | پاسخ به این نظر

      سلام.
      سمت کلاینت رو باید از پلاگین های زیادی که در این زمینه هست استفاده کنید، که البته فکر کنم این رو خودتون آگاهید ولی روش خاص و راحت تر دیگه ای رو هنوز بهش فکر نکردم.

Loading