Makale Özeti

Özellikle birden fazla ülkede kullanılan uygulamalar yazan yazılım evlerinin veya uluslararası firmaların IT departmanlarında çalışan yazılım geliştirici ve yazılım mimarlarının en büyük sorunlarında biri uygulamalarının kurulacağı ve çalışacağı ülkeye uygun olarak geliştirilebilmesidir.

Makale

Uygulamaları yerelleştirme (Localization)

Özellikle birden fazla ülkede kullanılan uygulamalar yazan yazılım evlerinin veya uluslararası firmaların IT departmanlarında çalışan yazılım geliştirici ve yazılım mimarlarının en büyük sorunlarında biri uygulamalarının kurulacağı ve çalışacağı ülkeye uygun olarak geliştirilebilmesidir.

Uygun çalışmadan kastımız , kullanıcı arayüzlerindeki ifadelerin, para biriminin , tarih formatının uygulamanın çalıştığı  ülkeye göre değişebilmesi ve o ülkenin standartında olmasıdır.

Yukarıda belirttiğimiz firmalarda çalışan kişiler geçmiş dönemde yazdıkları uygulamarında bu sorunu tabiki bir şekilde çözmüşlerdi.Bunun için text dökümlar içerisine her ifade için bir satır halinde değerler girmişler , dosya adını kendi uygulamarının anlayacağı bir formatta vermişler, ve kendi kurdukları bir mantık çerçevesinde  uygulamalarının arayüzlerini yerelleştirmişlerdir. Bunun gibi farklı çözümler bulunmuş ancak bir yazılım diliyle gelen standart olmaması nedeniyle bunlar kişisel veya firmaya özgü çözümler olarak kalmışlardır.

.Net i geliştiren ekip bu konu üzerinde de çalışmış , ve .Net içerisine tüm dünyada çalışabilecek uygulamalar yazabilmemiz için gerekli sınıf kütüphanelerini koymuştur.

Bu yazımızda bu sınıf kütüphanelerini ve nasıl kullanabileceğimizi inceleyeceğiz.

Konumuzu bir örnek üzerinden giderek incelemek istiyorum. İki butonlu bir form hazırlayalım. Butonlardan birine basınca Türkçe formatlı tarih , diğerine basınca ise ingilizce formatlı tarih  bir mesaj ekranında çıkacak.

 

Şimdi butonların kodlarını inceleyelim.

Türkçe Tarih Formatı etiketli butonun kodu:

System.Threading.Thread.CurrentThread.CurrentCulture= new System.Globalization.CultureInfo("tr-TR");

MessageBox.Show(DateTime.Today.ToShortDateString());

İngilizce Tarih Formatı etiketli butonun kodu:

System.Threading.Thread.CurrentThread.CurrentCulture= new System.Globalization.CultureInfo("en-US");

MessageBox.Show(DateTime.Today.ToShortDateString());

Butonların kodları arasındaki tek fark , koyu fontlarla yazılmış olan tr-TR ve en-US değerleridir. Bu değerler kullanılacak lokasyon kodlarını gösterir.

tr değeri dilin Türkçe olduğunu TR ifadesi ise lokasyonun Türkiye olduğunu gösterir. Kanada lokasyonlu İngilizce formatı için en-CA, Amerika lokasyonlu  İngilizce formati içinse en-US kodu kullanılabilir.

Uygulamalar çalıştırıldıklarında , çalıştırıldıkları işletim sisteminin bölgesel ayarlarını kullanarak hangi lokasyonda çalıştıklarını ve hangi bölgesel ayarları kullanmaları gerektiğini bulurlar ve bu değerleri  öndeğer (default) olarak kullanırlar. 

Uygulamanın kullanması gereken lokasyonu değiştirmek istediğimizde bunu uygulamanın çalıştığı Thread in lokasyonunu istediğimiz şekilde değiştirerek yapabiliriz. Bu değişikliği System.Threading.Thread.CurrentThread.CurrentCulture özelliğine istediğimiz lokasyonu içeren System.Globalization.CultureInfo sınıfının yeni bir instance ını yaratarak yapabiliriz.

