Makale Özeti

Geliştirdiğimiz uygulamalarda bilhassa son kullanıcının sürekli gördüğü User Interface arabiriminde gerek bilginin toplanması gerek ise bilginin gösterilmesi kullanıcının kullandığı dil bilgilerine uygun olmalıdır. Bu durum bilhassa multilanguage uygulamalarda çok önemli bir konuma gelmektedir. Örneğin İngiltere'deki bir kullanıcı ile Türkiye'de bulunan bir kullanıcı tarih biçimlerini ve ondalık ayraçlarını farklı şekilde görmelidir. Bu makalemde sizlere bu özelliği uygulamalarımıza nasıl kazandırabileceğimizi ve kullanıcının ayarlamış olduğu dil ayarlarını nasıl okuyabileceğimizi anlatacağım.

Makale

Merhabalar,

Geliştirdiğimiz uygulamalarda bilhassa son kullanıcının sürekli gördüğü User Interface arabiriminde gerek bilginin toplanması gerek ise bilginin gösterilmesi kullanıcının kullandığı dil bilgilerine uygun olmalıdır. Bu durum bilhassa multilanguage uygulamalarda çok önemli bir konuma gelmektedir. Örneğin İngiltere'deki bir kullanıcı ile Türkiye'de bulunan bir kullanıcı tarih biçimlerini ve ondalık ayraçlarını farklı şekilde görmelidir. Bu makalemde sizlere bu özelliği uygulamalarımıza nasıl kazandırabileceğimizi ve kullanıcının ayarlamış olduğu dil ayarlarını nasıl okuyabileceğimizi anlatacağım.

System.Globalization namespace'indeki class'lar bilgisayardaki dil, bölge, tarih & zaman, para birimi gibi bilgilerin ve bu bilgilerin formatlarının uygulamalarımızda yönetilmesini sağlayan class'lardır.

System.Globalization namespace'inin tüm öğelerinin detaylı açıklamalarına http://msdn.microsoft.com/en-us/library/system.globalization.aspx adresinden erişebilirsiniz. Bu makalemde System.Globalization namespace'inin önemli birkaç öğesinden bahsedeceğim. İlk olarak RegionInfo class'ından başlayalım. RegionInfo class'ı ülke ve bölge bilgilerini içerir ve bize kullanıcının bilgisayarındaki bölge ve dil seçeneklerinden bağımsız verileri sunar. ISO 3166'da bölge ve ülkeler için kabul edilmiş iki veya üç harfli kodları parametre alır. Örneğin Türkiye için geçerli bilgilere erişmek için RegionInfo class'ının instance'ını aşağıdaki gibi alırız:

System.Globalization.RegionInfo insRegionInfo = new System.Globalization.RegionInfo("TR");

Instance'ını aldığımız RegionInfo class'ının belli başlı property'leri aşağıda örnek kodda görülebilir:

static void Main(string[] args)
{

            Program p = new Program();
            p.GetRegionInfo();
            Console
.ReadKey();
}

void GetRegionInfo()
{
            System.Globalization.RegionInfo insRegionInfo = new System.Globalization.RegionInfo("TR");

            Console
.WriteLine("Bölge bilgileri:");
            Console
.WriteLine("Para birimi İngilizce adı: " + insRegionInfo.CurrencyEnglishName);
            Console
.WriteLine("Para birimi Türkçe adı: " + insRegionInfo.CurrencyNativeName);
            Console
.WriteLine("Para birimi simgesi: " + insRegionInfo.CurrencySymbol);
            Console
.WriteLine("Görüntülenen adı: " + insRegionInfo.DisplayName);
            Console
.WriteLine("İngilizce adı: " + insRegionInfo.EnglishName);
            Console
.WriteLine("Bölge Idsi: " + insRegionInfo.GeoId);
            Console
.WriteLine("Metrik sistem kullanılıyor mu: " + insRegionInfo.IsMetric);
            Console
.WriteLine("ISO döviz sembolü: " + insRegionInfo.ISOCurrencySymbol);
            Console
.WriteLine("Bölge adı: " + insRegionInfo.Name);
            Console
.WriteLine("Bölgenin yerel adı: " + insRegionInfo.NativeName);
            Console
.WriteLine("Bölgenin üç harfli ISO adı: " + insRegionInfo.ThreeLetterISORegionName);
            Console
.WriteLine("Bölgenin üç harfli Windows adı: " + insRegionInfo.ThreeLetterWindowsRegionName);
            Console
.WriteLine("Bölgenin iki harfli ISO adı: " + insRegionInfo.TwoLetterISORegionName);

}

 

