Как извлечь пользовательскую культуру из класса .NET CultureInfo? - PullRequest
6 голосов
/ 15 февраля 2011

Я хочу установить для своей культуры приложений все, что захочу, независимо от культуры ОС.Для этого я использовал класс CultureInfo с "fa-IR" в качестве культуры, но в качестве календаря по умолчанию он использовал "GregorianCalendar", а не класс .NET PersianCalendar.Поэтому я попытался извлечь новый класс из CultureInfo для реализации своей культуры клиента:

/// <summary>
/// Represents culture specific information, Persian calendar and number format info for Iran.
/// </summary>
public class PersianCultureInfo : CultureInfo
{
    private Calendar _calendar = new PersianCalendar();

    public PersianCultureInfo()
        : base("fa-IR", true)
    {
    }

    /// <summary>
    /// Persian calendar with solar system algorithm for Iran.
    /// </summary>
    public override Calendar Calendar
    {
        get
        {
            return this._calendar;
        }
    }

    public static PersianCultureInfo Create()
    {
        PersianCultureInfo culture = new PersianCultureInfo();
        culture.PerpareDateTimeFormatInfo();
        return culture;
    }

    private void PerpareDateTimeFormatInfo()
    {
        this.DateTimeFormat.Calendar = this.Calendar;
        this.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;
    }
}  

Проблема в том, что свойство DateTimeFormat выдает следующее исключение:

Not a valid calendar for the given culture. 
Parameter name: value  

Поэтому я попыталсяпереопределите свойство OptionalCalendars, чтобы добавить к ним PersianCalendar, потому что по умолчанию список содержит только GregorianCalendar и HijriCalendar:

    public override Calendar[] OptionalCalendars
    {
        get
        {
            return base.OptionalCalendars.Concat<Calendar>(new Calendar[1] { new PersianCalendar() }).ToArray<Calendar>();
        }
    }  

Но это не решило проблему.Что случилось?Как правильно установить PersianCalendar в качестве календаря по умолчанию для CultureInfo и DateTimeFormat?

Ответы [ 3 ]

5 голосов
/ 16 февраля 2011

Попробуйте использовать CultureAndRegionInfoBuilder . Согласно MSDN, это предпочтительный способ создания пользовательских культур .

EDIT: Если это не удастся, я думаю, что грязный обходной путь с использованием отражения - единственный способ создать такую ​​пользовательскую культуру.

2 голосов
/ 09 июля 2016

Прошло пять лет, и с тех пор все изменилось.Microsoft имеет с открытым исходным кодом .NET , и теперь она поддерживает PersianCalendar из коробки.

Я попробовал следующий фрагмент с .NET Core 1.0это работает просто отлично:

using System;
using System.Globalization;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            System.Globalization.CultureInfo.CurrentCulture = 
                new CultureInfo("fa-IR");
            Console.WriteLine(System.DateTime.Now); 
            // Prints: 1395/4/19 A.D. 13:31:55  
        }
    }
}
0 голосов
/ 16 февраля 2011

К сожалению, это невозможно.Это было зарегистрировано как ошибка, таким образом, Microsoft знает об этой проблеме.Смотри http://connect.microsoft.com/VisualStudio/feedback/details/507262/persian-cultureinfo

...