加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 全局覆盖特定文化的所有实例的MonthNames

发布时间:2020-12-16 03:55:44 所属栏目:asp.Net 来源:网络整理
导读:所以,我有这个问题,微软实际上得到了格陵兰文化(kl-GL)的月份名称错误.我也知道我可以将自己的字符串数组传递给DateTimeFormatInfo.MonthNames属性,但似乎我指定的值仅用于该一个CultureInfo实例的范围.有没有办法告诉.Net,每次我有一个kl-GL文化的实例时,应
所以,我有这个问题,微软实际上得到了格陵兰文化(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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读