Глобализация CultureInfo и DateTimeFormatInfo: Как мы можем изменить формат цифр на мой язык? - PullRequest
1 голос
/ 10 апреля 2011

Я использую System.Globalization, как показано ниже:

CultureInfo calture = new CultureInfo(MyCultureInfoGoesHere);
DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla" };
info.ShortestDayNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla" };
info.DayNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla" };
info.AbbreviatedMonthNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "" };
info.MonthNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "" };
info.AMDesignator = "bla";
info.PMDesignator = "bla";
info.ShortDatePattern = "yyyy/MM/dd";
//info.ShortDatePattern = "dd/MM/yyyy";
info.LongDatePattern = "dddd , dd MMMM yyyy";
info.FirstDayOfWeek = DayOfWeek.bla;
MyCalendar cal = new MyCalendar();
typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).SetValue(info, cal);
//object obj = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).GetValue(info);
//obj.GetType().GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(obj, new object[] { cal.GetType().GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).SetValue(calture, cal);
Thread.CurrentThread.CurrentCulture = calture;
Thread.CurrentThread.CurrentUICulture = calture;
CultureInfo.CurrentCulture.DateTimeFormat = info;
CultureInfo.CurrentUICulture.DateTimeFormat = info;

Мои вопросы:

  1. Почему закомментированные строки имеют ошибки в VS2010 (.NET 4.0), но они исправны в VS2008 (.NET 3.5)?

  2. Как я могу локализовать свои цифры, когда я использую DateTime.Now, я имею в виду, что я хочу форматировать цифры на моем языке (только для DateTime)! это возможно?

Спасибо заранее и наилучшими пожеланиями.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2011

Пожалуйста, посмотрите на этот ответ. Также , который мог бы помочь. Основная идея заключается в создании метода расширения, который заменит числа на восточно-арабские аналоги. КСТАТИ. Похоже, что числа и некоторые названия месяца / дня уже определены для культуры PS-AF:

        // gets Eastern Arabic digits array
        string[] numerals = CultureInfo.CreateSpecificCulture("ps-AF").NumberFormat.NativeDigits;

Я просто не знаю, подходит ли вам это.

3 голосов
/ 10 апреля 2011
  1. Вы используете отражение, которое опирается на детали реализации.Эти детали вполне могли измениться между .NET 3.5 и .NET 4. Не делайте этого.Если бы дизайнеры API хотели, чтобы вы связались с этими вещами, они бы сделали их публичными.Каждый раз, когда вы полагаетесь на детали реализации, подобные этой, вы должны ожидать потенциального сбоя при изменении реализации.

  2. Пробовали ли вы клонировать весь CultureInfo и модифицировать NumberFormatInfo, а такжеDateTimeFormatInfo?Я не могу сказать, что когда-либо делал это сам, но стоит попробовать.

1 голос
/ 10 апреля 2011

почему закомментированные строки имеют ошибку в VS2010 (.NET 4.0), но они исправны в VS2008 (.NET 3.5)?

Все меняется. Материал случается. Жизнь продолжается. ~ Элизабет Скотт

Как я могу локализовать свои цифры, когда я использую DateTime. Теперь, я имею в виду, я хочу формат цифр на моем языке (только для DateTime)! Является ли это возможным? Хотя C # уже содержит большое количество значений по умолчанию, вы можете настроить их по своему вкусу.

Вот пример того, как установить информацию о времени и дате.

Теперь, если вы хотите распечатать DateTime.Now

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
Console.WriteLine(DateTime.Now.ToString("D", CultureInfo.CurrentCulture));
Thread.CurrentThread.CurrentCulture = new CultureInfo("et")
{
    DateTimeFormat = { LongDatePattern = "d. MMMM yyyy'. a.'" }
}; 
Console.WriteLine(DateTime.Now.ToString("D", CultureInfo.CurrentCulture));

Вы получите:

Sunday, April 10, 2011
10. aprill 2011. a.

Полагаю, это то, что вы хотели - получить другой формат времени, просто изменив культуру.

...