Asp.net ile çok dilli uygulama geliştirme.

geri

Günümüzde çoklu dil (multi language) giderek önem kazanıyor. Bunun en büyük sebebi, projelerin artık ülke bazlı düşünülmüyor olması. Eskiden 2 dil bile fazla gelirken şimdilerde kullanıcı eğilimine göre bu sayı artabiliyor. Çoklu dil yapısı için bir sürü yöntem bulunuyor. Örneğin; xml, veritabanı, resource kullanmak vb.. Biz bu yazımızda resource ile çoklu dilli uygulama nasıl geliştirilir buna bakacağız.

Öncelikle mevcut bir sayfamızı kolay bir şekilde nasıl çoklu dile çeviririz buna bakacağız. Ben örnek olarak küçük bir form hazırladım.

Formumuz da textbox, dropdownlist, label, button ve validator kontrollerimiz bulunuyor. Eğer elle bu forma daha doğrusu sayfaya girişip tek tek elle değişkenleri tanımlamaya kalkarsak epey bir zamanımızı alır. Visual studio geliştiricileride böyle düşünmüşler ki bizi yormamak için Tools menüsünün altına Generate Local Resource özelliğini koymuşlar. Unutmadan bu menü sadece tasarım kısmındayken çıkıyor. Buraya tıkladığımızda bizim yerimize resource dosyası oluşturuluyor ve gerekli değişiklikler sayfamızda yapılıyor. Kaynak dosyamız App_LocalResources klasörünün altında sayfaAdi.aspx.resx şeklinde bulunuyor.

Form.aspx.resx kaynağımızın içerisine baktığımızda Name, Value ve Comment şeklide 3 alanla karşılaşıyoruz. Name alanı diğer diller içinde oluşturacağımız kaynak dosyamızla ortak olan parametreyi barındıran alanımız. Value ilgili Name alanına karşılık gelen değeri barındıran alanımız. Comment ise ilgili alanlar hakkında ki açıklamaların yazılması için bulunuyor. Bu yazdığımdan bir şey anlamamış olabilirsiniz, uygulama sırasında çok daha iyi anlayacaksınız ;)

Şimdi aynı formumuz için farklı bir dilde kaynak dosyası oluşturalım. Bunun için mevcut oluşan resx uzantılı dosyamızı aynı yere kopyalayıp yapıştırıyoruz ve adını sayfaAdi.aspx.en.resx şeklinde değiştiriyoruz, ben örneğimi İngilizce yapacağım için en ekini ekledim. Diğer diller için yapmanız gereken sadece bu eki değiştirmek. Buradan dillere bakabilirsiniz. Unutmadan bu örneği indirdiğinizde Kulturler.aspx sayfasını çalıştırdığınızda buradan da görebilirsiniz. Örneğin Fransızca için de bir kaynak oluşturmam gerekseydi kopyala yapıştır yapıp adını sayfaAdi.aspx.fr.resx şeklide yeniden adlandıracaktım.

Gördüğünüz gibi gayet basit bir şekilde sayfaAdi.aspx.en.resx dosyasının içine ilgili alanın karşısına ingilizcesini yazdık. Şimdi sayfamızda bu dil değişiminin nasıl yapılacağına bakalım.

[csharp] protected override void InitializeCulture() { string strDil; if (Request.Form["ddlDil"] == null) { strDil = "tr-Tr"; } else { strDil = Request.Form["ddlDil"]; } Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(strDil); Thread.CurrentThread.CurrentUICulture = new CultureInfo(strDil); base.InitializeCulture(); } [/csharp]

Formumuzda bulunan dropdown menüden seçtiğimiz dilin değerini post edip uyguluyoruz. Sayfa yeniden yüklendiğinde seçtiğimiz dilin kaynak dosyasını kullanıp ekrana çıktıyı o şekilde veriyor. Yani eğer İngilizce dilini seçmişsek gidip sayfaAdi.aspx.en.resx kaynağında ki bilgileri getiriyor. Eğer xml yada başka bir yöntemle çoklu dil olayını halletmeye çalışsaydık şu ana kadar geldiğimiz kısmı çok daha uzun zamanda halletmiştik. Ayrıca kaynak kullanımının bir avantajı daha var ki o da kod yazmamızı çok kolaylaştırıyor, aşağıda bahsedeceğim.

