Aunque en un principio lo íbamos a publicar por partes, al final, vamos a poner de golpe todo el HowTo, así como el fichero .zip tanto con el texto como con el código de ejemplo. Creo que os facilitará la comprensión del tema si lo publicamos de golpe y no a partes, no nos vaya a pasar como con Ghost in the Cell, que los veo de ciento a viento y me tengo que mirar el capítulo anterior para saber de que va el nuevo. Menos mal que lo veo desde emuleTV, que me permite repetir los capítulos, je je.
Esker anitz Jesus Mari por este HowTo!
[begin HowTo]
Definición de la cultura en la página:
En primer lugar debemos de indicar a la página la cultura que debe usar. Para ello existen dos propiedades, contenidas dentro de la clase System.Web.UI.Page:
UICulture: establece la cultura de la interface de usuario, es decir la que más tarde nos servirá para establecer relación con el texto en varios lenguajes
Culture: establece la referencia cultural en la que se basa y comporta la página; esta propiedad cambia todo lo referente a la fecha, moneda y todas las características específicas de la cultura seleccionada. No afecta a las traducciones de los diferentes lenguajes, pero en ciertos controles como Asp.Calendar, afecta también a cambiar el lenguaje.
Estas propiedades son de tipo “string“, contenidas dentro de la propia página, cuando queremos asignarles una cultura se debe poner su identificador: “es-ES”, etc., pero el valor que nos devuelve no es el identificador, sino su descripción: “Español (España)”. Para obtener el identificador actual debemos ir a la propiedad:
System.Threading.Thread.CurrentThread.CurrentUICulture.Name
Culture = System.Threading.Thread.CurrentThread.CurrentCulture.Name
Los posibles valores están definidos en el siguiente enlace, pero consta de una primera parte que es la cultura en letras minúsculas, un guión y el país en letras mayúsculas.
Aparte de un valor especifico de cultura como “es-ES”, “eu-ES”, etc., en la página existe una forma de indicar que sea la cultura predeterminada: “auto”, la cual es la que se define en el archivo de recursos por defecto (tema que se explica mas adelante).
Formas de cambiar la cultura dentro de la página:
Definida en la directiva de la página:
<%@ Page UICulture=”es-ES” Culture=”es-ES”>
Definida en el web.config: afecta a todas las páginas, excepto a las que ya lo tengan definidas en la directiva de la página (caso anterior).
<system.web>
<globalization uiCulture="es-ES" culture="es-ES" />
</system.web>
Definida dinámicamente:
Se puede definir en ejecución una cultura diferente, para ello simplemente se debe sobre escribir el evento InitializeCulture. Es en el único evento en el que se puede hacer:
protected override void InitializeCulture()
{
Page.Culture = “es-ES”;
Page.UICulture = “es-ES”;
base.InitializeCulture();
}
Creación de un archivo de recursos:
Para definir las posibles culturas, se debe realizar mediante la creación de archivos de recursos, que son de tipo xml. Estos archivos son compilados en un ensamblado satélite, en tiempo de ejecución, esto quiere decir que no es necesario compilar todo el sitio Web ni para modificarlos, ni para añadir una nueva cultura con un nuevo recurso.
Desde Visual Studio han proporcionado dos métodos para acceder a estos archivos: cursos globales y locales:
Recursos globales:
Tienen la ventaja de que son accesibles desde todo el sitio Web de donde están definidos, y que son gestionados por el “inteligence” de Visual Studio, por lo que facilita trabajo al desarrollador. Aunque tienen las desventajas del rendimiento de la página, ya que debe ejecutar el ensamblado en ejecución, y al ser global y compilar todos los recursos, le cuesta más tiempo; y al enlazar el recurso con un control Web, existen varios métodos, se explicará mas tarde, y uno de ellos bastante cómodo no existe en los recursos globales.
Se parte siempre de la base de que por cada página .aspx, debe existir un archivo que sea el idioma por defecto, el nombre de este puede cualquiera, pero se recomiendo que sea el mismo de la página, luego por cada cultura, existirá otro archivo, con el mismo nombre que el archivo de recursos principal, pero con la cultura:
Archivo por defecto:
[Cualquier nombre].resx
Archivo de cultura:
[Nombre del archivo por defecto].[cultura].resx
Estos archivos deben estar dentro del sitio Web en la carpeta
App_GlobalResources
Por ejemplo si tenemos la página “prueba.aspx”, debe existir siempre un archivo que podría ser “App_GlobalResources\prueba.resx”, que sería con la cultura por defecto, luego para la cultura en castellano “es-ES” habría que crear un archivo que sea “App_GlobalResources\prueba.es-ES.resx”, y así sucesivamente por cada cultura. Por defecto si la cultura es en castellano, intentará acceder al archivo de castellano “App_GlobalResources\prueba.es-ES.resx”, pero si al buscar una fila de la etiqueta no la encontraría se buscaría en el archivo por defecto “App_GlobalResources\prueba.resx”.
Enlazar el texto con la página en diseño:
Dentro del control se podría poner a la propiedad “Text” el siguiente valor:
Text="<%$ Resources:[Nombre de la clase], [Key de la fila] %>”
Siguiendo el ejemplo anterior, si en los archivos “prueba.resx” y “prueba.es-ES.resx” tendríamos un nodo que sería “label1Text” con un valor cualquiera, se escribiría:
<asp:Label ID="label1" runat="server" Text="<%$ Resources:RecursosGlobalesIdiomaDefWebConfig, label1Text %>" ></asp:Label>
Desde el modo diseño de la página, en la propiedades del control (F4), en “Expressions”, “Text”, aparece una opción donde si elegimos como tipo: “Resources”, clase: el nombre de la clase y “Resource Key”: la clave de la fila, auto genera lo mismo el código anterior.
Enlazar el texto en ejecución:
En modo de ejecución resulta mas fácil, gracias al “inteligence” de Visual Studio, se puede acceder cómodamente a todas los recursos de la página. Existe la clase “Resources” que contiene una colección de todas las clases de recursos, que a su vez contiene una colección con todas las claves de esa clase. Siguiendo el ejemplo anterior:
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Resources.prueba.label1Text;
}
Recursos locales:
A diferencia de los recursos globales, solo son accesibles desde la carpeta donde está ubicado la página .aspx, es decir habrá una carpeta de recursos por cada carpeta donde existen páginas, esto implica que cuesta menos su ejecución, aunque es mas difícil localizar todos los recursos en un único sitio. No aparecen en el “inteligence” de Visual Studio en la clase “Resources”, pero son más fáciles de enlazar en modo diseño.
Se parte también de la base de que por cada página .aspx, debe existir un archivo que sea el idioma por defecto, el nombre debe ser siempre el mismo que el de la página, luego por cada cultura, existirá otro archivo, con el mismo nombre que el archivo de recursos principal, pero con la cultura:
Archivo por defecto:
[Nombre de la página, incluida la extension .aspx].resx
Archivo de cultura:
[Nombre de la página, incluida la extension .aspx].[cultura].resx
Estos archivos deben estar dentro de la carpeta Web donde este la página
App_LocalResources
Por ejemplo si tenemos la página “prueba.aspx”, en la carpeta “Pruebas” debe existir un archivo que podría ser “Pruebas\App_LocalResources\prueba.aspx.resx”, que sería con la cultura por defecto, luego para la cultura en castellano “es-ES” habría que crear un archivo que sea “Pruebas\App_LocalResources\prueba.aspx.es-ES.resx”, y así sucesivamente por cada cultura. Por defecto si la cultura es en castellano, intentará acceder al archivo de castellano pero si no lo encuentra ira al archivo por defecto.
Enlazar el texto con la página en diseño:
Se puede enlazar directamente a la propiedad deseada, pero esta vez sin indicar la clase porque es un recurso local:
Text="<%$ Resources:label1.Text %>
Otra forma de enlazar que es la ventaja que tiene los recursos locales frente a los globales, es que cuando se definen, por ejemplo con el archivo “prueba.aspx.resx”, se podría definir todas las propiedades conocidas del control, como si fuera una hoja de estilos:
“prueba.aspx.resx”:
label1.Text = “hola mundo”
label1.BackColor = “Green”
Mediante la propiedad “meta:resourcekey” se puede enlazar todo el control, por ejemplo para este caso, enlazando a un control Label:
<asp:Label ID="label1" runat="server" meta:resourcekey="label1"></asp:Label>
De está forma se asigna automáticamente al a propiedad “Text” y “BackColor” del control, o las que se asignen en el futuro.
Enlazar el texto en ejecución:
Cuando son locales, no están disponibles en el “inteligence” la forma de acceder es mediante a la función “GetLocalResourceObject” que se crea en ejecución en la página. Siguiendo el ejemplo anterior:
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = this.GetLocalResourceObject("label1.Text").ToString();
}
[end HowTo]
Y como os decía por arriba del todo aquí teneis el archivico este con el texto aquí mostrado en su maquetación original más un ejemplo en código de lo explicado:
[Download]: Localizacion_de_sitios_Web_con_ASP.zip