Mar
16

Resx (Resource) dosyalarının içeriğini düzenlemek veya yenisini oluşturmak – Bölüm 3

İkinci bölümü okumak için aşağıdaki linke tıklayınız ;
Resx (Resource) dosyalarının içeriğini düzenlemek veya yenisini oluşturmak – Bölüm 2

Arkadaşlar geldik yazımızın en son bölümüne. Bu bölüm en civ civli ve en önemli bölüm 🙂 . Daha önce benden böyle bir bileşen yazmamı istemişlerdi. Tabi kod yazmak yerine bu işe yarayan kodu bulmak netin altına üstüne getirdim. Zaten netin büyük bir çöplük olduğunu düşünürsek böyle bir bileşen bulabilmek için girmediğim site kalmadı. Sadece bi yerde bununla alakalı bişiler vardı ama oda haliyle çalışmayan bileşendi 🙂 . Bende bu bileşeni kendim yazmaya karar verdim.

Bu konuyla ilgili örnek projeyi sayfanın sonunda indirebilirsiniz.

Kodlarla ile ilgili bazı şeyleri açıklamam gerekirse ;


using System.IO;
using System.Resources;
using System.Globalization;

ilk olarak “ResxFiles.ascx” user kontrolume yukarıda yazan kütüphaneleri ekledim.

Burada anlatacağım sadece bir yer var orayı anlattıktan sonra kod dosyasında bulunan fonksiyonların ne işe yaradıklarını anlatacağım 🙂

“DDLresources” adlı DropDownListe resx dosyalarımın projedeki yerlerini gösterdiğim yerdir.


<asp:DropDownList ID="DDLresources" runat="server">
<asp:ListItem Value="~/App_GlobalResources/Resources.resx">Global Resources</asp:ListItem>
<asp:ListItem Value="~/App_LocalResources/Default.aspx.resx">Local Resources</asp:ListItem>
</asp:DropDownList>

Yukırda kodda olduğu gibi resx dosyalarımın yolunu (path) ListItem ın değerine (Value) veriyorum. Sizde ne kadar resx dosyanız (Resource) var ise buraya ekleyerek istediğiniz gibi bunların içini düzenleyip eğer yeni dil ekleyecekseniz bunları kendiniz elinizle oluşturmadan buradan oluşturabileceksiniz. 🙂

Size şimdi fonksiyonların ne işe yaradıklarını anlatacağım ;

  • fillDDLlang() : Bu fonksiyon .Net projesinin desteklemiş olduğu dilleri bir dropdownlist ‘ e eklememize yardımcı olmaktadır.
  • readAndFillTurkResxFile() : Bu fonksiyon ile TextBox larımıza türkçe girilmiş olan değerleri atıyoruz.
  • readAndFillOtherResxFile() : Bu fonksiyonu readAndFillTurkResxFile() fonksiyonunda çağırıyoruz. Bunun yaptığı işlemi açıklamak gerekirse, bu ilgili resx dosyası var ise bize bunun içindeki bilgileri getirip, ilgili TextBox ların içini doldurmamıza yaramaktadır.
  • writeResxFile() : Bununla bilgilerini girmiş olduğumuz resx dosylarının içini kaydettiğimiz, eğer resx dosyası projemizde yok ise oluşturarak içerikleri doldurduğumuz yerdir.
  • createResXFile() : writeResxFile() fonksiyonunda çağırıyoruz eğer ilgili resx dosyası yok ise ilgili yere oluşturmaktadır.

Eğer bu sistemi projenize ekleyecek iseniz “ResxFiles.ascx” adlı user controlu projenize koymanız yeterli olacaktır. Burada dikkat edilcek tek şey ;


<uc1:ResxFiles id="ResxFiles1" runat="server"></uc1:ResxFiles>

User controlu sürükle – bırak ile sayfanıza eklediğinizde yukarıdaki kod şeklinde sayfanıza ekleyecektir. Burada user kontrolun id sini kesinlikle değiştirmemeniz gerekmektedir (ResxFiles1). Değiştirmeniz durumunda verileri alamayacaksınız ama ;


