Recherche et utilisation de ressources pour une culture spécifique

[Cette documentation constitue un aperçu et pourra faire l'objet de modifications dans les versions ultérieures. Des rubriques vierges sont incluses en tant qu'espaces réservés.]

Le Common Language Runtime assure une prise en charge de la récupération des ressources spécifiques à une culture qui sont empaquetées et déployées dans des assemblys satellites. Les assemblys satellites ne contiennent que des fichiers de ressources ou des fichiers de ressources libres, tels que des fichiers .gif. Ils ne contiennent pas de code exécutable.

Dans le modèle de déploiement de l'assembly satellite, vous créez une application avec un assembly par défaut (l'assembly principal) et plusieurs assemblys satellites. Vous empaquetez les ressources pour la culture par défaut ou neutre avec l'assembly principal et créez un assembly satellite séparé pour chaque langue que votre application prend en charge. Dans la mesure où les assemblys satellites ne font pas partie de l'assembly principal, vous pouvez facilement remplacer ou mettre à jour les ressources correspondant à une culture spécifique sans remplacer l'assembly principal de l'application.

Par exemple, dans une application « Hello World » simple, si la culture par défaut ou neutre est « en » (Anglais), vous pouvez créer une ressource nommée Greeting et la stocker dans une chaîne unique nommée HelloString dont la valeur est « Hello World! » Pour indiquer que « en » est la culture par défaut de l'application, vous devez également ajouter l'attribut System.Resources.NeutralResourcesLanguageAttribute suivant au fichier AssemblyInfo de l'application ou à un des fichiers de code source qui seront compilés dans l'assembly de principal de l'application.

<Assembly: NeutralResourcesLanguageAttribute("en")>

Ajoutez ensuite la prise en charge pour les cultures supplémentaires à votre application. Par exemple, vous pouvez prendre en charge les cultures « en-US », « fr-FR », et « ru-RU » comme suit :

  • Pour prendre en charge la culture « en-US » ou Anglais (États-Unis), créez un fichier de ressources nommé Greeting.en-US.resx et stockez-le dans une chaîne unique nommée HelloString dont la valeur est « Hi world! ».

  • Pour prendre en charge la culture « fr-FR » ou Français (France), créez un fichier de ressources nommé Greeting.fr-FR.resx et stockez-le dans une chaîne unique nommée HelloString dont la valeur est «Salut tout le monde! ».

  • Pour prendre en charge la culture « ru-RU » ou Russe (Russie), créez un fichier de ressources nommé Greeting.ru-RU.resx et stockez-le dans une chaîne unique nommée HelloString dont la valeur est « Всем привет! ».

La classe System.Resources.ResourceManager fournit un accès aux ressources spécifiques à une culture au moment de l'exécution et contrôle la façon dont l'application récupère les ressources à l'aide du processus de secours pour les ressources. Pour plus d'informations, consultez la section « Processus de secours pour les ressources » de la rubrique Empaquetage et déploiement de ressources.

L'objet ResourceManager détermine les ressources à récupérer en se basant sur la propriété CultureInfo.CurrentUICulture du thread actuel. Par exemple, si une application est compilée avec les ressources de langue anglaise par défaut et avec les ressources de langue Français (France) et Russe (Russie) dans deux assemblys satellites, et que la propriété CurrentUICulture a la valeur « fr-FR », l'objet ResourceManager récupère les ressources françaises.

La propriété CurrentUICulture peut être définie explicitement ou implicitement. La façon de définir cette propriété a une influence sur la manière dont l'objet ResourceManager récupère des ressources en fonction de la culture :

  • Si l'application définit la propriété CurrentUICulture explicitement sur une culture spécifique dans le code de l'application, elle garantit que les ressources pour cette culture sont toujours récupérées, indépendamment de la langue du navigateur de l'utilisateur ou de son système d'exploitation. Considérons par exemple une application qui est compilée avec des ressources de langue anglaise par défaut et trois assemblys satellites contenant des ressources pour Anglais (États-Unis), Français (France) et Russe (Russie). Si la propriété CurrentUICulture a la valeur « fr-FR », l'objet ResourceManager récupère toujours les ressources Français (France), même si la langue du système d'exploitation de l'utilisateur n'est pas le français. Vérifiez qu'il s'agit du comportement souhaité avant de définir cette propriété explicitement.

    Avertissement

    Dans les applications ASP.NET, vous devez définir la propriété CurrentUICulture explicitement, parce qu'il est improbable que le paramètre du serveur corresponde aux demandes du client entrantes.Une application ASP.NET peut définir explicitement la propriété CurrentUICulture sur la langue acceptée par le navigateur de l'utilisateur.

  • Si la propriété CurrentUICulture n'est pas définie explicitement par l'application, elle est définie implicitement par la fonction GetUserDefaultUILanguage dans Windows 2000 et Windows XP. Cette fonction est fournie par l'interface MUI (Multilingual User Interface), qui permet à l'utilisateur de définir la langue par défaut. Si l'utilisateur ne définit pas la langue de l'interface utilisateur, par défaut il s'agit de la langue installée dans le système, qui est la langue des ressources du système d'exploitation.

L'exemple suivant définit la propriété CurrentUICulture explicitement. Il définit un tableau qui contient les noms des cultures prises en charge pour l'application simple « Hello world ». Il sélectionne ensuite aléatoirement un de ces noms de cultures, l'utilise pour instancier un objet CultureInfo et fait de cette culture la culture actuelle du thread en cours. L'appel à la méthode MessageBox.Show (dans l'exemple de C#) ou à la fonction Interaction.MsgBox (dans l'exemple de Visual Basic) affiche ensuite la chaîne localisée assignée à la ressource 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 Example
{
   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("Example.Greetings", 
                                                  typeof(Example).Assembly); 
         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;
      }
   }
}

Voir aussi

Concepts

Ressources dans les applications

Récupération de ressources d'assemblys satellites

Autres ressources

Entraînerait et localisation des applications.NET Framework

Resources in ASP.NET Applications