Ficheros de recursos en Silverlight

Pues como lo prometido es deuda, en esta ocasión toca hablar sobre localización de aplicaciones Silverlight y más concretamente de cómo en el código XAML se puede indicar que use una cadena que se encuentra en un fichero de recursos.

Para este ejemplo he creado un proyecto de tipo “Silverlight Application” usando Visual Studio 2008 SP1 y Silverlight 3.

Una vez hecho, esto, he añadido al proyecto que contiene los ficheros xaml dos ficheros de recursos, dos ficheros resx; uno para la cultura por defecto y otro para la cultura ingles americano (en-US).

Les he llamado FicheroRecursos.resx y FicheroRecursos.en-US.resx

image image

Una vez hecho esto, en cada uno de los ficheros he añadido una nueva entrada llamada “Cadena”. En el archivo por defecto he puesto el valor por defecto y en el otro el valor en ingles.

El siguiente paso es indicar en la aplicación Silverlight las culturas que ésta va a soportar; en nuestro caso bastaría con indicar la cultura “en-US”, porque en el resto de los casos sacaría los valores del fichero de recursos por defecto.

Para hacer esto, lo primero que tenemos que hacer es descargar el proyecto que contiene los ficheros xaml de la solución (Unload Project) y editar el fichero .csproj…con el editor de VStudio, con el notepad o con lo que queramos.

En el tag supportedCultures tenemos que añadir todas las culturas que queremos que soporte. Si hay varias, debemos separarlas por punto y coma.

<SupportedCultures>es-ES;en-US</SupportedCultures>

 

Una vez hecho esto, tenemos que volver a cargar el proyecto(Reload Project).

image

El siguiente paso es hacer los cambios necesarios para que desde el código XAML podamos tener acceso a las cadenas que hay dentro del fichero de recursos.

Cuando hemos creamos el fichero de recursos habréis visto que se ha creado un fichero llamado FicheroRecursos.Designer.cs que contiene una clase llamada “FicheroRecursos” que posibilita el acceso a las cadenas definidas dentro del fichero.

El “problema” es que por defecto tanto la clase como el constructor están declarados como internal y por tanto, no podremos acceder desde el código XAML directamente.

internal class FicheroRecursos {

private static global::System.Resources.ResourceManager resourceMan;

private static global::System.Globalization.CultureInfo resourceCulture;

[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal FicheroRecursos() {
}

……..

 
Primero haremos que la clase sea pública. Para ello, seleccionamos el fichero de recursos y lo podemos como “public”. De esta manera ponemos la clase como pública, pero el constructor sigue siendo “internal”.
image
Ya que el constructor sigue siendo “internal”, nos vemos obligados a crear una clase pública con un constructor público que nos haga de intermediario para poder acceder a la clase del fichero de recursos.
 
La clase intermediaria sería algo así: (esta es la clase que usaremos desde el XAML)
 
public class ClaseAccesoRecursos
{
public static FicheroRecursos ficheroRecursos = new FicheroRecursos();

public FicheroRecursos FicheroRecursos { get { return ficheroRecursos; } }
}

Una vez hecho, esto, tenemos que editar el fichero App.xaml y añadir la siguiente declaración: (SilverlightAppSample es el namespace de ClaseAccesoRecursos)

<Application.Resources>
<local:ClaseAccesoRecursos xmlns:local ="clr-namespace:SilverlightAppSample"
x:Key="ClaseAccesoRecursos" />
</Application.Resources>

Y ya por fin, podremos usar las cadenas dentro del código XAML. Si nuestra aplicación tiene un Label, la sintaxis para indicarle que use una cadena que está en un fichero de recursos sería así:

<dataInput:Label Content="{Binding FicheroRecursos.Cadena, Source={StaticResource ClaseAccesoRecursos}}"></dataInput:Label>

Ya para terminar, tenemos que configurar la aplicación web para que se adapte a la cultura del navegador y que la aplicación Silverlight haga lo mismo.
 
Como vimos en el WebCast, en el fichero de configuración de la aplicación web podemos añadir lo siguiente:
 
<globalization uiCulture="Auto" culture="Auto"/>

Una vez hecho, editaremos el fichero aspx que sirve para probar la aplicación (SilverlightAppSampleTestPage.aspx) para que le pase como parámetro la cultura que tiene que utilizar.
 
Dentro del control object añadiremos lo siguiente:
 
<param name="uiculture" value="<%=System.Threading.Thread.CurrentThread.CurrentUICulture%>" />  
<param name="culture" value="<%=System.Threading.Thread.CurrentThread.CurrentCulture%>" />

Y con esto ya está, ya hemos llegado al final. ¿Un poco lioso? Pues sí, pero de momento es lo que hay para Silverlight 🙁

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

2 comentarios en “Ficheros de recursos en Silverlight”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *