7

OS カルチャに関係なく、自分のアプリケーション カルチャを好きなように設定したいと考えています。これを取得するために、カルチャとして「fa-IR」を含む CultureInfo クラスを使用しましたが、デフォルトのカレンダーとして「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  

デフォルトでは、リストには GregorianCalendar と HijriCalendar しか含まれていないため、OptionalCalendars プロパティをオーバーライドして PersianCalendar を追加しようとしました。

    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

それから5年が経ち、状況は変わりました。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 に答える