Request.Form[string.Format("ResxFiles1$TB{0}", count)].ToString()

Eğer olduki değiştirmeniz gerekti o zaman, ResxFiles.ascx.cs dosyasının içerisine gelerek  “ResxFiles1” yerine artık yeni ismi ne ise onunla değiştirmeniz gerekmektedir.

Bu sistemi projenize eklediğinizde yapmanız gereken bir durum daha olacaktır. O da aşağıdaki kütüphaneyi projenize referans olarak eklemeniz gerekmektedir.


System.Windows.Forms

Eğer Projeye referans eklemeyi bilmiyorsanız,  aşağıdaki linkteki yazıyı okuyarak öğrenebilirsiniz ;
.Net projelerine Referans (Reference) eklemek

Yukarıdaki kodda  yazan kütüphaneyi projenize referans olarak ekledikten sonra user kontrolu gönül rahatlığı içinde kullanabilirsiniz 🙂

Projede İngilizce resx dosyasındaki verileri güncellerken ki ekran görüntüsü :

resxfile_screenshot

NOT : Bu yazıyı başka yerlerde gönül rahatlığı içinde kullanabilirsiniz. Ama lütfen emeğe saygı adına referans vermeyi unutmayınız…

Yapmış olduğum örnek projeyi ve ilgili “ResxFiles.ascx” dosyasını indirmek için tıklayın.

