*Eh ternyata seru juga ngeblog disini, saya jadi bikin hattrick hari ini.*
Part 3: Mengubah culture pada ASP.Net
Pada part 1 saya membuat masterpage Anonymous.master. Lalu di part 2 saya mulai mengatur resource file untuk en-US dan ar-KW, dan saya beritahu juga bagaimana cara memetakan value pada setiap ASP.Net control ke resource yang mana. Eh tapi saya lupa memberitahukan cara saya untuk mengubah culture, uiculture di halaman ASP.Net.
Pertama, user ingin mengubah bahasa ke arabic (Kuwait). Mungkin setelah itu ingin kembali lagi ke English, terus bisa balik lagi ke arabic (Kuwait). Kalau begitu saya simpan kode culture ini di session sajalah, misalnya di HttpContext.Current.Session["lang"]. Sehingga saya dapat melakukannya demikian..
string
lang = HttpContext.Current.Session["lang"].ToString();
Thread.CurrentThread.CurrentCulture
= new
CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture
= new
CultureInfo(lang);
Saya punya 2 resource file untuk Anonymous.master, yaitu Anonymous.master.ar-KW.resx dan Anonymous.master.resx
Jika lang = "ar-KW", maka resource file yang dipilih adalah Anonymous.master.ar-KW.resx
Jika lang = "en-US", maka resource file yang dipilih adalah Anonymous.master.resx (default, karena gak ada Anonymous.master.en-US.resx)
Jika lang = "id" pun resource file yang dipilih adalah Anonymous.master.resx (default, karena gak ada Anonymous.master.id.resx)
Potongan kode tersebut wajib dieksekusi pada fase
InitializeCulture, oleh sebab itu saya override InitializeCulture pada
Page Class
protected
override void
InitializeCulture()
{
base.InitializeCulture();
string
lang = "en-US";
//
default
if
(HttpContext.Current.Session["lang"]
!= null)
lang
= HttpContext.Current.Session["lang"].ToString();
this.Culture
= lang;
this.UICulture
= lang;
}
Eh tapi saya gak mau copy-paste potongan kode ini di semua halaman loh, makanya saya bikin Page Class baru, katakanlah AndraPage. Supaya terlihat rapih, saya pindahkan potongan kode sebenearnya ke Class Utilities
public
class
AndraPage :
System.Web.UI.Page
{
protected
override
void
InitializeCulture()
{
base.InitializeCulture();
//
saya pindahin, tapi gak harus, supaya rapih aja buat yang baca tutorial
Utilities.InitLanguage(this);
}
}
Karena saya akan menyimpan informasi culture code di Session, berarti saya perlu fungsi untuk mengubah informasi ini pada Session
Saya letakkan saja di Utilities
public
class Utilities
{
public
static void InitLanguage(Page
page)[....]
public
static void
SwitchLanguage()
{
if
(HttpContext.Current.Session["lang"]
!= null &&
HttpContext.Current.Session["lang"].ToString()
== "ar-KW")
{
HttpContext.Current.Session["lang"]
= "en-US"; //
if arabic, switch to en
}
else
{
HttpContext.Current.Session["lang"]
= "ar-KW"; //
if not arabic, switch to arabic
}
// refresh
HttpContext.Current.Response.Redirect(HttpContext.Current.Request.CurrentExecutionFilePath);
}
}
Informasi pada Session memang sudah berubah, tapi event InitializeCulture di Page sudah dipanggil sebelum Session ini berubah.
Makanya saya refresh lagi halaman yang dipanggil user.
Supaya informasi yang baru ini disertai dengan tampilan yang baru.
Dan saya ingin SwitchLanguage() dipanggil,
ketika user menekan LinkButton yang saya buat di masterpage Anonymous.master
<asp:LinkButton
ID="BtnLang"
ValidationGroup="Language"
meta:resourcekey="btnLang"
runat="server"
OnClick="btnLang_Click"
/>
protected
void btnLang_Click(object
sender, EventArgs
e)
{
Utilities.SwitchLanguage();
}
Jangan lupa menggunakan AndraPage, instead of System.Web.UI.Page