Crear y recuperar recursos en aplicaciones de la Tienda Windows
El sistema operativo Windows 8 presenta un nuevo modelo de recursos para las aplicaciones de la Tienda Windows que reemplaza el modelo de concentrador y radio común a las aplicaciones de escritorio de .NET Framework. Este tema describe este nuevo modelo de recursos y explica cómo crear, implementar y recuperar recursos en las aplicaciones de la Tienda Windows.
Recursos en aplicaciones de la Tienda Windows
Las aplicaciones de escritorio de .NET Framework usan un modelo de concentrador y radio para empaquetar e implementar recursos. Normalmente, los recursos para la referencia cultural neutra de la aplicación (referencia cultural cuyos recursos se usan en caso de que no haya recursos localizados disponibles) se insertan en el archivo ejecutable principal de la aplicación. Los recursos localizados de cada referencia cultural adicional se incrustan en un ensamblado satélite independiente que solo contiene recursos, sin código ejecutable.
En cambio, las aplicaciones de la Tienda Windows usan un único archivo de recursos. Este archivo se denomina archivo de índice de recursos del paquete (PRI) y almacena los recursos para todos los lenguajes, referencias culturales y factores de la escala.
Importante
Las reglas de reserva de recursos determinan qué recursos se van a cargar si los recursos localizados para una referencia cultural determinada o la referencia cultural actual no se pueden encontrar.
En aplicaciones de escritorio, puede utilizar archivos de texto o archivos XML (.resx) para crear recursos. Se usa el Generador de archivos de recursos (Resgen.exe) para compilar estos archivos en archivos binarios de recursos (.resources). El compilador se usa para incrustar los recursos de la referencia cultural neutra en el ensamblado principal de la aplicación y la herramienta Assembly Linker (AL.exe) se usa para incrustar el resto de los recursos localizados en ensamblados satélite. Posteriormente, puedes recuperar los recursos individuales con la clase System.Resources.ResourceManager o enumerar los recursos con la clase ResourceReader.
En las aplicaciones de la Tienda Windows, usa archivos .resw para crear recursos. A pesar de la diferencia en la extensión de archivo, el formato de los archivos .resw es idéntico al formato de los archivos .resx, salvo que los archivos .resw solo pueden contener cadenas y rutas de acceso del archivo. Puedes usar los editores de recursos de Visual Studio para crear y modificar recursos. En tiempo de compilación, la utilidad MakePRI empaqueta todos los archivos .resw para una aplicación en un único archivo PRI y se incluyen en el paquete de implementación de la aplicación. En tiempo de ejecución, la clase Windows.ApplicationModel.Resources.ResourceLoader y los tipos en el espacio de nombres Windows.ApplicationModel.Resources.Core proporcionan acceso a los recursos de la aplicación.
Importante
Aunque el uso del Generador de archivos de recursos (Resgen.exe) está principalmente dirigido a aplicaciones de escritorio, también puedes usar esta herramienta para descompilar los ensamblados satélite en archivos .resw, que se pueden compilar en un archivo de opción.
Advertencia
Pese a que se incluye la clase System.Resources.ResourceManager en .NET para aplicaciones de la Tienda Windows, no te recomendamos que la uses. Usa ResourceManager solamente en las bibliotecas que se desarrollan como proyectos de la Biblioteca de clases portable y que tienen como destino varias plataformas.
Crear archivos de recursos
Los editores de recursos de Visual Studio representan la forma más sencilla y cómoda de crear archivos .resw. Estos editores proporcionan una interfaz de usuario que oculta el formato de archivo XML subyacente del archivo .resw. El uso de Visual Studio para crear y editar un archivo de recursos tiene dos ventajas principales:
Elimina la necesidad de crear un archivo de recursos manualmente y de asegurarse de que el formato XML es válido.
Controla el proceso de uso de la utilidad MakePRI para compilar el recurso, para empaquetarlo en un archivo PRI y para incluirlo en el paquete de implementación de la aplicación.
En aplicaciones de escritorio, usa el atributo NeutralResourcesLanguageAttribute para definir la referencia cultural neutra de la aplicación. En las aplicaciones de la Tienda Windows, se omite este atributo cuando se crea el archivo PRI y cuando se usa la clase ResourceLoader de Windows para extraer recursos.
En las aplicaciones de la Tienda Windows, se designan los nombres de los archivos de recursos adaptados; para ello, se crea una carpeta donde se van a almacenar los recursos y las imágenes de una referencia cultural admitida. Puedes describir el recurso con el nombre de la referencia cultural (como “ko-kr”) seguido del nombre de recurso predeterminado y la extensión del archivo de recursos (por ejemplo, “ko-kr\Resources.resw”).
Implementar archivos de recursos
Visual Studio controla todos los detalles de implementación de la aplicación para los archivos de recursos que forman parte de un proyecto de Visual Studio. Genera automáticamente un archivo de configuración para todos los recursos que forman parte de un proyecto, se sirve la herramienta MakePRI para incluir recursos en un único archivo PRI y lo coloca en el paquete de implementación de la aplicación.
Dado que todos los recursos se incluyen en un solo archivo PRI en lugar de en una colección de archivos individuales, si se modifica un archivo de recursos existente o se agrega compatibilidad para una nueva referencia cultural localizada a través de un archivo de recursos, hay que recompilar y redistribuir la aplicación en su totalidad.
Recuperar recursos de archivos de recursos
Para recuperar recursos en una aplicación de la Tienda Windows, hay que crear una instancia para un objeto Windows.ApplicationModel.Resources.ResourceLoader o para uno de los tipos en el espacio de nombres Windows en tiempo de ejecución Windows.ApplicationModel.Resources.Core. Aunque la clase System.Resources.ResourceManager de .NET Framework se admite en las aplicaciones de la Tienda Windows, te recomendamos que no la uses. Usa solamente proyectos de ResourceManager para desarrollar proyectos de Biblioteca de clases portable que estén destinados a varias plataformas. En la tabla siguiente se enumeran los miembros de ResourceManager y sus equivalentes simples en la clase Windows.ApplicationModel.Resources.ResourceLoader o los tipos en el espacio de nombres Windows.ApplicationModel.Resources.Core.
ResourceManager (miembro) |
Miembro equivalente de ResourceLoader u otro tipo de Windows en tiempo de ejecución |
---|---|
Windows.ApplicationModel.Resources.ResourceLoader.GetString (cadena) |
|
Windows.ApplicationModel.Resources.Core.ResourceMap.GetValue (cadena, ResourceContext) |
|
ResourceManager.ResourceManager(String, Assembly) |
Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader() o bien Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader(cadena) |
Una simple demostración "¡Hola a todos!"
A continuación, se presenta un ejemplo sencillo de una aplicación de la Tienda Windows que muestra las cadenas localizadas. La referencia cultural neutra es ruso (Rusia), pero también incluye recursos para las referencias culturales de inglés (Estados Unidos) y francés (Francia). Si la aplicación se ejecuta en un sistema cuya referencia cultural actual sea el inglés (Estados Unidos), mostrará un saludo en inglés; de lo contrario, aparecerá el saludo en ruso predeterminado. Por último, independientemente de la referencia cultural actual, se usan los objetos Windows.ApplicationModel.Resources.Core.ResourceContext y Windows.ApplicationModel.Resources.Core.ResourceMap para presentar un saludo en francés.
Para mostrar el resultado de un control TextBlock, en el ejemplo, es necesario agregar la siguiente etiqueta <TextBlock> a BlankPage.xaml:
<Grid Background="{StaticResource PageBackgroundBrush}"> <TextBlock x:Name="outputBlock" /> </Grid>
Posteriormente, se llama al código de aplicación desde el constructor de la clase BlankPage, tal como sigue:
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Example.Run(outputBlock)
End Sub
public BlankPage()
{
InitializeComponent();
Example.Run(outputBlock);
}
Para este ejemplo, debes crear los siguientes recursos:
Un recurso de idioma ruso denominado “Greeting” cuyo valor sea “Привет!”. La cadena se debe agregar a un archivo de recursos denominado Resources.resw en el nivel raíz del proyecto.
Un recurso de idioma inglés denominado “Greeting” cuyo valor sea “Hi there!”. Para crear el archivo de recursos, agrega una carpeta que se llame en-US al proyecto y, después, agrega a la carpeta un archivo de recursos con el nombre Resources.resw.
Un recurso de idioma francés denominado “Greeting” cuyo valor sea “Bonjour!”. Para crear el archivo de recursos, agrega una carpeta que se llame fr-FR al proyecto y, después, agrega a la carpeta un archivo de recursos con el nombre Resources.resw.
El ejemplo siguiente muestra las cadenas localizadas adecuadas en el control TextBlock.
Imports System.Globalization
Imports Windows.ApplicationModel.Resources
Imports Windows.ApplicationModel.Resources.Core
Imports Windows.UI.Xaml.Controls
Public Class Example
Public Shared Sub Run(outputBlock As Windows.UI.Xaml.Controls.TextBlock)
outputBlock.Text += String.Format("{1}The current culture is {0}.{1}",
CultureInfo.CurrentCulture.Name, vbCrLf)
Dim rl As ResourceLoader = New ResourceLoader()
' Display greeting using the resources of the current culture.
Dim greeting As String = rl.GetString("Greeting")
outputBlock.Text += String.Format("{0}{1}",
If(String.IsNullOrEmpty(greeting), "Здрауствуйте", greeting),
vbCrLf)
' Display greeting using fr-FR resources.
Dim ctx As ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
ctx.Languages = {"fr-FR"}
Dim rmap As ResourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources")
Dim newGreeting As String = rmap.GetValue("Greeting", ctx).ToString()
outputBlock.Text += String.Format("{1}{1}Culture of Current Context: {0}{1}",
ctx.Languages(0), vbCrLf)
outputBlock.Text += String.Format("{0}{1}", If(String.IsNullOrEmpty(newGreeting),
greeting, newGreeting), vbCrLf)
End Sub
End Class
using System;
using System.Globalization;
using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
using Windows.UI.Xaml.Controls;
public class Example
{
public static void Run(Windows.UI.Xaml.Controls.TextBlock outputBlock)
{
outputBlock.Text += String.Format("\nThe current culture is {0}.\n", CultureInfo.CurrentCulture.Name);
ResourceLoader rl = new ResourceLoader();
// Display greeting using the resources of the current culture.
string greeting = rl.GetString("Greeting");
outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(greeting) ? "Здрауствуйте" : greeting);
// Display greeting using fr-FR resources.
ResourceContext ctx = new Windows.ApplicationModel.Resources.Core.ResourceContext();
ctx.Languages = new string[] { "fr-FR" } ;
ResourceMap rmap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
string newGreeting = rmap.GetValue("Greeting", ctx).ToString();
outputBlock.Text += String.Format("\n\nCulture of Current Context: {0}\n", ctx.Languages[0]);
outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(newGreeting) ? greeting : newGreeting);
}
}
Cuando se compila y ejecuta la aplicación, muestra resultados similares a los siguientes en un sistema cuya referencia cultural es en-US:
The current culture is en-US. Hi there! Culture of Current Context: fr-FR Bonjour!
Vea también
Referencia
Editores de recursos de Visual Studio