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

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.

        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();
        }

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.

        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;
        }

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 :D)

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.

  • http://Websitesi bülent

    Vs için kullandıgın temanın adı ney, paylaşabilirmisin. birçok tema denedim istedigimi bir türlü tuturamadım. Kendim değiştiriyorum bazı yerlerini bir müddet sonra çorba oluyor.

    • apoStyLEE

      Merhaba, buyrun kullandığım tema.

      • http://Websitesi bülent

        Merhaba,
        Global.asax da nasıl yapabiliriz. dediğin gibi yapmaya çalıştım ama olmadı. örnek ile açıklaman mümkün mü?

        • apoStyLEE

          Merhaba;

          void Application_BeginRequest(object sender, EventArgs e)
          {
          System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
          System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture;
          }
          bu şekilde yapabilirsiniz..

          • ali

            bende yapmaya calıştım olmadı bu verdiğiniz örnekle. Lütfn bir tanede global asax ile örnek yaparmsınız?

  • Pingback: Anonim()

    • Ahmet

      Merhaba, Jquery ile resx dosyasına ulaşabilir miyiz? Ulaşamazsak nasıl default dili alarak labelları değiştirebiliriz?

      • apoStyLEE

        Merhaba, demek istediğinizi anlayamadım, biraz daha açar mısınız ?

  • Ahmet

    $(document).click(function (event) {
    var $thisid = (event.target).id;
    if ($thisid == ‘txtEmail’) {
    return false;
    }
    else {
    if ($(“#txtEmail”).val() == ”) {
    $(“#txtEmail”).val(‘E-Posta Adresiniz’);
    }
    }
    });

    E-Posta adresiniz bir textbox’ın içerisinde yazıyor. bu yazıyı resx dosyasından çekmek istiyorum. Yapabilir miyim?

    • apoStyLEE

      Eğer yukarıda ki kodlarınız .aspx sayfanızda ise direk $(“#txtEmail”).val(‘’); şeklinde kullanabilirsiniz eğer bir .js dosyasının içindeyse ilgili sayfadan değişken olarak gönderebilirsiniz. Örneğin;

      default.aspx içine
      var strEposta = “”;

      ilgili.js nin içinede
      $(“#txtEmail”).val(strEposta);

      Şeklinde istediğinizi yapabilirsiniz.

  • ural

    sayfa da user control var ise ascx dosyaları bu durumda nasıl yapacağımız konusunda bilgi var mı?

    • apoStyLEE

      User control olması kullanım açısından bir farklılık oluşturmuyor ki, aynen kullanabilirsiniz.

  • özgür

    “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.”
    web config dosyasındaki ayar şu şekilde:

    Benim sistemde 2 dil desteği var.(Tr/En),
    ancak ben Türkçe işletim sistemi ve Türkçe tarayıcı kullanmama rağmen ilk açılışta ingilizce olmakta?
    Neden acaba?

  • özgür

    evet bu şekilde :)

    • özgür

      culture=”auto” uiCulture=”auto”

  • Ahmet

    Tasarım kısmında olmama rağmen Tools menüsünde Generate Local Resource kısmını göremiyorum.

  • Abdulgani

    Apo yine harikasin :) ne zaman jquery veya boyle merak ettigim konular varsa hep sende cikiyor cevaplari. Ellerine emegine saglik.

  • Halid AYÇİÇEK

    Selamlar güzel anlatmamışsınız elinize sağlık. Yalnız bir sorum olacak dinamik veri çekerken sayfa ilk açılışa göre veriler culture göre geldi hatta bir ürüne ait detaya gittiniz ondada sorun yok. Kullanıcı detay sayfasında iken sayfanın dilini değiştirdi. sayfanın querystringi detay.aspx?id=1 Id nosu 1 olan ürün türkçe. İngilizcesi Id=2 de kayıtlı yani veritabanı nasıl olmalı ne yapmak lazım:) yardımlarınızı rica ediyorum.

    • apoStyLEE

      Selam, teşekkürler :) id si 1olan türkçe 2 olan ingilizce olursa, sadece lokalizasyonda değil diğer kısımlardada sıkıntı çıkmadı çok olası. Eğer 3 e kadar dil desteği olacaksa, ürün tablosuna “aciklama, aciklamaeng, aciklamafr” şeklinde yapabilirsiniz. Çok fazla dil olacaksa farklı bir tabloda ürüne ait text alanlarını “urunid dil tip yazi” şeklinde tutabilirsiniz.

  • Yasin

    Selam ben yaptığım projede aynen dil seçenekleri istiyorum ama tam olarak şöyle dünyanın neresinden girerse siteye o dile çevirsin mesela ben türkiyeden girdim tr ingilizce konuşulan ülkede ingilizce olması bu konuyu da yazarmısın teşekkürler.

  • Yasin

    Birde şu konu var onuda yazayım ben şunu anlayamadım mesela büyük olan şirketi olan siteler google da aratılınca mesela bir sayfa yerine alt alta login – register – anasayfa ve diğer sayfaları yer alıryor ve ilk başta çıkıyor bu nasıl oluyor ayrı bi konu olarak paylaşırmısınız.