2013-04-04 49 views
4

我想自定义日历波斯但设置的CultureInfo,因为这之后:本月如何自定义CultureInfo的默认日历?

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

calendar

名称,几天不更改,因此决定来覆盖默认日历。

我该怎么做?

+0

你的申请是什么? Winforms,WPF,ASP.Net?这个日历控件是什么? – ken2k 2013-04-04 17:15:31

+0

我用'asp:Calendar'使用ASP.NET 4 – 2013-04-04 17:19:57

回答

3

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

2

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

输出:

enter image description here

下面的例子展示的如何可以呈现不同的CultureInfo两个不同的日历。

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

    } 
} 
+0

在'PageLoad'或你说的地方使用这段代码有什么区别? – 2013-04-04 17:46:31

+0

不,页面加载完全一样,我没有改变任何东西 – 2013-04-04 17:47:12

+0

@majidgeek - 更新! – 2013-04-04 18:55:27

6

压倒一切的初学者和我一样:

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

    } 
} 

然后在Page_Load

PersianCulture fa = new PersianCulture(); 

Thread.CurrentThread.CurrentCulture = fa; 

表格here

+0

谢谢。但是,在> = .NET4.5中,'System.Globalization.CultureTableRecord'类不能在'typeof(DateTimeFormatInfo).Assembly' – FindOutIslamNow 2017-11-30 11:33:35