Como hacer un sitio multilenguaje en .Net utilizando MasterPage y archivo Global.asax - Version 2 - (Español)


Back to learning
Created: 21/06/2013
Como hacer un sitio multilenguaje en .Net utilizando MasterPage y archivo Global.asax
e implementar seleccion del idioma mediante DropDownList
Version 2 - (Español)


Para comenzar estaria mejor que miren este tutorial: Link

En este tutorial veremos como hacer un sitio multilenguaje (En este caso Spanish-English) utilizando Master Pages y archivo Global.asax.
Para aprender a trabajar con MasterPages podes mirar este tutorial: Link

1) Primero cree la estructura del sitio de la siguiente manera: 



2) Basicamente tenemos una MasterPage y 2 paginas que la implementan, tambien tenemos un simple archivo Global.asax

3) Siguiente paso abrimos el codigo html de nuestra MasterPage.master y agregamos 2 labels:

<body>
    <form id="form1" runat="server">
    <div>
        <!-- Main Menu -->
        <a href="Default.aspx">
            <asp:Label ID="Label1" meta:resourcekey="menuItemDefault" runat="server" Text="Go To Default"></asp:Label>
        </a>
        <a href="Contact.aspx">
            <asp:Label ID="Label2" meta:resourcekey="menuItemContact" runat="server" Text="Go To Contact"></asp:Label>
        </a>
    </div>

Estos labels seran mi menu en el cual se cambiara el texto de acuerdo al idioma seleccionado


a estas 2 labels le vamos a agregar las propiedades resourcekey las que mas tarde vamos a agregar a los archivos de recursos para cambiar el texto acorde al idioma


4) Inserte el DropDownList en el cual vamos a seleccionar el idioma y al mismo agregarle el evento SelectedIndexChange y no olvidarse de setear el AutoPostBack a true.


    </div>
    <br />
    <asp:DropDownList ID="DropDownList_Language" runat="server" Height="20px" Width="170px" 
        onselectedindexchanged="DropDownList_Language_SelectedIndexChanged" AutoPostBack="true">
        <asp:ListItem Value="es-AR">Spanish</asp:ListItem>
        <asp:ListItem Value="en-US">English</asp:ListItem>
    </asp:DropDownList>
    <div>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
           
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

Resultado:


5) Ahora agreguemos algo de codigo a MasterPage.master.cs

Aca basicamente en el PageLoad seteamos el idioma seleccionado actualmente en el DropDown
Durante el cambio del idioma seteamos la variable de Session "myapplication.language" a la cultura seleccionada actualmente que voy a usar en el Global.asax

Entonces: Seteamos el idioma actual en el DropDown, y seteamos la cultura en la variable de Session


    protected void Page_Load(object sender, EventArgs e)
    {
        if(Session["myapplication.language"] != null && !IsPostBack)
        {
            DropDownList_Language.ClearSelection();
            DropDownList_Language.Items.FindByValue(Session["myapplication.language"].ToString()).Selected = true;
        }
    }
    protected void DropDownList_Language_SelectedIndexChanged(object sender, EventArgs e)
    {
        switch(DropDownList_Language.SelectedValue)
        {
            case "en-US": this.SetMyNewCulture("en-US");
                break;
            case "es-AR": this.SetMyNewCulture("es-AR");
                break;
            default:
                break;
        }
        Response.Redirect(Request.Path);
    }

    private void SetMyNewCulture(string culture)
    {
        Session["myapplication.language"] = culture;
    }

Resultado:


6) Ahora vamos al archivo Global.asax.
Incluyamos los 2 namespace requeridos

<%@ Application Language="C#" %>

<%@ Import Namespace="System.Globalization" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">

and add the fallowing method:

    void Application_AcquireRequestState(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        if (context.Session["myapplication.language"] != null)
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(context.Session["myapplication.language"].ToString().Trim());
            Thread.CurrentThread.CurrentCulture = new CultureInfo(context.Session["myapplication.language"].ToString().Trim());
        }
    }


Este metodo nos va a retornar la cultura seteada actualmente en la variable de Session y la va a setear al Thread actual de nuestro sitio Web.

Resultado:


7) Finalmente vamos a agregar algunos archivos de recursos para cada lenguaje/idioma

En mi caso hice un menu multilenguaje (Para cambiar entre Español e Ingles)



Ahora agreguemos los textos al archivo contact.aspx y un simple label para intercambiar texto en la misma pagina.



8) Pagina de Contacto:

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Label ID="Label1" runat="server" meta:resourcekey="textLanguage" Text=""></asp:Label>
</asp:Content>


Resultado:
Español seleccionado


Ingles seleccionado




Puede modificar el proyecto a sus necesidades
Aca puede descargar todo el codigo fuente: Download Source

Propiedad de:

Deje sus comentarios! :)