Internacionalización en asp.net con c#

Hemos realizado un proyecto en el que hemos tenido que usar la técnica de internacionalización de .net. Sin embargo, hemos incluido ciertas modificaciones para facilitarnos la programación que compartimos aquí. El proyecto está realizado con páginas aspx y código separado en clases cs.

1. Ficheros de recursos para las cadenas

Las cadenas se han almacenado en sus respectivos ficheros de recursos pero tanto en la clave como en el contenido como en los comentarios se ha puesto la cadena original completa.

2. Página base de la que heredan el resto

Tenemos una página base con funciones de la que heredan el resto y en esa página incluimos la siguiente función:

public string _e(string recurso, Page pagina)
{
    string valor = "";
    if (pagina != null)
        valor = HttpContext.GetLocalResourceObject(pagina.AppRelativeVirtualPath, recurso).ToString();
    else
        valor = GetGlobalResourceObject("mensajes", recurso).ToString();
    return valor;
}

Esta función es una simplificación del acceso a recursos desde una página, usando el nombre _e para acceder a un recurso. Sin embargo, en el caso que se pase el argumento null como pagina busca en un fichero global llamado “mensajes”. Esto lo utilizamos porque normalmente toda la computación se realiza en un proyecto de clases aparte que devuelve los mensajes a presentación y como desde un proyecto de clases no se puede acceder a los ficheros de recursos, las cadenas de los mensajes se encuentran almacenadas en el fichero global.

3. Uso de la función

La forma de usar esta función en el código de una página es:

_e("La contraseña introducida no es correcta, por favor repítala", this);

Buscaría el recurso de la página con el código “La contraseña introducida no es correcta, por favor repítala” en base al idioma actual de la aplicación y lo devolvería.

En el caso del uso en la página aspx, se contemplan dos casos, cadenas dentro de controles y cadenas html:

<span><%= _e("Configuración de Centro - Usuarios", this) %></span>

 


<asp:RadioButtonList runat="server" ID="rblEstado" RepeatDirection="Horizontal">
 <asp:ListItem Text="<%$ Resources: Activos %>" Value="1" Selected="True"></asp:ListItem>
 <asp:ListItem Text="<%$ Resources: Inactivos %>" Value="0"></asp:ListItem>
 <asp:ListItem Text="<%$ Resources: Todos %>" Value="-1"></asp:ListItem>
 </asp:RadioButtonList>

En el caso de cadenas html se utiliza la misma función que antes y en el caso de cadenas dentro de controles de servidor usamos la nomenclatura de asp.net para los recursos.

Con esta pequeña función y poniendo las claves de los recursos con el mismo contenido que la cadena se aclara bastante el código, haciendo que la internacionalización en asp.net no sea demasiado compleja para el programador.