Örneğimizdeki İngilizce Tarih Formatı etiketli butondaki System.Threading.Thread.CurrentThread.CurrentCulture= new System.Globalization.CultureInfo("en-US"); ifadesi ile  uygulamanın çalıştığı dili İngilizce lokasyonu ise Amerika olarak değiştirdik. Bu butona tıklandığında gelen mesaj kutusunda tarih 10/1/2004 şeklinde Amerikan standartında gözükür. Yine örneğimizdeki Türkçe Tarih Formatı butonunda uygulamının çalıştığı thread in dilini Türkçeye lokasyonunu da Türkiye çeviriyoruz. Bu butona tıklandığında ise mesaj kutusunda tarih 01.10.2004 şeklinde Türkçe standartında gelecektir.

System.Threading.Thread.CurrentThread.CurrentCulture özelliğine atayacağımız lokasyon değerleri tarih formatı dışında ,saat , para birimi gibi değerlerin de lokalize edilebilmesini sağlar.

Tarih , saat, para birimi gibi değerleri değiştirebiliyoruz, peki ekrandaki sabit yazıları nasıl değiştirebiliriz.

Kullanıcı arabiriminde yapılabilecek yerelleştirmeleri bir Windows uygulaması üzerinden anlatmaya çalışacağım.

  1. Uygulamamıza yeni bir Windows Form ekleyelim.

  2. Form un Özelliklerinden Localizable özelliğini TRUE yapalım.

  3. Form un özelliklerinden Language özelliğinide Turkish (Turkey) seçelim.

  4. Solution Explorer Penceresini açalım. Show All Files opsiyonuna tıklayalım. ve yarattığımız yeni Form un yanındaki + işaretli kutuya tıklayarak Forma bağlı diğer dosyalarıda görelim. Görüntü aşağıdaki gib olacaktır.

Yukarıda da göründüğü gibi yarattığımız Form a bağlı 3 adet .resx uzantılı dosya bulunuyor.Bu dosyalara Resource Files (Kaynak Dosyalar) denir.Dosyaları teker teker açtığımızda her dosya içinde aşağıdaki bilgiler bulunacaktır.

  • Form3.resx dosyasında Form a ait tüm bilgiler

  • From3.tr.resx ve Form3.tr-TR.resx dosyalarında ise hiçbirşey olmayacaktır.

Aşağıdaki şekilde From3.resx dosyasının içeriğini görebilirsiniz.

Şimdi formumuza bir label kontrolü ekleyelim ve kontrolümüzün Text özelliğine "label1" yerine "Türkçe" yazalım. Form3.tr-TR.resx dosyasını açtığımızda göreceğizki , Forma eklediğimiz label kontrolüne ait tüm özellikler burada mevcut. Ancak halen Form3.tr.resx dosyasında hiçbirşey olmayacaktır. Bunun nedeni ise Formun Language özelliğinin Turkish (Turkey) seçilmiş olmasıdır. Sadece Turkish seçmiş olsaydık, o zaman eklediğimiz kontrollere ait özellik bilgileri Form3.tr.resx dosyasında yer alacaktı.

 

Peki aynı formun İngilizce versiyonu için ne yapmalıyız.

  1. Uygulamamıza yeni bir resource dosyası eklemeliyiz.

  2. Uygulamamızın adının üzerine sağ tıklayıp Add/Add New Item seçeneğini seçelim.

  3. Açılan pencereden Assembly Resource File ı seçelim ve yaratılacak dosyanın adı "Formumuzun adı .en-US.resx" (Örneğimizde Form3.en-US.resx olacak)  olarak değiştirelim ve Open butonuna basarak dosyanın uygulamamıza eklenmesini sağlayalım.

  4. Yaratılan dosyayı çift tıklayarak açalım. İçinde hiçbirşey olmayacaktır.

  5. Açılan  ekranda ilk satırda name kolonuna  kontrolümüzün hangi özelliğini değiştireceğimizi girelim. Örneğimizde label1.Text olacaktır.

  6. Hemen yanındaki value kolonuna da görüntülenecek değerin İngilizce karşılığını girelim. Ben English girdim.