19 yorum bulunmaktadır - “Resx (Resource) dosyalarının içeriğini düzenlemek veya yenisini oluşturmak – Bölüm 3”

  • ! 09 Ekim 2009, 13:43

    rw.AddResource(DictionaryEntry1.Key.ToString(), Request.Form[string.Format(“ResxFiles1$TB{0}”, count)].ToString());

    satırında nullreferenceexception hatası alıyorum sebebi ne olabilir?

  • Enes Pekkaya 10 Ekim 2009, 21:16

    Hatanın sebebi şudur : Büyük ihtimalle siz resx dosyasını sürükleyip bir sayfaya eklediniz ve resx dosyasına kendi kendine bi tagname eklemiştir. Benim kullandığım tagname ResxFiles1 dir. Eğer sizin kullandığınız farklı ise “(Değişecek yer)$TB{0}” (Değişecek yer) yazılı yere yeni tagname’i eklerseniz sorununuz çözülecektir.

    İyi çalışmalar…

  • Erhan 14 Ocak 2010, 00:35

    Yani anca bu kadar net anlatılabilir. İki gündür ingilizce türkçe okumadığım yazı kalmadı. Teşekkürler.

  • vedat g 12 Şubat 2010, 19:29

    Arkadaşım,

    Bu super yazı için sana ne kadar teşekkur etsem azdır , emeğine saglık 🙂

  • Serdar 06 Haziran 2010, 10:06

    Merhabalar, resx makalenizi okudum ve inceledim fakat bir sıkıntım var benim projemde dil kodları session olarak saklanıyor ve veritabanından gelen verileri session okutarak değiştirebiliyorum. peki bu resx dosyalarını session a göre nasıl değiştirebilirim bu konuda yardımcı olursanız sevinirim

  • Enes Pekkaya 06 Haziran 2010, 10:08

    .Net in kendine özgü dil kodları bulunmaktadır ve buna göre resx dosyası oluşturulmaktadır. Eğer senin oluşturmuş olduğun dil kodların .net ile aynı ise herhangi bir sorunun olacağını zannetmiyorum. Ama yok aynı değil ise (Ör: .net de türkçe kodu “tr-TR” sende “tr”) ise örnekteki gibi “tr” ise senin ilgili sayfanın culture ını değiştirirken bunu “tr-TR” ye dönüştümen lazım.
    Bu durum senin sorununu çözecektir.

  • Serdar 08 Haziran 2010, 08:31

    Merhaba üstad

    Öncelikle yardımın için çok teşekkür ederim makaleni tekrar gözden geçirdiğimde yaklaşık 4 gündür uğraştığım sorunlarımı querystring olarak çözdüm. ben durumu global.asax da cookie ile hazırlamaya çalışıyordum fakat bir çok noktada hata yapmışım ve kodlarımı değiştirip senin yolunu izleyerek querystring e dönüştürdüm. şu anda hazırladığım scriptim canavar gibi çalışıyor fakat ufak bir noktada takıldım kaldım. Durumu aşağıda özetledim

    dropdown a dil kodlarımı veritabanından çektim ve query olarak gönderdim (dropdown ı master page e aldım selected_change özelliğini açtım) ve aldığım sonuç

    Default.aspx?lang=en-US / Default.aspx?lang=tr-TR / Default.aspx?lang=de-DE şeklinde gayet güzel çalışıyor. birde bu sayfaya bir yenilik ekleyip dinamik menüler ekledim ve bu menülerden birine tıkladığım beni

    icerik.aspx?mn=31&lang=en-US sayfasına yönlendiriyor ve bu noktadada gayet güzel sonuç alıyorum fakat tahmin etmişsindir takıldığım nokta Request.RawUrl kısmı oldu. bu kısım için bir kaç kod yazdım fakat bir türlü başarılı sonuca ulaşamadım

    ilk olarak

    Response.Redirect(string.Format(Request.RawUrl+”?” + “lang={0}” , this.DropDownList1.SelectedValue));

    şeklinde denedim fakat ne yazıkki doğru sonuç bu değilmiş bunu farkettim senden ricam uygun görürsen yukarıdaki kodu icerik.aspx?mn=31&lang=en-US kısmında dil değiştiğinde sadece lang=en-US kısmında en-Us dil kodunu değiştirecek şekilde ayarlaman olacak. Umarım bu ufak yardım çağrım için beni mazur görürsün

    İyi Çalışmalar

  • Enes Pekkaya 08 Haziran 2010, 08:36

    Merhaba Serdar,

    İlgili kod parçasını aşağıda gönderiyorum;

    string url = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.IndexOf(“?”)); // Burada parametreleri atıp sadece ilgili urlyi alıyorum.

    Response.Redirect(string.Format(“{0}?lang={1}” , url, this.DropDownList1.SelectedValue)); //Burada ilgili sayfaya yönlendirme yapılmaktadır. Eğer daha fazla parametre yollaman gerekiyorsa soru işaretinden sonra eklemen yeterli.

  • EG 06 Temmuz 2010, 09:51

    Merhaba,
    Size sorum su :

    Benim yaptıgım sıtede 4 dıl destegı var ve bırden fazlaa dropdownlist olacak(Bu dropdownlistler her dıl ıcın ayrı ayrı doldurulacak.)Ayrıca daha ılerde bu dıllere baska dılller de eklenebılırmıs.Bu sebeple sızın yaptıgınız ornegın cok yararı oldu.

    Sorun su kı bn resource dosyalarında bu dropdown lıstlerın dıller ıcınde donusumunu nasıl yapacagımı bulamadım.

    ornegın:
    Turkce: ingilizce:

    Mudur director
    personel employee

    Bu verıler dropdown liste olacaktır.

    Bunları bu sekılde resource dosyaqsında, dropdown lıst ile nasıl yapacagım?

    Tesekkurler…

  • Enes Pekkaya 06 Temmuz 2010, 10:14

    EG benim anladığım kadarıyla sen dillere dropdown listler oluşturup bunları birbirleriyle eşleştirmek istiyorsun. Aslına bakarsan bu iş bana pek olmaz gibi gelmektedir. Nedeni basit, sen mesela sitene yeni bir dil eklediğinde yazılımcı olarak sitene yeni bir resx dosyası oluşturman gerekecek. Buda ne olursa olsun hem sana ilerde zaman açısından sıkıntı yaratabilir hem de yapmış olduğun sitenin esnekliğini yitirmiş olursun. Eğer fikrimi soracak olursan dropdownlistlerle uğraşmaktansa kullanıcının karşına bir textbox göstermek çok daha mantıklı olur. Diğer türlü sen kullanıcının sadece eşleştirme yapabilmesine olanak sağlarsın.

  • Burhan Karaman 27 Mart 2011, 21:32

    Meraba,

    Emeğine Sağlık, Başarılı olmuş, Size sorum şu olacak;

    Kontrollerin statik textlerini resx dosyalarıyla değiştirebiliyoruz, eğer bir aspx dosyasının source kısmında;

    xxx

    gibi bir kodun “xxx” yazan yerde dil değişikliği nasıl yapabiliriz…

  • Enes Pekkaya 27 Mart 2011, 22:49

    Aşağıdaki örnek kod ile yapabilirsiniz. “Resources.resx” adlı dil dosyası ve “Lsearch” ise dosyasının içindeki değer.

    <asp:Literal ID="Literal3" runat="server" Text='’>

    Bu arada aşağıdaki gibide kod kısmından gerekli bilgilieri dil dosyasından alabilirsiniz.

    this.GetGlobalResourceObject(“Resources”, “Lsearch”).ToString();

  • umut ahmet 04 Nisan 2011, 10:11

    hocam bu kadar sade ve derinlemesine bir anlatım harika olmuş emeğinize sağlık… teşekurler

  • Oğuz 23 Mayıs 2011, 14:33

    Ellerinize emeğinize sağlık. Bende bu tip bir makale arıyorum. Ancak makalelerinizde bazı karakter sorunları var.

    Ltext.Text = this.GetLocalResourceObject("Ltext.Text").ToString();

    Gibi. Umarım bunları düzenlersiniz. Tekrar tekrar teşekkürler.

  • Enes Pekkaya 23 Mayıs 2011, 14:49

    Uyarınız için teşekkür ederim. İlgili makalemi tekrardan gözden geçirip karakter sorunlarını düzenledim 🙂

  • murat 21 Ekim 2012, 20:27

    Enes slm,

    publish to web yaptıktan sonra bu dosyaları nasıl düzenleyebiliriz. Bu kaynak dosyaları dll içerisine yazılıyor ve senin gösterdiğin path’de bu dosyalar yer almıyor. Teşekkürler.

  • Enes Pekkaya 22 Ekim 2012, 12:55

    Merhaba Murat,

    bu kodları güncellemek için publish yapmadan önce ilgili düzenlemeleri yapmanız lazım. Yoksa dll olmuş bir dosyadaki hiçbir kodu düzenleyemezsiniz. En azından bildiğimiz yöntemlerden 🙂

  • Mücahit Aktaş 22 Nisan 2014, 16:01

    Öncelikle bilginizi paylaştığınız için çok teşekkür ederim.iki günlük arama sonucunda sizin yönteminizle uyguladım daha publishi denemedim ama şu an çalışıyor.Benim yaptığım yanlışı aktarıyorum.Null Reference Exception hatasında tagname olarak heryeri düzelttim sonra buldum forma eklerken “ID” kısmına yazdığımız isimle aynı olacak.(Bunu denemeyle yapamayacak biri sanmıyorum ama gene de yazayım gözden kaçıranlar için)

    İkinci olarak vs 2013 .net 4 versiyonunda ise web.configde eklemediğim tag yüzünden ResXResourceReader gözükmüyordu.Ben bayağı bir kurcalama sonucu çözdüm;
    Öncelikle bu sebeple gelen hata mesajı şudur ;

    stream is not a valid resource file localization

    WEB.CONFİG’de compilation ve assemblies altına şu tagı ekleyerek çalıştırabilirsiniz

  • Samet OKUTAN 08 Kasım 2017, 16:11

    Merhaba Hocam;

    Diyelim Arapça dilini ben düzenledim ve ana sayfa’da Arapça ya tekrar çektiğimde
    Dosya başka bir işlem tarafından kullanıldığından bu işlem dosyaya erişemiyor.
    Bunun çözümü nedir hocam

Yorum Yapın

 

Twitter'dan Takip Et! Twitter'dan Takip Et!

Etiketler

Son Yazılar

Son Yorumlar

Haftanın Özlü Sözü

Akıllı bir adam yalnız kendi tecrübelerinden, çok akıllı bir adam başkalarının da tecrübelerinden yararlanır. (Çin Atasözü)

Bağlantılar

Arşivler