2011-02-15 5 views
6

私は、OS文化が何であるかにかかわらず、私が望むものに私のアプリケーションカルチャーを設定したいと思っています。これを取得するために、cultureとして "fa-IR"のCultureInfoクラスを使用しましたが、.NET PersianCalendarクラスではなく、デフォルトカレンダーとして "GregorianCalendar"を使用しました。だから、私は、顧客の文化を実装するためのCultureInfoから新しいクラスを派生してみました:.NET 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プロパティをオーバーライドしてみました

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

しかし、それが解決didntの:デフォルトでは、リストのみのGregorianCalendarとHijriCalendarが含まれているため、それらにPersianCalendarを追加します問題。なにが問題ですか? CultureInfoとDateTimeFormatのデフォルトのカレンダーとしてPersianCalendarを正しい方法で設定するにはどうすればよいですか?

+1

多分このリンクヘルプあなたより多くの同胞:) http://www.codeproject.com/Articles/17495/ Persian-DateTime – Arash

答えて

1

5年経過して以来のことが変わりました。マイクロソフトはopen sourced.NETを持っていて、現在はPersianCalendarをそのまま使用できます。

私は、.NETのコア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 
     } 
    } 
} 
5

CultureAndRegionInfoBuilderをお試しください。 MSDNによると、これは好ましい方法であるcreating custom culturesです。

編集: これが失敗した場合は、​​がそのようなカスタムカルチャを作成する唯一の方法だと思います。

+0

ありがとう、私はできるだけ早く両方の方法を試みます。しかし、私は本当に汚い回避策であるので、ここで反射を使用しないことを好む。 –

+0

ビルダーを試しましたが、.NET FrameworkにPersianCalendarを使用するためのいくつかの制限がありますが、これらの2つの解決策は私の問題でうまくいくようです。反射方法も機能しますが、いくつかの奇妙な動作が発生します。反射トリックを適用して新しいカルチャを設定した後、DateTimeインスタンスのToStringを呼び出すと、ペルシャ語の日付が取得されますが、年、月、日の各プロパティを別々に取得すると、すべてグレゴリオ暦の日付になります。 –

0

残念ながらそれはできません。マイクロソフトがこの問題を認識するように、バグとして提出されています。 http://connect.microsoft.com/VisualStudio/feedback/details/507262/persian-cultureinfo

+0

はい、私はこれらの制限について知っていましたので、この質問をCultureInfoおよびOverrinding Calendarプロパティを継承して実装する方法を見つけるために始めました。 –

関連する問題