How to set default calendar CultureInfo?

I want to set the calendar to Persian, but after installing CultureInfo like this:

CultureInfo fa = new CultureInfo("fa-IR",true); Thread.CurrentThread.CurrentCulture = fa; 

calendar

the name of the month and days does not change, so it was decided to override the default calendar.

How can i do this?

+4
source share
3 answers

You can subclass CultureInfo . Its property will not be read-only, and you can assign it to it.

+3
source

redefinition 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

+6
source

You can set the CultureInfo stream until the control is rendered and restored after the control is rendered.

Output:

enter image description here

The following is an example of how you can display two different calendars with different CultureInfo values.

Default.aspx

 <%@Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Import Namespace="System.Globalization" %> <%@ Import Namespace="System.Threading" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <% Thread.CurrentThread.CurrentCulture = new CultureInfo("fa-IR");%> <asp:Calendar ID="Calendar1" runat="server"> </asp:Calendar> <% Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); %> <asp:Calendar ID="Calendar2" runat="server"></asp:Calendar> </div> </form> </body> </html> 

Default.aspx.cs

 using System; using System.Threading; using System.Globalization; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } } 
+2
source

All Articles