Operaciones básicas de programación con Metro y Windows 8 (IX)
Trabajando con ficheros de recursos e idiomas
Trabajando con ficheros de recursos e idiomas (II)
Creando el fichero de recursos
La primera acción a acometer es la de crear el fichero de recursos.
Para ello, vamos a hacer clic con el botón derecho del ratón sobre el proyecto, y vamos a seleccionar la opción Add > New Item o a pulsar la combinación de teclas Ctrl + Shift + A tal y como se indica en la siguiente imagen:
Como nombre del fichero de recursos le he indicado el que normalmente aparece por defecto, Resources.resw.
Aquí conviene hacer un pequeño alto en el camino para explicar alguna cosa al respecto.
Si has trabajado con aplicaciones .NET y has tenido que hacer que tu aplicación se comporte como una aplicación multiidioma, habrás tenido que trabajar con ficheros de recursos.
En .NET (hasta ahora), los ficheros de recursos tenían la extensión resx. Sin embargo, en Metro, esta extensión cambia a resw.
Otro detalle a tener en cuenta, es que con .NET (hasta ahora), los ficheros resx tenían asociado un fichero de código (cs en el caso de C# y vb en el caso de VB). En Metro, eso ya no es así.
Llegado a este punto y estas breves explicaciones, vamos a ver como trabajar con este fichero de recursos.
Preparando el fichero de recursos
Para preparar nuestro fichero de recursos, haremos simplemente doble clic sobre el fichero Resources.resw.
De esta forma, se abrirá el gestor de recursos.
Si hemos trabajado con ficheros resx en .NET, observaremos que el gestor es prácticamente idéntico.
En nuestro ejemplo, hemos agregado las siguientes entradas:
Nota: Intencionadamente le he indicado unos valores recortados de los originales para demostrar su funcionamiento.
Ahora que tenemos la base de nuestra aplicación preparada, vamos a hacerlo funcionar.
Consumiendo el fichero de recursos vía código
No nos vamos a complicar en exceso.
Queremos utilizar el fichero de recursos vía código, así que vamos a ello.
Recordemos un poco alguno de los conceptos Metro explicados en otras entradas.
¿Qué evento se lanza cuando la página es cargada?. Dicho de otra manera aunque no exacta, ¿qué evento se lanza cuando la página obtiene el foco de carga?.
El evento OnNavigatedTo.
Por lo tanto, parece lógico que dentro de este evento, recorramos el fichero de recursos para mostrar en cada control el contenido que queremos localizar.
En nuestro sencillo ejemplo, el código C# del evento OnNavigatedTo para la página MainPage.xaml, quedará de la siguiente manera:
1: /// <summary>
2: /// Invoked when this page is about to be displayed in a Frame.
3: /// </summary>
4: /// <param name="e">Event data that describes how this page was reached. The Parameter
5: /// property is typically used to configure the page.</param>
6: protected override void OnNavigatedTo(NavigationEventArgs e)
7: {
8: var resourceLoader = new ResourceLoader();
9: this.tbNombre.Text = resourceLoader.GetString("TituloNombre");
10: this.btnAceptar.Content = resourceLoader.GetString("BotonAceptar");
11: } // OnNavigatedTo
Como podemos observar, estamos utilizando una clase de nombre ResourceLoader.
Esta clase pertenece al siguiente namespace:
1: using Windows.ApplicationModel.Resources;
Finalmente, utilizaremos la función GetString() por cada control sobre el que queremos mostrar un texto localizado.
Nuestra aplicación en ejecución quedará de la siguiente manera:
Igualmente, si hubiéramos querido, podríamos haber modificado el texto que aparece en la caja de diálogo o de mensaje.
Bastaría con haber agregado una entrada en el fichero Resources.resw como por ejemplo:
Y en el código C# donde mostramos la caja de mensaje, haber escrito algo similar a esto:
1: private void btnAceptar_Click_1(object sender, RoutedEventArgs e)
2: {
3: var resourceLoader = new ResourceLoader();
4: // Preparamos la caja de mensaje.
5: MessageDialog messageDialog = new MessageDialog(string.Format(
6: resourceLoader.GetString("DialogMessageInfo"),
7: this.txtNombre.Text));
8: // Mostramos la caja de mensaje.
9: messageDialog.ShowAsync();
10: } // btnAceptar_Click_1
Sin embargo, aún nos quedaría una pregunta que hacernos.
¿Cómo consumir el fichero de recursos vía XAML?.
(…Continúa…)