如何自定义CultureInfo的默认日历?

我想将日历定制为波斯语,但在将CultureInfo设置为:

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

日历

月份和日期的名称不会更改,因此决定覆盖默认日历。

我怎样才能做到这一点?

您可以创建CultureInfo的子类。 它的属性不是只读的,您可以分配给它..

像我这样的初学者压倒一切:

 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(); 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; } } } 

然后在Page_Load

 PersianCulture fa = new PersianCulture(); Thread.CurrentThread.CurrentCulture = fa; 

在这里形成

您可以在呈现控件之前设置线程的CultureInfo,并在呈现控件后恢复。

输出:

在此处输入图像描述

下面的示例显示了如何使用不同的CultureInfo呈现两个不同的日历。

Default.aspx的

 <%@Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Import Namespace="System.Globalization" %> <%@ Import Namespace="System.Threading" %>       
<% Thread.CurrentThread.CurrentCulture = new CultureInfo("fa-IR");%> <% Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); %>

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) { } }