Merhaba,
Herkesin farklı asp.net işleri için seçtiği farklı yöntemler vardır. Bunlardan bir tanesi de masterpage kullanarak sitede değişmeyen çoğu yerin bir sefer hazırlanması ve bu alanlardaki değişikliklerin tek yerden yapılmasının sağlanmasıdır. Bu durumda sitenin bazı içeriği haliyle sabit olacaktır ve birden fazla dil kullanılıyorsa bu dil seçiminin sayfadan yapılıyor olması çok karın ağrıtıcı bir durum oluşturabilir. Mesela sayfayı ilk defa açan birine açtığı sayfayı kendi dilinde açmak istiyorsak, bu işi her sayfada kontrol etmek istemeyiz (Aslında bu durumda Page control'ünden bir başka class yaratarak da sorun çözülebilir ancak şimdi yazacağım gibi bir çözümü de var.) ve haliyle bunu da masterpage üzerinden çözme yoluna gitmek isteyebiliriz. Masterpageler sayfa olmadığı için bu iş biraz karmaşıklaşıyor.
Aşağıya yazacaklarımı adım adım yaparsanız, sonucunuz benimkiyle aynı olacaktır.
1. Bir boş asp.net projesi açalım ve Site1.Master ve WebForm1.aspx dosyalarını ekleyelim.
2. App_LocalResources klasörünü açtığımız projenin üstüne sağ tıkladığımızda çıkan menüden Add -> Add Asp.net folder sekmesinden ekleyelim.
3. Aynı şekilde bir de App_GlobalResources klasörünü ekleyelim.
4. App_GlobalResources klasörünün altına bir resource dosyası ekleyelim ve adını Resouce1.resx koyalım.
5. Resource1.resx dosyasının üstüne iki kere tıklayarak açalım ve açılan pencere vasıtasıyla bir satır string ekleyelim. Name değeri olarak DefaultLang koyalım, değer olarak da tr yazalım.
6. Site1.Master dosyasının içine (contentplaceholder içine değil, direk olacak kendi içine); Dropdownlist (drpLang) ekleyip iki de item ekleyelim (Biri Türkçe olsun ve değeri tr olsun, öbürü de English olsun ve değeri en olsun), Label (Label1) ve son olarak da Button (Button1) ekleyelim.
7. WebForm1.aspx içine ise; Calendar (Calendar1) ve Button (Button2) ekleyelim.
8. Site1.Master ve WebForm1.aspx adıyla eklediğimiz dosyaların design pencerelerini sırayla açarak Tools -> General local resources komutunu çalıştırarak App_Localresources klasörünün altına resource dosyalarının eklenmesini sağlayalım.
9. Site1.Master.resx ve WebForm1.aspx.resx dosyalarını sağ kulakçık ile önce copy sonra App_LocalResources klasörüne paste edelim. Bu sayede Aynı dosya için ikişer tane resource dosyası elde etmiş olacağız. Yeni eklenen 'Copy of' ile başlayan dosyaların adlarını
- Site1.Master.en.resx
- WebForm1.aspx.en.resx
olarak değiştirelim. Daha sonra bu uzantısından önce en yazan dosyaların içlerini açıp yazan yazıları ingilizce olarak yazalım ve ilk yarattığımız Site1.Master.resx ve WebForm1.aspx.resx dosyalarının içeriklerini de türkçeleştirelim.
10. Projeye bir class ekleyelim ve içine şunları yazalım.
using System;
using System.Web;
using System.Threading;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Globalization;
namespace Projeadı {
public class BaseWebPage : Page {
protected override void InitializeCulture() {
string lang = string.Empty;//default to the invariant culture
HttpCookie cookie = Request.Cookies["SelLang"];if (cookie != null && cookie.Value != null) {
lang = cookie.Value;
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
base.InitializeCulture();
}
}
}
11. WebForm1.aspx dosyamızı bu yarattığımız BaseWebPage class'ından türemesi için kodundaki : Page yerine :BaseWebPage yazalım.
12. Masterpage'imizin koduna da aşağıdaki kodu koyalım. (Kontrol adları için siz kendinize göre değişiklikler yapın.)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace globalwebtemp1{
public partial class Site1 : System.Web.UI.MasterPage {
protected override void OnInit(EventArgs e) {
base.OnInit(e);
HttpCookie cookie = Request.Cookies["SelLang"];
if (cookie != null)
if (cookie.Value != null)
drplang.SelectedValue = cookie.Value;
else
setdefaultlang();
else
setdefaultlang();
}
private void setdefaultlang() {setlang(Resources.Resource1.DefaultLang, true);
}
private void setlang(string lang, bool refresh) {
HttpCookie cookie = new HttpCookie("SelLang");cookie.Expires = DateTime.MaxValue;
cookie.Value = lang;
Response.SetCookie(cookie);
if(refresh)
Response.Redirect(Request.Path); // this is for refreshing the requested page.
}
protected void Page_Load(object sender, EventArgs e) {
}
protected void drplang_SelectedIndexChanged(object sender, EventArgs e) {setlang(drplang.SelectedValue, true);
}
}
}
İşte bu kadar. Şimdi denediğinizde herşey doğru dilde görülüyor olacak. Masterpage'in kodunda bulunan cookie.Expires = DateTime.MaxValue değerini kaldırarak her girişte kullanılan browser'ın öntanımlı dil değerinin okunmasını sağlayabilirsiniz.
Tabii yukarıda da belirttiğim gibi bu sorunu çözmenin birden fazla yolu var ve yapılabileceklerin sınırı yok, ihtiyaca göre birçok şey eklenip çıkartılabilir. Ben bu yazıda yalnızca bu konuda yardığı olanlar için bir fikir vermeye çalıştım.
Umarım yardımcı olabilimişimdir. Her zaman ki gibi sorunlarınız olursa e-posta atarsanız, mümkün olan en kısa zamanda cevaplarım.
İyi çalışmaları dilerim.