2011-02-15 26 views
6

voglio impostare la mia cultura applicazione per quello che voglio, indipendentemente da ciò che la cultura del sistema operativo è. Per ottenere questo ho usato classe CultureInfo con "Fa-IR" come la cultura, ma è usato il "GregorianCalendar", come calendario predefinito e non la classe .NET PersianCalendar. Così ho cercato di derivare una nuova classe da CultureInfo per implementare la mia cultura del cliente:Come derivare la cultura personalizzata dalla classe .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; 
    } 
} 

Il problema è che la proprietà DateTimeFormat getta la seguente eccezione:

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

Così ho provato a ignorare la proprietà OptionalCalendars per aggiungere il PersianCalendar a loro, perché per impostazione predefinita l'elenco contiene solo il GregorianCalendar e HijriCalendar:

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

ma didnt risolto il problema. Che c'è? Come posso impostare PersianCalendar come calendario predefinito per CultureInfo e DateTimeFormat in modo corretto?

+1

forse questo link aiuto più connazionale :) http://www.codeproject.com/Articles/17495/ Persiano-DateTime – Arash

risposta

1

cinque anni e le cose sono cambiate da allora. Microsoft ha open sourced.NET, e ora, supporta PersianCalendar fuori dalla scatola.

Ho provato il seguente frammento con .NET core 1.0 e funziona bene:

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

Provare a usare un CultureAndRegionInfoBuilder. Secondo MSDN questo è il modo preferito di creating custom cultures.

MODIFICA: Se ciò non riesce, suppongo che a dirty workaround using reflection sia l'unico modo per creare tale cultura personalizzata.

+0

Grazie, proverò in entrambe le direzioni il prima possibile. Ma preferisco non usare la riflessione qui, perché è davvero una soluzione sporca. –

+0

Ho provato il builder, ci sono alcune limitazioni in .NET framework per l'utilizzo di PersianCalendar ma queste due soluzioni sembrano funzionare bene per il mio problema. Anche il modo di riflessione funziona, ma si verificano alcuni comportamenti strani. Dopo aver applicato il trucco riflesso e impostato la nuova cultura, quando si chiama ToString di un'istanza DateTime si ottiene la data persiana ma se si ottengono separatamente le proprietà Anno, Mese e Giorno, si otterrà tutto in date gregoriane. –

Problemi correlati