所以,我有这个问题,微软实际上得到了格陵兰文化(kl-GL)的月份名称错误.我也知道我可以将自己的字符串数组传递给DateTimeFormatInfo.MonthNames属性,但似乎我指定的值仅用于该一个CultureInfo实例的范围.有没有办法告诉.Net,每次我有一个kl-GL文化的实例时,应该使用这些特定的月份名?
我知道您可以创建特定于用户的文化,但我无法访问某些遗留代码来实际更改代码以使用我自己的用户指定文化.
解决方法
干得好
public static void RenameMonthNames(string cultureName,string[] newNames) { RenameMonthNames(cultureName,newNames,false); RenameMonthNames(cultureName,true); } public static void RenameMonthNames(string cultureName,string[] newNames,bool custom) { var nonPublicAndInstance = BindingFlags.NonPublic | BindingFlags.Instance; var culture = new CultureInfo(cultureName,custom); int calendarId = (int)typeof (System.Globalization.Calendar).GetProperty("ID",nonPublicAndInstance).GetValue(culture.Calendar,new object[0]); object cultureData = culture.GetType().GetField("m_cultureData",nonPublicAndInstance).GetValue(culture); cultureData.GetType().GetField("bUseOverrides",nonPublicAndInstance).SetValue(cultureData,false); // Magic hack!!! object calendarData = cultureData.GetType().GetMethod("GetCalendar",nonPublicAndInstance).Invoke(cultureData,new object[] { calendarId }); calendarData.GetType().GetField("saMonthNames",nonPublicAndInstance).SetValue(calendarData,newNames); calendarData.GetType().GetField("saLeapYearMonthNames",newNames); calendarData.GetType().GetField("saMonthGenitiveNames",newNames); } public void TestCultureInfoHack() { RenameMonthNames("da-DK",new string[] { "jan1","feb2","mar3","apr","may","jun","jul","aug","sep","okt","nov","dec12",string.Empty }); var today = DateTime.Now.ToLongDateString(); Thread.CurrentThread.CurrentCulture = new CultureInfo("kl-gl",false); Response.Write(DateTime.Now.ToLongDateString()); Response.Write("<br /> "); Thread.CurrentThread.CurrentCulture = new CultureInfo("kl-GL"); Response.Write(DateTime.Now.ToLongDateString()); Response.Write("<br /> "); }
注意:仅适用于.NET 4.0