RegionInfo class'ından sonra bahsetmek istediğim iki class bulunuyor. Bunlar yine System.Globalization namespace'inin öğelerinden olan CultureInfo class'ının iki property'si CurrentCulture ve CurrentUICulture. CultureInfo class'ı belirli bir kültürün tarih & saat formatı,  haftanın ilk günü, ondalık simgesi, ölçü sistemi gibi belli başlı özelliklerini taşır. Hatta String class'ı dolaylı olarak CultureInfo class'ını kullanarak varsayılan kültür bilgisini alır.

 Öncelikle bu class'ın iki öğesi CurrentCulture ve CurrentUICulture arasındaki farktan bahsetmek istiyorum.

Çoğu durumlarda CurrentCulture ve CurrentUICulture aynıdır. Bu property'ler kullanıcı bilgisayarına Multilangual Language Interface (MUI) yüklemişlerse ve bir yandan MUI'yi kullanıyorlarsa, ancak Bölge ve Dil seçeneklerinde MUI'nin ayarlarını değiştirmişlerse farklı olur. Culture ayarlarını değiştirmek istiyorsak kullanıcı arayüzü ayarlarını ve tarih/zaman ve sayı formatlarını farklılaştırmak durumunda kalırız. Culture ayarları Thread nesnesi ile ilişkilendirilirler ve CurrentCulture ve CurrentUICulture property'lerini tek bir thread'de aşağıdaki gibi set edebiliriz:

System.Globalization.CultureInfo insCultureInfo = new CultureInfo("tr-TR");

System.Threading.Thread.CurrentThread.CurrentCulture = insCultureInfo;

System.Threading.Thread.CurrentThread.CurrentUICulture = insCultureInfo; 

 

 CurrentCulture property'si tarih, zaman, sayı gibi değişkenlerin format ayarlarının yapılmasında, CurrentUICulture ise kullanıcı arayüzündeki dil seçiminde kullanılır.

Windows'ta kontrol panelde Bölge ve Dil seçenekleri ekranında yapılan değişiklikler CurrentCulture property'sini değiştirir.

 CurrentUICulture bu ekranda yapılan değişikliklerden etkilenmez. CurrentUICulture işletim sisteminin çalıştığı dilin ayarları ile ilgilidir. Yani kullanıcıya gösterilen mesajlar, menü text'leri, yardım içeriği, tooltip'ler CurrentUICulture'dan etkilenir. Eğer Windows 7 (Ultimate, Enterprise), Vista veya XP çalışan bir makinada MUI kurulu ise Bölge ve Dil seçenekleri ekranında kullanıcı arayüzünün dili değiştirilebilir, bu da CurrentUICulture property'sini değiştirir.

 

Şimdi CurrentCulture ve CurrentUICulture ile ilgili anlattıklarımın ufak bir ispatını yapalım. Console uygulaması oluşturalım ve haftanın ilk gününü CurrentCulture ve CurrentUICulture property'lerinden okuyalım. Uygulama İngilizce Windows 7 işletim sisteminde çalışacak. İngilizce sistemlerde haftanın ilk günü pazardır, ancak benim Bölge ve Dil ayarları ekranında haftanın ilk günü pazartesi olarak ayarlanmış durumda:

Aşağıdaki kodu yazalım ve çalıştıralım:

void HaftaninIlkGununuGetir()
{

            System.Globalization.CultureInfo insCultureInfo = System.Globalization.CultureInfo.CurrentCulture;
            System.Globalization.CultureInfo insUICultureInfo = System.Globalization.CultureInfo.CurrentUICulture;
            Console
.WriteLine("Haftanin ilk gunu, CurrentCulture'da: " + insCultureInfo.DateTimeFormat.FirstDayOfWeek);
            Console
.WriteLine("Haftanin ilk gunu, CurrentUICulture'da: " + insUICultureInfo.DateTimeFormat.FirstDayOfWeek);
}

static void Main(string[] args)
{
           
Program p = new Program();
            p.HaftaninIlkGununuGetir();
            Console.ReadKey();
}

Görüldüğü gibi CurrentCulture Pazartesi, CurrentUICulture Pazar şeklinde sonuç döndürdü. 

