Condividi tramite


Creazione e recupero di risorse nelle app di Windows Store

Il sistema operativo Windows 8 introduce un nuovo modello di risorsa per le app di Windows Store che sostituisce il modello hub e spoke comune alle app desktop di .NET Framework. In questo argomento viene illustrato questo nuovo modello di risorsa e viene spiegato come creare, distribuire e recuperare le risorse nelle app Windows Store.

Risorse nelle app in Windows Store

Le app desktop di .NET Framework utilizzano un modello hub e spoke per creare pacchetti e distribuire le risorse. In genere, le risorse per le impostazioni cultura non associate ad alcun paese dell'app vengono incorporate nell'eseguibile principale dell'app. Le risorse di tali impostazioni cultura vengono utilizzate se non sono disponibili risorse localizzate. Le risorse localizzate per ogni impostazione cultura aggiuntiva vengono incorporate in un assembly satellite autonomo che contiene solo le risorse e nessun codice eseguibile.

Al contrario, nelle app in Windows Store viene utilizzato un singolo file di risorse, che viene chiamato file di indice delle risorse del pacchetto (PRI) e che archivia le risorse per tutti le lingue, le impostazioni cultura e i fattori di scala.

Importante

Le regole di fallback delle risorse determinano le risorse caricate se non è possibile trovare le risorse localizzate per le impostazioni cultura specifiche o le impostazioni cultura correnti.

Nelle app desktop, puoi utilizzare file di testo o file XML con estensione resx per creare risorse. Il Generatore di file di risorse (Resgen.exe) viene utilizzato per compilare questi file in file di risorse binari (con estensione resources). Utilizza il compilatore per incorporare le risorse delle impostazioni cultura non associate ad alcun paese nell'assembly principale di un'app e Assembly Linker (AL.exe) per includere tutte le altre risorse localizzate negli assembly satellite. Puoi quindi recuperare le singole risorse utilizzando la classe System.Resources.ResourceManager o enumerare le risorse utilizzando la classe ResourceReader.

Nelle app in Windows Store, utilizza i file con estensione resw per creare risorse. Nonostante la differenza di estensione del file, il formato del file con estensione resw è identico al formato del file con estensione resx, ad eccezione del fatto che i file con estensione resw possono contenere solo le stringhe e i percorsi di file. Puoi utilizzare gli editor risorse Visual Studio per creare e modificare le risorse. In fase di compilazione, tutti i file con estensione resw per un'app vengono compressi in un unico file PRI dall'utilità MakePRI e vengono inclusi nel pacchetto di distribuzione dell'app. In fase di esecuzione, la classe Windows.ApplicationModel.Resources.ResourceLoader e i tipi nello spazio dei nomi Windows.ApplicationModel.Resources.Core forniscono accesso alle risorse dell'app.

Importante

Sebbene il Generatore di file di risorse (Resgen.exe) viene principalmente utilizzato nelle app desktop, puoi utilizzare questo strumento per decompilare gli assembly satellite in file con estensione resw, che possono essere compilati in un file PRI.

Avviso

Sebbene la classe System.Resources.ResourceManager sia inclusa in .NET per applicazioni Windows Store, consigliamo di non utilizzarla. Utilizzare ResourceManager solo nelle librerie sviluppate come progetti Libreria di classi portabile e destinate a più piattaforme.

Creazione dei file di risorsa

Gli editor risorse di Visual Studio forniscono il metodo più semplice e più pratico per creare un file con estensione resw. Questi editor forniscono un'interfaccia utente che nasconde il formato file XML sottostante del file con estensione resw. L'utilizzo di Visual Studio per la creazione e la modifica di un file di risorse ha due vantaggi principali:

  • Elimina la necessità di creare un file di risorse manualmente e di assicurarsi che il formato XML sia valido.

  • Gestisce il processo di utilizzo dell'utilità MakePRI per compilare la risorsa, impacchettarla in un file PRI e includerla nel pacchetto di distribuzione dell'app.

Nelle app desktop, utilizza l'attributo NeutralResourcesLanguageAttribute per definire le impostazioni cultura non associate ad alcun paese dell'app. Nelle app in Windows Store, questo attributo viene ignorato quando il file PRI viene creato e quando la classe ResourceLoader di Windows viene utilizzata per estrarre risorse.

Nelle app in Windows Store, indica i nomi dei file di risorse localizzati creando una cartella per archiviare le risorse e le immagini delle impostazioni cultura supportate. Puoi quindi descrivere la risorsa utilizzando il nome delle impostazioni cultura (ad esempio "ko-kr") seguito dal nome della risorsa predefinita e l'estensione del file di risorse (ad esempio "ko-kr\Resources.resw").