Ekran görüntüsü aşağıdaki gibi olacaktır.

Peki yarattığımız bu İngilizce içerikli dosyayı nasıl kullanacağız. Bunun için Formumuza hemen bir tane  buton ekleyelim ve içine aşağıdaki kodu yazalım.

System.Threading.Thread.CurrentThread.CurrentUICulture= new System.Globalization.CultureInfo("en-US");

System.Resources.ResourceManager rm= new System.Resources.ResourceManager(typeof(Form3));

label1.Text=rm.GetString("label1.Text");

Kodumuzu inceleyecek olursak; ilk satırda uygulamamızın çalıştığı lokasyonu İngilizce-Amerika  olarak atıyoruz. İkinci satırda resource dosyamızı okuyabilmek için ResourceManager sınıfından rm isimli bir nesne yaratıyoruz. Üçüncü satırda ise label1 isimli kontrolümüzün Text özelliğine , ResourceManageer sınıfının GetString Metodunu kullanarak resource dosyamızdaki label1.Text isimli satırının değerini atıyoruz. Uygulamamızı çalıştırıp butona tıkladığımızda label1.Text in içeriği English olacaktır.

Burada doğru resource dosyasını bulma işini uygulamanın çalıştığı lokasyon değerine bakarak CLR (Common Language Runtime) yapıyor. 

Satellite Assemblies

Yarattığımız resource dosyaları ile birlikte uygulamamızı derlediğimizde , derleyici ProjeAdı.resources.dll (Örneğimizde Localization.resources.dll) isimli assembly ler yaratır. İşte içerisinde lokasyona özel içerik bilgileri bulunan bu assembly lere Satellite Assembly denir. Uygulamamızda birden fazla dilde resource dosyası yaratmışsak oluşacak assemlylerin hepsi aynı isimde ancak farklı dizinler altında oluşur. Örnek uygulamamızın çalıştığı dizine baktığımızda tr, tr-TR ve en-US isimli üç farklı dizin göreceğiz. CLR doğru satellite assembly i bulunduğu dizinin adında çözer. Uygulamamızın çalıştığı lokasyonu İngilizce-Amerika olarak değiştirdiğimiz için CLR bu durumda çalıştığı dizindeki en-US isimli dizindeki resource dosyasını secip istediğimiz satırın değerini atar.

Resource Generator (resgen.exe)

Resource Generator (resgen.exe), text (.txt)  veya  xml tabanlı (.resx)  dosyalarını , CLR tarafından okunabilen veya Satellite Assembly e çevrilebilen  binary dosyalar haline getirir.

Örneğin : içinde label1.Text=English bir text dosya yaratalım. Dosyanı adıda en-US.txt olsun.

Command Prompt ekranını açıp içerisine "resgen en-US.txt "yazıp çalıştıralım. Aynı dizinde en-US.resource isimli bir resource dosyası oluşacaktır.

Al (Assembly Linker) ile "al /t:lib /embed:en-US.resources /culture:en /out:App.resources.dll " satırını komut satırından yazarak bir resource dosyasından bir Satellite Assembly yaratabiliriz.

Yarattığımız assembly i yazacağımız uygulamalar içinde kullanabiliriz.

Sonuç

Birden fazla ülkede çalışan uygulamalar geliştiren firmalar ve uygulama geliştiriciler için .Net yukarıda anlattığımız yetenekleri oldukça etkin ve esnek bir yazılım geliştirme ortamı sunmaktadır. Sorularınız için cemkubilays@hotmail.com adresinde e-maillerinizi bekliyorum.