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

Pau*_*erø 6 .net asp.net cultureinfo

所以,我有这个问题,微软实际上得到了格陵兰文化(kl-GL)的月份名称错误.我也知道,我可以通过我自己的字符串数组到DateTimeFormatInfo.MonthNames属性,但它似乎是我指定只在一个CultureInfo的实例的范围中使用的值.有没有办法告诉.Net,每次我有一个kl-GL文化的实例时,应该使用这些特定的月份名?

我知道您可以创建特定于用户的文化,但我无法访问某些遗留代码来实际更改代码以使用我自己的用户指定文化.

Dmi*_*gin 1

干得好

    public static void RenameMonthNames(string cultureName, string[] newNames)
    {
        RenameMonthNames(cultureName, newNames, false);
        RenameMonthNames(cultureName, newNames, 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", nonPublicAndInstance).SetValue(calendarData, newNames);
        calendarData.GetType().GetField("saMonthGenitiveNames", nonPublicAndInstance).SetValue(calendarData, 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 /> "); 
    }
Run Code Online (Sandbox Code Playgroud)

注意:仅适用于.NET 4.0