Distribuzione dei file di risorse

Visual Studio gestisce tutti i dettagli relativi alla distribuzione di un'app per i file di risorse che fanno parte di un progetto di Visual Studio. Genera automaticamente un file di configurazione per tutte le risorse che fanno parte di un progetto, utilizza lo strumento MakePRI per includere le risorse in un file PRI singolo e posiziona il file PRI nel pacchetto di distribuzione dell'app.

Tutte le risorse sono incluse in un singolo file PRI anziché in una raccolta di singoli file. Pertanto, la modifica di un file di risorse esistente oppure l'aggiunta di un supporto per una nuova impostazione cultura localizzata tramite l'aggiunta di un file di risorse richiede che l'intera app sia ricompilata e ridistribuita.

Recupero delle risorse dai file di risorse

Per recuperare le risorse in un'app in Windows Store, crea l'istanza di un oggetto Windows Runtime Windows.ApplicationModel.Resources.ResourceLoader o di uno dei tipi nello spazio dei nomi Windows.ApplicationModel.Resources.Core. Sebbene la classe System.Resources.ResourceManager di .NET Framework sia supportata nelle app in Windows Store, consigliamo di non utilizzarla. Utilizzare ResourceManager solo quando si sviluppano progetti Libreria di classi portabile destinati a più piattaforme. Nella seguente tabella vengono elencati i membri ResourceManager e i loro equivalenti semplici nella classe Windows.ApplicationModel.Resources.ResourceLoader o i tipi nello spazio dei nomi Windows.ApplicationModel.Resources.Core.

Membro di ResourceManager

Membro equivalente di ResourceLoader o un altro tipo di Windows Runtime

ResourceManager.GetString(String)

Windows.ApplicationModel.Resources.ResourceLoader.GetString(String)

ResourceManager.GetString(String, CultureInfo)

Windows.ApplicationModel.Resources.Core.ResourceMap.GetValue(String, ResourceContext)

ResourceManager.ResourceManager(String, Assembly)

Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader()

-o-

Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader(String)

Si tratta di un semplice esempio "Hello World"

Viene di seguito riportato un semplice esempio di un'app Windows Store che visualizza stringhe localizzate. Le impostazioni cultura non associate ad alcun paese sono russe (Russia), ma sono incluse anche le risorse per le impostazioni cultura inglesi (Stati Uniti) e francesi (Francia). Se l'app viene eseguita in un sistema le cui impostazioni cultura correnti sono quelle inglesi (Stati Uniti), verrà visualizzato un saluto in inglese, in caso contrario, verrà visualizzato il saluto russo predefinito. Infine, indipendentemente dalle impostazioni cultura correnti, utilizza gli oggetti Windows.ApplicationModel.Resources.Core.ResourceContext e Windows.ApplicationModel.Resources.Core.ResourceMap per visualizzare un saluto in francese.

Per visualizzare l'output in un controllo di TextBlock, l'esempio richiede l'aggiunta del seguente tag <TextBlock> a BlankPage.xaml:

    <Grid Background="{StaticResource PageBackgroundBrush}"> <TextBlock x:Name="outputBlock" /> </Grid>

Il codice dell'app viene quindi chiamato dal costruttore di classe BlankPage come segue:

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);
}

L'esempio richiede la creazione delle seguenti risorse:

  • Una risorsa di lingua russa denominata "saluto" il cui valore è "Привет!". La stringa deve essere aggiunta a un file di risorse denominato Resources.resw al livello radice del progetto.

  • Una risorsa di lingua inglese denominata "saluto" il cui valore è "Hi there!". Per creare il file di risorse, aggiungere una cartella denominata en-US al progetto e quindi aggiungere un file di risorse denominato Resources.resw alla cartella.

  • Risorsa di lingua francese denominata "saluto" il cui valore è "Bonjour!". Per creare il file di risorse, aggiungere una cartella denominata fr-FR al progetto e quindi aggiungere un file di risorse denominato Resources.resw alla cartella.

Nell'esempio seguente sono visualizzate le stringhe localizzate appropriate nel controllo 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);

    }
}

Quando compili e esegui l'applicazione, viene visualizzato l'output seguente in un sistema le cui impostazioni cultura sono en-US:

The current culture is en-US. Hi there! Culture of Current Context: fr-FR Bonjour!

Vedere anche

Riferimenti

Editor risorse di Visual Studio

Concetti

Risorse nelle applicazioni desktop