Introduction
While seeking on the internet for a solution to implement localization within an ASP.NET application using a
MasterPage
, I realized that a lot of people have got the same problem to solve. Unfortunately, I could not find a suitable solution thus, I intended to do my own implementation.Background
The solution presented within this article uses the standard localization mechanism of the .NET framework.
Using the code
The published solution uses the
Session
object as storage for the currently selected culture. This will be initialized during the Session_Start
method that is part of the global.asax file.
If a culture change is requested by the user, the
MasterPage
changes the stored culture in the Session
object.
In a
BasePage
that inherits from Page
, the method InitializeCulture
is overridden and sets the appropriate culture information stored in the Session
object to the current thread. Therefore, every Web Form needs to derive from this BasePage
.
Let's start with the Global.asax file:
void Session_Start(object sender, EventArgs e)
{
//set english as default startup language
Session["MyCulture"] = "en-GB";
}
Alternatively, the culture can be defined in the Web.config file with the key
<globalization culture="en-GB" />
and then be processed and stored in the Session
object from the Session_Start
method.
The next step is the master page:
<%@ Master Language="C#" AutoEventWireup="true"
CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>[Smart-Soft - Masterpage with Localization Support]</title>
</head>
<body>
<form id="theForm" runat="server">
<div>
<asp:contentplaceholder id="ContentPlaceHolder" runat="server">
</asp:contentplaceholder>
</div>
<div style="margin-top:20px;">
<asp:LinkButton ID="btnSetGerman" runat="server" Text="Deutsch"
CommandArgument="de-CH" OnClick="RequestLanguageChange_Click">
</asp:LinkButton>
<asp:LinkButton ID="btnSetEnglish" runat="server" Text="English"
CommandArgument="en-GB" OnClick="RequestLanguageChange_Click">
</asp:LinkButton>
</div>
</form>
</body>
</html>
The buttons to change the culture can be either placed in the
MasterPage
directly, or in any embeddedUserControl
. In order to determine the requested language, the CommandArgument
attribute of the LinkButton
is used.
..And the code-behind of the master page:
public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void RequestLanguageChange_Click(object sender, EventArgs e)
{
LinkButton senderLink = sender as LinkButton;
//store requested language as new culture in the session
Session["MyCulture"] = senderLink.CommandArgument;
//reload last requested page with new culture
Server.Transfer(Request.Path);
}
}
The requested language, passed within the
CommandArgument
, is processed and stored in the Session
object. Afterwards, the initially requested page will be reloaded on the server side.
Last but not least, the
BasePage
:/// <summary>
/// Custom base page used for all web forms.
/// </summary>
public class BasePage : Page
{
private const string m_DefaultCulture = "en-GB";
protected override void InitializeCulture()
{
//retrieve culture information from session
string culture = Convert.ToString(Session["MyCulture"]);
//check whether a culture is stored in the session
if (!string.IsNullOrEmpty(culture)) Culture = culture;
else Culture = m_DefaultCulture;
//set culture to current thread
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
//call base class
base.InitializeCulture();
}
}
As mentioned above, the
InitializeCulture
method is overridden, and gets the stored culture from the Session
object and assigns it to the currently running thread.
No comments:
Post a Comment