MVC’de LanguageSessionControl Attribute’u Yazmak

Çoklu dil desteği veren MVC projelerinde kullanıcıya dil seçimi yaptırmak için sistemimiz de bulunan dil dosyalarını projemizin görsel kısmında listeletmemiz ve kullanıcının dil seçimine bırakabilmemiz için, her sayfada kullanıcı talebinden sonra çalışan Action metodumuzda dil dosyalarını veritabanında çekmek gibi bir derdimiz olacaktır.Bu durumdan kurtulmanın yollarından biriside LanguageSessionControl ismini verdiğimiz Attribute’u yazmak olacaktır.
Bu Attribute sayesinde bir Session oluşturulur ve dil dosyaları bir kere çekildikten sonra her bir kullanıcıya gösterilir.

Sitemize binlerce kişi girecek, bu Session değeri binlerce kez mi oluşturulacak? diye sorarsanız eğer hayır.Herkes için ortak bir işlem olacağından dolayı, StringDictionary sınıfından üretilen bir nesne sayesinde bu Session nesnesi tek seferde herkes için üretilecektir.

Bu Attribute’un önem teşkil ettiği nokta zaten burasıdır.Sonuçta Session oluşturulurken, sistemdeki dil dosyaları bir listeye çekilmektedir.Ee bunu her kullanıcı için bir kere yapsaydı eğer çalıştırılan her Action metod da dil dosyalarını listeletmemiz daha performanslı olurdu.Ancak bir kere sistem adına üretilen Session değerinde dil dosyaları mevcut olacak ve her kullanıcıya gösterilecektir.

Bu konuyu daha detaylı bir şekilde irdelemek için bir örnek yapacağım.Bir MVC projesi oluşturup, içinde Türkçe ve İngilizce dil dosyaları oluşturacağım.Daha sonra bu dosyaları oluşturduğum projemde kullanıcıya dil seçtirme işlemlerini(LanguageSessionControl) yaptırmak için Attribute yazacağım.

Tabi, MVC projesi oluşturmayı, dil yapılarını eklemeyi ve sisteme işlemeye ben burada değinmeyeceğim.Onları sizlere bırakıyorum.

Haliyle bu yazıyı daha iyi anlayabilmeniz için, Asp.NET MVC Çoklu Dil Fonksiyonları – 1 ve Asp.NET MVC Çoklu Dil Fonksiyonları – 2 başlıklı yazılarımı okumanızı tavsiye ederim.

Örneğimize başlamadan önce LanguageSessionControl Attribute’unu yazarken kullanacağımız SwitchLanguageHelper isimli sınıfı buradan indirebilirsiniz.

Evet şimdi elimizde bir MVC projesi mevcut ve Türkçe – İngilizce dil desteği veriyor.Veritabanında kendi oluşturduğumuz bir tabloda Resource dosyalarının kayıtlarıda mevcut.Ben “Diller” adında bir tabloda bu kayıtları tutuyorum.(ID, DilAdi, DilKodu, DilDosyasi şeklinde dört kolonum mevcut)

Bu dil yapılarını kullanıcılara seçim yapabilmeleri için Attribute’umuzu yazalım.”LanguageSessionControlAttribute” adında bir sınıf oluşturuyorum ve “ActionFilterAttribute” sınıfından kalıtım aldırıyorum.

    public class LanguageSessionControlAttribute : ActionFilterAttribute
    {
        public static StringDictionary DilSession = new StringDictionary();
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (DilSession.Count == 0)
            {
                VeritabaniDataContext Veri = new VeritabaniDataContext();
                var Diller = Veri.Dillerims;
                foreach (var item in Diller)
                {
                    DilSession.Add(item.DilKodu, item.DilAdi);
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }

Yukarıda gördüğünüz gibi “LanguageSessionControlAttribute” isimli Attribute’umuzu yazmış olduk.İncelerseniz eğer, static yapıda StringDictionary tipinden DilSession isminde bir nesnemiz mevcut.İşte bu nesne sayesinde her bir kullanıcı için tek ve aynı Session değeri açmış oluyoruz.

OnActionExecuting isimli metoddan bahsetmemiz gerekirse eğer, bu metod MVC Attribute Oluşturma başlıklı yazımızda örneklendirdiğimiz gibi, bu metodu override eden Attribute’un, kullanıldığı class ya da Action metod çalıştırılma talebi geldiği anda, önce bu metod çalıştırılır.Daha sonra, Action metod çalıştırılır.

OnActionExecuting metodu içinde, gördüğünüz gibi bazı kontroller içinde veritabanımızdaki dil yapıları DilSession ismindeki StringDictionary nesnemize eklenmektedir.

Sıra bu dil dosyalarını kullanıcı bazlı yayınlamada.

<% foreach (DictionaryEntry item in LanguageSessionControlAttribute.DilSession)
   {%>
<%: Html.LanguageSelectorLink(item.Key.ToString(), "[" + item.Value.ToString() +"]",item.Value.ToString(),null) %>
<%  } %>

Eğer projemizi son haliyle derleyip çalıştırırsak, “LanguageSessionControlAttribute” isimli Attribute ile işaretlediğimiz herhangi bir Controller katmanında ki, herhangi bir Action metod çalıştığında dil seçenekleri gelecektir.

Herhangi bir Controller ya da Action metod üzerinde “LanguageSessionControlAttribute” Attribute’unu aşağıdaki gibi tanımlayabiliriz.

[LanguageSessionControl]

Benim üzerinde çalıştığım projenin son halinin ekran görüntüsü aşağıdaki gibidir.

 DilSecim1
Gördüğünüz gibi, Türkçe dil seçeneği seçiliyken kodlarda ayarladığımız gibi bir şekilde [Türkçe] olarak gelmektedir.URL yapısınıda görmektesiniz.
DilSecim1
 İngilizce dil linkine tıkladığımız zaman ki durumu görmektesiniz.

Yazımızın konusu olan “LanguageSessionControlAttribute” isimli Attribute’u yazmayı ve projemizde ki dil dosyalarını kullanıcılarımıza listeleme ve seçtirme işlemlerini buraya kadar halletmiş bulunmaktayız.Son olarak şunları söylüyorum ki, SwitchLanguageHelper sınıfında Global.asax dosyasında kullanacağınız URL Routing şemasının adını bazı parametrelerde değiştirmeniz gerekiyor.Eğer bu sınıfı incelerseniz o parametreleri rahatlıkla bulup değiştirebilirsiniz.

Faydalanmanız dileğiyle..

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Mustafa boyraz dedi ki:

    Merhaba resource dosyalarını hazırlama gereliyormu session için neden sordum onu detaylandırayım land diiye bir tablom var id-adı-culture alan isimleri bide detail tablom var id-descireption-langid ingilizce linke tıklayınca sayfaya veri ingilizce gelmesini sağmaya çalışıyorum ama bir türlü mantığı kavrayamadım yardımcı olursanız sevinirim iyi çalışmalar dilerim

  2. Mustafa boyraz dedi ki:

    Merhaba mvc yapıda session ile sayafı ingilice olarak göstermeye çalışıyorum, lang diiye bir tablom var id-adı-culture alan isimleri bide detail tablom var id-descireption-langid ingilizce linke tıklayınca sayfaya veri ingilizce gelmesini sağlamaya çalışıyorum ama bir türlü mantığı kavrayamadım yardımcı olursanız sevinirim iyi çalışmalar dilerim

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*