2011-02-15 16 views
6

Uygulama kültürümü, OS kültürünün ne olduğuna bakmaksızın, istediğim her şeye ayarlamak istiyorum. Bunu elde etmek için kültür olarak "fa-IR" olan CultureInfo sınıfını kullandım, ancak "PersianCalendar" sınıfını değil, varsayılan takvim olarak "GregorianCalendar" kullandı. Yani benim müşteri kültürünü uygulamaya CultureınfoRegionInfo gelen yeni bir sınıf türetmek için çalıştı:.NET CultureInfo sınıfından özel kültür nasıl elde edilir?

/// <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; 
    } 
} 

sorun DateTimeFormat özelliği şu istisna atar şudur:

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

yüzden OptionalCalendars özelliği geçersiz kılmak için çalıştı

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

Ama çözüldü vermedi: tarafından liste sadece GregorianCalendar ve HijriCalendar içerdiği varsayılan çünkü, onlara PersianCalendar eklemek için sorun. Yanlış olan ne? PersianCalendar'ı CultureInfo ve DateTimeFormat için varsayılan takvim olarak nasıl doğru şekilde ayarlayabilirim?

+1

belki bu link yardım size daha fazla Hemşerim :) http://www.codeproject.com/Articles/17495/ Farsça DateTime – Arash

cevap

1

Beş yıl geçti ve işler o zamandan beri değişti bakın. Microsoft open sourced.NET vardır ve şimdi, kutudan çıktığı PersianCalendar destekler.

Ben .NET Çekirdek 1.0 ile şu pasajı denedim ve gayet güzel çalışıyor:

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

bir CultureAndRegionInfoBuilder kullanmayı deneyin. MSDN'ye göre bu, creating custom cultures'un tercih edilen yoludur.

DÜZENLEME: Bu başarısız olursa, böyle bir özel kültür oluşturmanın tek yolu a dirty workaround using reflection olduğunu tahmin ediyorum.

+0

Teşekkür ederim, her iki yolu da en kısa zamanda deneyeceğim. Ama ben burada yansımayı kullanmamayı tercih ederim, çünkü bu gerçekten kirli bir çözümdür. –

+0

Orada .NET framework bazı sınırlamalar PersianCalendar kullanarak içindir ancak bu iki çözüm benim sorunum cezasını iş gibi görünüyor, oluşturucu çalıştı. Yansıma yolu da işe yarıyor, ancak bazı garip davranışlar ortaya çıkıyor. Eğer bir DateTime örneğinin ToString aradığınızda yansıma hile uygulayarak ve yeni kültür ayarladıktan sonra, Pers tarihi almak ama ayrı ayrı Yıl, Ay ve Gün özelliklerini olsun, sen Gregoryen tarihleri ​​tüm alacak. –

İlgili konular