2011-02-15 12 views
6

Quiero establecer mi cultura de aplicación en lo que quiera, independientemente de la cultura del sistema operativo. Para obtener esto, utilicé la clase CultureInfo con "fa-IR" como cultura, pero utilizó el "GregorianCalendar" como calendario predeterminado y no la clase .NET PersianCalendar. Así que traté de derivar una nueva clase de CultureInfo para poner en práctica mi cultura del cliente:¿Cómo obtener cultura personalizada de la clase .Info 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; 
    } 
} 

El problema es que la propiedad DateTimeFormat lanza la siguiente excepción:

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

por lo que trataron de reemplazar la propiedad OptionalCalendars para añadir el PersianCalendar a ellos, ya que por defecto la lista sólo contiene el GregorianCalendar y HijriCalendar:

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

Pero que aún no ha resuelto el problema. ¿Qué está mal? ¿Cómo puedo configurar PersianCalendar como calendario predeterminado para CultureInfo y DateTimeFormat de la manera correcta?

+1

quizá este enlace ayudará más Krajanske :) http://www.codeproject.com/Articles/17495/ Persian-DateTime – Arash

Respuesta

1

Han pasado cinco años y las cosas han cambiado desde entonces. Microsoft tiene open sourced.NET, y ahora admite PersianCalendar de fábrica.

He intentado el siguiente fragmento con .NET Core 1.0 y funciona muy bien:

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

Intente utilizar un CultureAndRegionInfoBuilder. Según MSDN, esta es la forma preferida de creating custom cultures.

EDIT: Si esto falla, supongo que a dirty workaround using reflection es la única forma de crear una cultura personalizada.

+0

Gracias, intentaré en ambos sentidos lo antes posible. Pero prefiero no utilizar la reflexión aquí, porque es realmente una solución sucia. –

+0

Probé el constructor, hay algunas limitaciones en .NET framework para usar PersianCalendar, pero estas dos soluciones parecen funcionar bien para mi problema. La forma de reflexión también funciona, pero se producen algunos comportamientos extraños. Después de aplicar el truco de reflexión y establecer la cultura nueva, cuando llamas a ToString de una instancia de DateTime, obtienes la fecha persa, pero si obtienes las propiedades de Año, Mes y Día por separado, obtendrás todas las fechas gregorianas. –

Cuestiones relacionadas