I want to customize calendar to persian but after setting CultureInfo as this:
CultureInfo fa = new CultureInfo("fa-IR",true);
Thread.CurrentThread.CurrentCulture = fa;

name of month and days don't changed so decided to override default calendar.
How can I do that?
overriding for beginners like me:
public class PersianCulture : CultureInfo
{
    private readonly System.Globalization.Calendar cal;
    private readonly System.Globalization.Calendar[] optionals;
    public PersianCulture()
        : this("fa-IR", true)
    {
    }
    public PersianCulture(string cultureName, bool useUserOverride)
        : base(cultureName, useUserOverride)
    {
        cal = base.OptionalCalendars[0];
        var optionalCalendars = new List<System.Globalization.Calendar>();
        optionalCalendars.AddRange(base.OptionalCalendars);
        optionalCalendars.Insert(0, new PersianCalendar());
        Type formatType = typeof(DateTimeFormatInfo);
        Type calendarType = typeof(System.Globalization.Calendar);
        PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
        FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars",BindingFlags.Instance | BindingFlags.NonPublic);
        var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];
        for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
            newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);
        optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);
        optionals = optionalCalendars.ToArray();
        cal = optionals[0];
        DateTimeFormat.Calendar = optionals[0];
        DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
        DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
        DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
        DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
        DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
        DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
        DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
        DateTimeFormat.AMDesignator = "ق.ظ";
        DateTimeFormat.PMDesignator = "ب.ظ";
    }
    public override System.Globalization.Calendar Calendar
    {
        get { return cal; }
    }
    public override System.Globalization.Calendar[] OptionalCalendars
    {
        get { return optionals; }
    }
}
then in Page_Load:
PersianCulture fa = new PersianCulture();
Thread.CurrentThread.CurrentCulture = fa;
form here
You can create a subclass of CultureInfo. The property of it will not be read-only and you can assign to it..
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With