Individuazione e uso delle risorse per specifiche impostazioni cultura

In Common Language Runtime viene fornito il supporto per il recupero di risorse specifiche delle impostazioni cultura che sono inserite nel package e distribuite negli assembly satellite. Gli assembly satellite contengono soltanto file di risorse o risorse singole quali i file GIF. Non contengono codice eseguibile.

Nel modello di distribuzione degli assembly satellite viene creata un'applicazione con l'assembly predefinito (assembly principale) e alcuni assembly satellite. Creare il package delle risorse per le impostazioni cultura predefinite o non associate ad alcun paese con l'assembly principale e creare un assembly satellite distinto per ciascuna lingua supportata dall'applicazione. Poiché gli assembly satellite non fanno parte dell'assembly principale, è possibile sostituire o aggiornare facilmente le risorse che corrispondono a impostazioni cultura specifiche senza sostituire l'assembly principale dell'applicazione.

Ad esempio, in un'applicazione "Hello world" di esempio, se le impostazioni cultura predefinite o non associate ad alcun paese sono "en", (in lingua inglese) è possibile creare una risorsa denominata Greeting e archiviare in questa una singola stringa denominata HelloString il cui valore è "Hello World!" Per indicare che "en" rappresenta le impostazioni cultura predefinite dell'applicazione, è necessario aggiungere anche il seguente attributo System.Resources.NeutralResourcesLanguageAttribute al file AssemblyInfo dell'applicazione o a uno dei file di codice sorgente che sarà compilato nell'assembly principale dell'applicazione.

<Assembly: NeutralResourcesLanguageAttribute("en")>

Aggiungere quindi il supporto per le impostazioni cultura aggiuntive all'applicazione. Ad esempio, è possibile supportare le impostazioni cultura "en-US", "fr-FR"e "ru-RU" nel modo seguente:

  • Per supportare le impostazioni cultura "en-US" o in lingua inglese (Stati Uniti), creare un file di risorse denominato Greeting.en-US.resx e archiviarlo in una singola stringa denominata HelloString il cui valore è "Hi world!".

  • Per supportare le impostazioni cultura "fr-FR" o in lingua francese (Francia), creare un file di risorse denominato Greeting.fr-FR.resx e archiviarlo in una singola stringa denominata HelloString il cui valore è "Salut tout le monde!".

  • Per supportare le impostazioni cultura "ru-RU" o in lingua russa (Russia), creare un file di risorse denominato Greeting.ru-RU.resx e archiviarlo in una singola stringa denominata HelloString il cui valore è "Всем привет!".

La classe System.Resources.ResourceManager consente l'accesso alle risorse specifiche delle impostazioni cultura in fase di esecuzione e controlla la modalità con cui le risorse vengono recuperate dall'applicazione tramite il processo di fallback delle risorse. Per ulteriori informazioni, vedere la sezione "Processo di fallback delle risorse" nell'argomento Creazione del package e distribuzione delle risorse.

L'oggetto ResourceManager determina quali risorse recuperare in base alla proprietà CultureInfo.CurrentUICulture del thread corrente. Ad esempio, se un'applicazione viene compilata con le risorse in lingua inglese predefinita nell'assembly principale e con le risorse in lingua francese (Francia) e russa (Russia) nei due assembly satellite e la proprietà CurrentUICulture viene impostata su "fr-FR", l'oggetto ResourceManager richiama le risorse in lingua francese.

È possibile impostare la proprietà CurrentUICulture in modo esplicito o implicito. Il modo in cui è impostata questa proprietà riguarda la modalità di recupero da parte dell'oggetto ResourceManager delle risorse in base alle impostazioni cultura.

  • Se l'applicazione imposta la proprietà CurrentUICulture in modo esplicito su delle impostazioni cultura specifiche nel codice di applicazione, questa garantisce che le risorse per tale cultura siano sempre richiamate, indipendentemente dal browser dell'utente o dalla lingua del sistema operativo. Si supponga che esista un'applicazione che viene compilata con le risorse della lingua inglese predefinita e tre assembly satellite contenenti le risorse per la lingua inglese (Stati Uniti), francese (Francia) e russa (Russia). Se la proprietà CurrentUICulture è impostata su "fr-FR", l'oggetto ResourceManager recupera sempre le risorse della lingua francese (Francia), anche se la lingua del sistema operativo dell'utente non è il francese. Assicurarsi che questo sia il comportamento desiderato prima di impostare tale proprietà in modo esplicito.

    Attenzione

    Nelle applicazioni ASP.NET, è necessario impostare la proprietà CurrentUICulture in modo esplicito, in quanto è improbabile che l'impostazione del server corrisponda alle richieste del client in arrivo.Un'applicazione ASP.NET può impostare la proprietà CurrentUICulture in modo esplicito sulla lingua di accettazione del browser.

  • Se la proprietà CurrentUICulture non è impostata in modo esplicito dall'applicazione, viene impostata in modo implicito dalla funzione GetUserDefaultUILanguage in Windows 2000 e Windows XP. Questa funzione è fornita dalla Multilingual User Interface (MUI) che consente all'utente di impostare la lingua predefinita. Se non è stata impostata dall'utente, la lingua dell'interfaccia utente viene impostata in modo predefinito in base alla lingua installata nel sistema, ovvero la lingua delle risorse del sistema operativo.

Nell'esempio seguente la proprietà CurrentUICulture viene impostata in modo esplicito. Definisce una matrice che contiene i nomi delle impostazioni cultura supportate per l'applicazione "Hello world". Seleziona quindi casualmente uno di questi nomi delle impostazioni cultura, lo utilizza per creare un'istanza di un oggetto CultureInfo e fa in modo che diventino le impostazioni cultura correnti del thread. La chiamata al metodo MessageBox.Show (nell'esempio C#) o la funzione Interaction.MsgBox (nell'esempio di Visual Basic) visualizza quindi la stringa localizzata assegnata alla risorsa HelloString.

Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Module1

   Sub Main()
      ' Create array of supported cultures
      Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
      Dim rnd As New Random()
      Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
      Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture

      Try
         Dim newCulture As New CultureInfo(cultures(cultureNdx))
         Thread.CurrentThread.CurrentCulture = newCulture
         Thread.CurrentThread.CurrentUICulture = newCulture
         Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                Thread.CurrentThread.CurrentUICulture.Name,
                                                vbCrLf, My.Resources.Greetings.HelloString)

         MsgBox(greeting)
      Catch e As CultureNotFoundException
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
      Finally
         Thread.CurrentThread.CurrentCulture = originalCulture
         Thread.CurrentThread.CurrentUICulture = originalCulture
      End Try
   End Sub
End Module
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Windows.Forms;

class Program
{
   static void Main()
   {
      // Create array of supported cultures
      string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
      Random rnd = new Random();
      int cultureNdx = rnd.Next(0, cultures.Length);
      CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;

      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         ResourceManager rm = new ResourceManager("LocatingCS1.Greetings", Assembly.GetExecutingAssembly()); 
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));

         MessageBox.Show(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}

Vedere anche

Concetti

Risorse nelle applicazioni

Recupero di risorse in assembly satellite

Resources in ASP.NET Applications

Altre risorse

Codifica e localizzazione

Cronologia delle modifiche

Data

Cronologia

Motivo

Maggio 2010

Rivisto in modo esteso.

Commenti e suggerimenti dei clienti.