Click here to Skip to main content
15,888,610 members
Articles / Programming Languages / C#

Fixing Optional Calendars for Persian Culture in .NET

Rate me:
Please Sign up or sign in to vote.
4.60/5 (6 votes)
30 Mar 2013CPOL2 min read 46.5K   2.8K   21  
This article describes how to fix CultureInfo for Persian culture so that .NET developers can use PersianCalendar.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Reflection;

namespace FixPersianLocale
{
    public partial class Sample : Form
    {
        private CultureInfo m_culture;
        public Sample()
        {
            m_culture = new CultureInfo("fa-IR");
            System.Threading.Thread.CurrentThread.CurrentCulture = m_culture;
            System.Threading.Thread.CurrentThread.CurrentUICulture = m_culture;

            InitializeComponent();
            
        }

        void Log(string format, params object[] Params)
        {
            string str = string.Format(format, Params);
            textBox1.AppendText(str); 
        }
        private void Sample_Load(object sender, EventArgs e)
        {

        }

        private void Test1()
        {
            CultureInfo cultureInfo = new CultureInfo("fa-IR",false);
            DateTimeFormatInfo dateTimeFormatInfo = cultureInfo.DateTimeFormat;
            Console.WriteLine("DateTime.Now={0}", DateTime.Now);
 
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Log("DateTime.Now={0} \r\n", DateTime.Now);
        }

        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Log("Now.ToString(m_culture) = {0} \r\n", DateTime.Now.ToLongDateString());
        }
        private void SetCurrentCulture(CultureInfo culture)
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = culture;
            System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

        }

        private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            PersianCultureHelper.FixPersianCulture(m_culture, FixCultureOptions.foptAll);
            
            Log("Current culture fixed with all options. \r\n");


        }
        private void printCulture()
        {
            m_culture = System.Threading.Thread.CurrentThread.CurrentCulture;
            Log("Culture Data: \r\n");
            Log("============ \r\n");
            Log("Culture Name={0} \r\n", m_culture.Name);
            Log("Culture Display Name={0} \r\n", m_culture.DisplayName);
            Log("Culture Calendar={0} \r\n", m_culture.Calendar);
            Log("Culture.DateTimeFormat.Calendar={0} \r\n", m_culture.DateTimeFormat.Calendar);


            Log("Optional Calendars: \r\n");
            foreach (Calendar cal in m_culture.OptionalCalendars)
            {
                Log("\t Calendar {0} \r\n", cal);

            }
            Log("Month Names: \r\n");
            foreach (string m in m_culture.DateTimeFormat.MonthNames)
            {
                Log("\t {0} \r\n", m);
            }
            Log("Day Names: \r\n");
            foreach (string m in m_culture.DateTimeFormat.DayNames)
            {
                Log("\t {0} \r\n", m);
            }

            Log("============ \r\n");
        }

        private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            printCulture();
 

        }

        private void linkLabel5_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Log("Now.ToShortString = {0} \r\n", DateTime.Now.ToShortDateString());

        }

        private void linkLabel6_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //m_culture =  PersianCultureHelper.FixAndSetCurrentCulture();
            m_culture.DateTimeFormat.Calendar = new System.Globalization.GregorianCalendar();
            SetCurrentCulture(m_culture);

            

            //CultureInfo cultureInfo = new CultureInfo("fa-IR", false);
            //DateTimeFormatInfo dateTimeFormatInfo = cultureInfo.DateTimeFormat;

            //FieldInfo cultureDataField = typeof(CultureInfo).GetField("m_cultureData",
            //     BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            //Object cultureData = cultureDataField.GetValue(cultureInfo);
            //FieldInfo waCalendarsField = cultureData.GetType().GetField("waCalendars",
            //    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            //int[] waCalendars = (int[])waCalendarsField.GetValue(cultureData);
            //waCalendarsField.SetValue(cultureData, waCalendars);
            //waCalendars[0] = 0x16;
            //waCalendarsField.SetValue(cultureData, waCalendars); 

            //dateTimeFormatInfo.Calendar = new PersianCalendar(); 



            //FieldInfo calendarField = typeof(DateTimeFormatInfo).GetField("calendar",
            //                            BindingFlags.Public |  BindingFlags.NonPublic |  BindingFlags.Instance );
            //calendarField.SetValue(dateTimeFormatInfo, new PersianCalendar());

            //dateTimeFormatInfo.DayNames = new string[] 
            //    { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
            //dateTimeFormatInfo.AbbreviatedMonthNames = new string[] 
            //    { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", 
            //        "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            //dateTimeFormatInfo.MonthNames = new string[] 
            //    { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", 
            //        "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

           // Log("To day is {0}", DateTime.Now.ToString("dddd, dd MMM yyyy", dateTimeFormatInfo));

        }
        private void ClearLog()
        {
            textBox1.Text = "";
        }

        private void linkLabel7_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ClearLog();
            m_culture = PersianCultureHelper.FixPersianCulture(null, FixCultureOptions.foptCalendarInDateFormatInfo);

            SetCurrentCulture(m_culture);
            Log("DateTimeFormat of current culture fixed: \r\n");
            printCulture();


        }

        private void linkLabel8_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ClearLog();
            m_culture = PersianCultureHelper.FixAndSetCurrentCulture();
            Log("Current culture fixed: \r\n");
            printCulture();
        }

        private void linkLabel9_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            textBox1.Text = "";
        }

        private void linkLabel3_LinkClicked_1(object sender, LinkLabelLinkClickedEventArgs e)
        {
            m_culture.DateTimeFormat.Calendar = new System.Globalization.GregorianCalendar();
            SetCurrentCulture(m_culture);
        }

        private void linkLabel6_LinkClicked_1(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                m_culture.DateTimeFormat.Calendar = new System.Globalization.PersianCalendar();
                Log("Calendar changed to PersianCalendar. \r\n");
            }
            catch(ArgumentOutOfRangeException)
            {
                Log("Persian Calendar is not in set of optional calendars. You should fix the culture first. \r\n");
            }
        }

        private void linkLabel10_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ClearLog();
            m_culture = FixPersianLocale.PersianCultureHelper.FixPersianCulture(m_culture, FixCultureOptions.foptOptionalCalendars);
            Log("Optional calendars fixed: \r\n");
            printCulture();
 
        }

        private void linkLabel11_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ClearLog();
            Log("Creating custom Persian Culture \r\n");
            if (FixPersianLocale.PersianCultureHelper.CreateAndRegisterCustomPersianLocale())
                Log("Custom culture for 'fa-IR' successfuly created and registered.\r\nNow you can use new CultureInfo('fa-IR', false) to instantiate a new fixed Persian Cuture.\r\n");
            else
                Log("Failed to create and register custom Persian culture.\r\n");

        }

    }
}


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Gostareh Negar
Iran (Islamic Republic of) Iran (Islamic Republic of)
I've been programming since 1990, C, Basic, Pascal, Assembly, C++ and...
Since I restablished Gostareh Negar in 1999, I've been quite busy localizing internationally accepted software for Persian natives. So I feel quite aware of various aspects of localization, specially when Persian language is the case.

Comments and Discussions