Şimdi CultureInfo class'ının bize bilgi sağlayan önemli iki öğesinden daha bahsetmek istiyorum. Bunlardan birincisi DateTimeFormat DateTimeFormatInfo tipinde seçili culture'a ait tarih ve zaman format bilgisine erişmemizi sağlar. DateTimeFormatInfo nesnesinin birçok property'sinden bazılarını aşağıdaki metodda alabiliriz:

void GetDateTimeFormatInfo()
{

            System.Globalization.DateTimeFormatInfo dtfi =  System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat;
            Console.WriteLine(dtfi.AbbreviatedDayNames.Where(i => i.ToLower().IndexOf("we") > -1).First()); //kisaltilmis gun isimleri
            Console.WriteLine(dtfi.MonthNames.Where(i => i.ToLower().IndexOf("pr") > -1).First()); //ay isimleri
            Console.WriteLine(dtfi.AbbreviatedMonthNames.First()); //kisaltilmis ay isimleri
            Console.WriteLine(dtfi.Calendar); //kullanilan takvim
            Console.WriteLine(dtfi.DateSeparator); //tarih ayraci
            Console.WriteLine(dtfi.DayNames.Last()); //gun isimleri
            Console.WriteLine(dtfi.FirstDayOfWeek); //haftanin ilk gunu
            Console.WriteLine(dtfi.FullDateTimePattern); //tam tarih zaman formati
            Console.WriteLine(dtfi.GetAbbreviatedDayName(DayOfWeek.Thursday)); //kisaltilmis gun adi al
            Console.WriteLine(dtfi.GetDayName(DayOfWeek.Saturday)); //gun adi al
            Console.WriteLine(dtfi.GetMonthName(4)); //ay adi al
            Console.WriteLine(dtfi.GetShortestDayName(DayOfWeek.Friday)); //kisa gun adi
            Console.WriteLine(dtfi.LongDatePattern); //uzun tarih formati
            Console.WriteLine(dtfi.LongTimePattern); //uzun saat formati
            Console.WriteLine(dtfi.ShortDatePattern); //kisa tarih formati
            Console.WriteLine(dtfi.ShortestDayNames.First()); //kisa gun isimleri
            Console.WriteLine(dtfi.ShortTimePattern); //kisa saat formati
            Console.WriteLine(dtfi.TimeSeparator); //saat ayraci
            Console.WriteLine(dtfi.YearMonthPattern); //ay yil formati

}

 Metodu uygulamada çalıştırdığımızda property'lerin değerlerini aşağıdaki gibi görebiliriz:

 CultureInfo class'ının bahsetmek istediğim diğer öğesi de NumberFormatInfo. NumberFormatInfo sayıların ve rakamların mevcut Culture'a göre nasıl görüntülendiğinin belirlendiği class'tır. Aşağıdaki metodda da NumberFormatInfo class'ının bazı önemli property'lerini alıyoruz:

void GetNumberFormatInfo()
{

            System.Globalization.NumberFormatInfo nfi = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
           
Console.WriteLine(nfi.CurrencyGroupSeparator); //para birimi ayraci
            Console.WriteLine(nfi.CurrencySymbol); //para birimi simgesi
            Console.WriteLine(nfi.NaNSymbol); //Not A Number simgesi
            Console.WriteLine(nfi.NegativeInfinitySymbol); //negatif sonsuz simgesi
            Console.WriteLine(nfi.NegativeSign); //negatif simgesi
            Console.WriteLine(nfi.NumberDecimalDigits); //ondalik basamak sayisi
            Console.WriteLine(nfi.NumberDecimalSeparator); //ondalik ayraci
            Console.WriteLine(nfi.NumberGroupSeparator); //sayi ayraci
            Console.WriteLine(nfi.NumberNegativePattern); //negatif sayi paterni
            Console.WriteLine(nfi.PercentDecimalDigits); //yuzdeli degerlerde kullanilan ondalik basamak sayisi
            Console.WriteLine(nfi.PercentDecimalSeparator); //yuzdeli degerlerde kullanilan ondalik ayraci
            Console.WriteLine(nfi.PercentGroupSeparator); //yuzdeli degerlerde sayi ayraci
            Console.WriteLine(nfi.PercentSymbol); //yuzde sembolu
            Console.WriteLine(nfi.PerMilleSymbol); //binde sembolu
            Console.WriteLine(nfi.PositiveSign); //pozitif sayi sembolu

} 

Metodu uygulamada çalıştırdığımızda property'lerin değerlerini aşağıdaki gibi görebiliriz:

Umarım faydalı olmuştur.

Işıl Orhanel

isil@isilorhanel.net