Search code examples
c#asp.netcurrentuiculture

how to pass the selected culture into InitializeCulture() method


I have a login page where the user can select his language through a radio button, after login the user is redirected to Default.aspx where I'm using the below method to set the page culture:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%>
<%@ Import Namespace="System.Resources" %>
<% @Import Namespace="System.Globalization" %>
<% @Import Namespace="System.Threading" %>
<script runat=server>
        protected override void InitializeCulture()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Session["lang"].ToString());
            base.InitializeCulture();
        }
</script>

How can I pass the selected language from the login page to this method in Default.aspx page? I tried to pass it through session but I got this error:

System.NullReferenceException: 'Object reference not set to an instance of an object.' System.Web.SessionState.HttpSessionState.this[string].get returned null.

Because this method happens in early stages before any control or session is initiated, that's why it returns null. Any idea how can I pass the selected culture to this method?


Solution

  • I found the answer, I managed to pass the selected culture info using Query String:

    in my login page I have those two radio buttons and a button:

    <asp:RadioButton ID="RadioButton1" runat="server" Text="ar-AE" />
    <asp:RadioButton ID="RadioButton2" runat="server" Text="en-US" />
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    

    in the code behind the button OnClick:

    protected void Button1_Click(object sender, EventArgs e)
        {
            if (RadioButton1.Checked)
            {
                Response.Redirect("Default.aspx?language=" + RadioButton1.Text);
            }
            else
            {
                Response.Redirect("Default.aspx?language=" + RadioButton2.Text);
            }
        }
    

    then in Default.aspx page I have this code:

    <% @Import Namespace="System.Resources" %>
    <% @Import Namespace="System.Globalization" %>
    <% @Import Namespace="System.Threading" %>
    <script runat=server>
        protected override void InitializeCulture()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.QueryString["language"].ToString());
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.QueryString["language"].ToString());
            base.InitializeCulture();
        }
    </script>
    

    I tried to use Cookie also but it returns null as well like the session, so the query string is the only way that worked for me.