2011-02-15 25 views
6

Tôi muốn đặt văn hóa ứng dụng của mình thành bất kỳ thứ gì tôi muốn, bất kể văn hóa hệ điều hành là gì. Để có được điều này, tôi đã sử dụng lớp CultureInfo với "fa-IR" làm văn hóa, nhưng nó đã sử dụng "GregorianCalendar" làm lịch mặc định chứ không phải lớp .NET PersianCalendar. Vì vậy, tôi đã cố gắng để lấy được một lớp mới từ CultureInfo để thực hiện văn hóa của khách hàng của tôi:Làm thế nào để lấy được văn hóa tùy chỉnh từ lớp .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; 
    } 
} 

Vấn đề là tài sản DateTimeFormat ném ngoại lệ sau đây:

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

Vì vậy, tôi đã cố gắng để ghi đè lên các tài sản OptionalCalendars để thêm PersianCalendar vào chúng, vì theo mặc định, danh sách chỉ chứa GregorianCalendar và HijriCalendar:

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

Nhưng nó chưa được giải quyết vấn đề. Chuyện gì thế? Làm thế nào tôi có thể đặt PersianCalendar làm lịch mặc định cho CultureInfo và DateTimeFormat theo cách chính xác?

+1

có thể liên kết này giúp bạn nhiều hơn người đồng hương :) http://www.codeproject.com/Articles/17495/ Persian-DateTime – Arash

Trả lời

1

Năm năm trôi qua và mọi thứ đã thay đổi kể từ đó. Microsoft có open sourced.NET và giờ đây, nó hỗ trợ PersianCalendar ngoài hộp.

Tôi đã thử đoạn sau với .NET Lõi 1.0 và nó hoạt động tốt:

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

Thử sử dụng CultureAndRegionInfoBuilder. Theo MSDN, đây là cách ưa thích của creating custom cultures.

EDIT: Nếu điều này không thành công, tôi đoán rằng a dirty workaround using reflection là cách duy nhất để tạo văn hóa tùy chỉnh như vậy.

+0

Cảm ơn bạn, tôi sẽ thử cả hai cách càng sớm càng tốt. Nhưng tôi không thích sử dụng sự phản chiếu ở đây, bởi vì nó thực sự là một cách giải quyết dơ bẩn. –

+0

Tôi đã thử trình xây dựng, có một số hạn chế trong khuôn khổ .NET để sử dụng PersianCalendar nhưng hai giải pháp này dường như hoạt động tốt cho vấn đề của tôi. Cách phản chiếu cũng hoạt động, nhưng một số hành vi lạ xảy ra. Sau khi áp dụng thủ thuật phản chiếu và thiết lập văn hóa mới, Khi bạn gọi ToString của một cá thể DateTime bạn nhận được ngày Ba Tư nhưng nếu bạn có được các thuộc tính Year, Month và Day riêng biệt, bạn sẽ nhận được tất cả trong ngày Gregorian. –

0

Rất tiếc, điều đó là không thể. Nó đã được đệ trình như một lỗi để Microsoft nhận thức được vấn đề này. Xem http://connect.microsoft.com/VisualStudio/feedback/details/507262/persian-cultureinfo

+0

Vâng, tôi biết về những hạn chế đó, vì vậy tôi đã bắt đầu câu hỏi này để tìm cách triển khai nó bằng cách kế thừa tài sản CultureInfo và Overrinding Calendar. –