7

无论操作系统文化是什么,我都想将我的应用程序文化设置为我想要的任何内容。为了获得这一点,我使用 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 的默认日历?

4

3 回答 3

5

尝试使用CultureAndRegionInfoBuilder。根据 MSDN,这是创建自定义文化的首选方式。

编辑:如果这失败了,我猜想使用反射的肮脏解决方法是创建这种自定义文化的唯一方法。

于 2011-02-16T08:09:31.000 回答
4

五年过去了,从那以后情况发生了变化。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  
        }
    }
}
于 2016-07-09T13:41:22.133 回答
0

不幸的是,这是不可能的。它已作为错误提交,因此 Microsoft 已意识到此问题。请参阅http://connect.microsoft.com/VisualStudio/feedback/details/507262/persian-cultureinfo

于 2011-02-16T17:26:55.017 回答