Buraya kadar sorun var mı bilmiyorum ama çok basit ve anlaşılır bir şekilde işlemimizi tamamladık. Şimdi gelelim App_GlobalResources ile kaynak kullanımına, yani kod yazarken çoklu dil mekanızmasını kullanmaya. Buda gayet basit bir işlem. Öncelikle App_GlobalResources klasörümüzü oluşturup içerisine resx uzantılı kaynağımızı ekliyoruz. Ben örneğimde varsayilan.resx olarak ekledim. İçerisine kullanacağımız değişkenleri yazıyoruz. Mantığımız yukarıda ki LocalResources ile bire bir aynı. Değişkenlerimizi yazdıktan sorna kopyala yapıştır yapıp dosya adımızı yukarda ki gibi varsayilan.en.resx olarak yeniden adlandırıyoruz. GlobalResources' i LocalResources den ayıran en büyük özellik erişim özelliği, kod yazarken global kaynağa direk ulaşabilirken lokal kaynağa ulaşamıyoruz. Hemen kodumuza bakıp üzerinden konuşalım.

[csharp] protected override void InitializeCulture() { string strDil; if (Session["dil"] == null) { strDil = "tr-Tr"; } else { strDil = Session["dil"].ToString(); }

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(strDil); Thread.CurrentThread.CurrentUICulture = new CultureInfo(strDil); base.InitializeCulture(); }

protected void Page_Load(object sender, EventArgs e) { string strDil = Request.QueryString["Dil"];

if (strDil!=null) { Session["dil"]=strDil; Response.Redirect("degisken.aspx"); }

Page.Title = Resources.varSayilan.sayfaBasligi; ltrHosgeldiniz.Text = Resources.varSayilan.hosgeldiniz; } [/csharp]

Bu örnekte session ile birlikte kullandım ki sayfamız her yenilendiğinde dil seçmek zorunda kalmayalım. Resources yazıp noktaya bastığımızda varSayilan kaynağını görüyoruz. Yani dosyamızın kök adını, tekrar noktaya bastığımızda değişkenlerimizi görebiliyor ve kullanabiliyoruz. Diğer çoklu dil sistemlerine göre bir artıda bu olay, çünkü kod yazarken değişkenleri aklımızda tutmamız bir hayli zor buda bize gidip kaynağa bakmamıza haliyle zaman kaybına sebep olacaktır. Tüm değişkenlerimizi görüp istediğimi gibi kullanabiliyoruz.

Globalizasyon ile ilgili bir sürü konu ve özellik bulunuyor. Diyelim ki onlarca sayfamız var "Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(strDil); Thread.CurrentThread.CurrentUICulture = new CultureInfo(strDil);" bu kodları her sayfaya tek tekmi yazacığız tabiki hayır, global.asax içerisine bir kere yazarak tüm sayfalarda kullanabilirsiniz. İpucu olarak degisken.aspx sayfasında birde resim yollarını bu sistemde nasıl kullarınızı örneklendirdim. Eğer web.config dosyasısından uiculture="auto" şeklinde bir ayarlama yaparsak kullanıcının tarayıcısının diline göre kaynak dosyamız okunacak ve sayfamızın o dildeki versiyonu kullanıcıya gösterilecektir. (Ne yalan söyleyeyimbunu hiç denemedim )

Evet benim yazacaklarım bu kadar, dediğim gibi globalizasyon çok derin bir konu, merak edenler buradan dallanarak araştırabilirler. Umarım faydalı bir yazı olmuştur, herkese güzel günler..

Projeyi buradan indirebilirsiniz.

2011-01-26 | asp-net