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ü :
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”
Yorum Yapın
Etiketler
Son Yazılar
- Uzak sunucuda bulunan android cihaz ile otomasyon
- Mac’ de çoklu Java versiyon yönetimi
- İş yarar docker komutları
- Eski branchlerin git’ den silinmesi
- Kubernetes Süresi Dolmuş Sertifikaları Yenilemek
Son Yorumlar
- Hosting koşuşturması için
- Garanti Sanal Pos Kurulumu, Sorunlar ve Çözümler için
- Visual Studio Toolbox’a component(bileşen) eklenmesi için
- “File is too large for destination file system” hatasını gidermek için
- Php’de UTF-8 Türkçe karakter sorunu ve çözümü için
Bağlantılar
Arşivler
- Kasım 2021
- Eylül 2021
- Ağustos 2021
- Temmuz 2021
- Aralık 2020
- Kasım 2020
- Ekim 2020
- Eylül 2020
- Kasım 2017
- Mayıs 2017
- Mart 2017
- Şubat 2017
- Ocak 2017
- Nisan 2015
- Aralık 2014
- Mayıs 2014
- Eylül 2013
- Haziran 2013
- Şubat 2013
- Kasım 2012
- Ekim 2012
- Eylül 2012
- Mart 2012
- Şubat 2012
- Ocak 2012
- Aralık 2011
- Kasım 2011
- Ekim 2011
- Eylül 2011
- Temmuz 2011
- Haziran 2011
- Mayıs 2011
- Mart 2011
- Ocak 2011
- Aralık 2010
- Kasım 2010
- Ekim 2010
- Eylül 2010
- Ağustos 2010
- Temmuz 2010
- Haziran 2010
- Mayıs 2010
- Nisan 2010
- Mart 2010
- Şubat 2010
- Ocak 2010
- Haziran 2009
- Mayıs 2009
- Nisan 2009
- Mart 2009
rw.AddResource(DictionaryEntry1.Key.ToString(), Request.Form[string.Format(“ResxFiles1$TB{0}”, count)].ToString());
satırında nullreferenceexception hatası alıyorum sebebi ne olabilir?
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…
Yani anca bu kadar net anlatılabilir. İki gündür ingilizce türkçe okumadığım yazı kalmadı. Teşekkürler.
Arkadaşım,
Bu super yazı için sana ne kadar teşekkur etsem azdır , emeğine saglık 🙂
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
.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.
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
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.
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…
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.
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…
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();
hocam bu kadar sade ve derinlemesine bir anlatım harika olmuş emeğinize sağlık… teşekurler
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.
Uyarınız için teşekkür ederim. İlgili makalemi tekrardan gözden geçirip karakter sorunlarını düzenledim 🙂
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.
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 🙂
Ö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
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