Constructeurs System.Resources.ResourceManager

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

Constructeur ResourceManager(Type)

Cette section concerne la surcharge du ResourceManager(Type) constructeur.

Applications de bureau

Dans les applications de bureau, le gestionnaire de ressources utilise le resourceSource paramètre pour charger un fichier de ressources particulier comme suit :

  • Si l’attribut NeutralResourcesLanguageAttribute n’est pas utilisé pour indiquer que les ressources de la culture par défaut résident dans un assembly satellite, le gestionnaire de ressources suppose que le fichier de ressources de la culture par défaut est trouvé dans le même assembly que le type spécifié par le resourceSource paramètre.
  • Le gestionnaire de ressources part du principe que le fichier de ressources par défaut a le même nom de base que le type spécifié par le resourceSource paramètre.
  • Resource Manager utilise la classe par défaut ResourceSet pour manipuler le fichier de ressources.

Par exemple, en fonction d’un type nommé MyCompany.MyProduct.MyType, le gestionnaire de ressources recherche un fichier .resources nommé MyCompany.MyProduct.MyType.resources dans l’assembly qui définit MyType.

Dans Visual Studio, le Concepteur de ressources génère automatiquement du code qui définit une internal classe (en C#) ou Friend (en Visual Basic) dont le nom est identique au nom de base du fichier .resources pour la culture par défaut. Cela permet d’instancier un ResourceManager objet et de le coupler avec un ensemble particulier de ressources en obtenant un objet de type dont le nom correspond au nom de la ressource, car tant que la classe est visible par le compilateur, les ressources doivent également être. Par exemple, si un fichier .resources est nommé Resource1, l’instruction suivante instancie un ResourceManager objet pour gérer le fichier .resources nommé Resource1 :

ResourceManager rm = new ResourceManager(typeof(Resource1));

Si vous n’utilisez pas Visual Studio, vous pouvez créer une classe sans membres dont l’espace de noms et le nom sont identiques à celui du fichier .resources par défaut. Cet exemple en fournit une illustration.

Applications Windows 8.x

Important

Bien que la ResourceManager classe soit prise en charge dans les applications Windows 8.x, nous ne recommandons pas son utilisation. Utilisez cette classe uniquement lorsque vous développez des projets de bibliothèque de classes portables qui peuvent être utilisés avec des applications Windows 8.x. Pour récupérer des ressources à partir d’applications Windows 8.x, utilisez plutôt la classe Windows.ApplicationModel.Resources.ResourceLoader .

Dans les applications Windows 8.x, ResourceManager utilise le resourceSource paramètre pour déduire l’assembly, le nom de base et l’espace de noms où les éléments de ressource peuvent se trouver dans le fichier d’index de ressource de package de l’application. Par exemple, étant donné un type nommé MyCompany.MyProduct.MyType défini dans MyAssembly, resource manager recherche un identificateur de jeu de ressources nommé MyAssembly et recherche une étendue MyCompany.MyProduct.MyType dans ce jeu de ressources. Le gestionnaire de ressources recherche les éléments de ressource dans le contexte par défaut (culture actuelle, paramètre de contraste élevé actuel, et ainsi de suite) dans cette étendue.

Exemple

L’exemple suivant utilise le ResourceManager(Type) constructeur pour instancier un ResourceManager objet. Il se compose de ressources compilées à partir de .txt fichiers pour les cultures anglaises (en), Français (France) (fr-FR) et russe (Russie) (ru-RU). L’exemple modifie la culture actuelle et la culture actuelle de l’interface utilisateur en anglais (États-Unis), Français (France), Russe (Russie) et Suédois (Suède). Il appelle ensuite la GetString(String) méthode pour récupérer la chaîne localisée, qui affiche un message d’accueil qui dépend de l’heure de la journée.

L’exemple nécessite trois fichiers de ressources textuels, comme indiqué dans le tableau suivant. Chaque fichier inclut des ressources de chaîne nommées Morning, Afternoonet Evening.

culture Nom de fichier Nom de la ressource Valeur de la ressource
fr-FR GreetingResources.txt Morning Good morning
fr-FR GreetingResources.txt Afternoon Bonjour
fr-FR GreetingResources.txt Evening Good evening
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening Bonsoir
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

Vous pouvez utiliser le fichier de commandes suivant pour compiler l’exemple Visual Basic et créer un exécutable nommé Greet.exe. Pour compiler avec C#, remplacez le nom du vbc compilateur par csc et l’extension de fichier par .vb.cs.

resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources

md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources

md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources

Voici le code source de l’exemple (ShowDate.vb pour la version Visual Basic ou ShowDate.cs pour la version C# du code).

using System;
using System.Resources;
using System.Globalization;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class Example2
{
    public static void Main()
    {
        string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
        DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                     DateTime.Now.Day, 12, 0, 0);
        DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                        DateTime.Now.Day, 18, 0, 0);

        ResourceManager rm = new ResourceManager(typeof(GreetingResources));

        foreach (var cultureName in cultureNames)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
            Console.WriteLine("The current UI culture is {0}",
                              CultureInfo.CurrentUICulture.Name);
            if (DateTime.Now < noon)
                Console.WriteLine("{0}!", rm.GetString("Morning"));
            else if (DateTime.Now < evening)
                Console.WriteLine("{0}!", rm.GetString("Afternoon"));
            else
                Console.WriteLine("{0}!", rm.GetString("Evening"));
            Console.WriteLine();
        }
    }

    internal class GreetingResources
    {
    }
}
// The example displays output like the following:
//       The current UI culture is en-US
//       Good afternoon!
//
//       The current UI culture is fr-FR
//       Bonjour!
//
//       The current UI culture is ru-RU
//       Добрый день!
//
//       The current UI culture is sv-SE
//       Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim noon As New Date(Date.Now.Year, Date.Now.Month, 
                           Date.Now.Day, 12,0,0)
      Dim evening As New Date(Date.Now.Year, Date.Now.Month,
                              Date.Now.Day, 18, 0, 0)                          
      
      Dim rm As New ResourceManager(GetType(GreetingResources))
      
      For Each cultureName In cultureNames
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current UI culture is {0}", 
                           CultureInfo.CurrentUICulture.Name)
         If Date.Now < noon Then
            Console.WriteLine("{0}!", rm.GetString("Morning"))
         ElseIf Date.Now < evening Then
            Console.WriteLine("{0}!", rm.GetString("Afternoon"))
         Else
            Console.WriteLine("{0}!", rm.GetString("Evening"))
         End If 
         Console.WriteLine()
      Next
   End Sub
End Module

Friend Class GreetingResources
End Class
' The example displays output like the following:
'       The current UI culture is en-US
'       Good afternoon!
'       
'       The current UI culture is fr-FR
'       Bonjour!
'       
'       The current UI culture is ru-RU
'       Добрый день!
'       
'       The current UI culture is sv-SE
'       Good afternoon!

En plus de définir une classe d’application nommée Example, le code source définit une classe interne dont le nom, GreetingResourcesest identique au nom de base des fichiers de ressources. Cela permet d’instancier un ResourceManager objet avec succès en appelant le ResourceManager(Type) constructeur.

Notez que la sortie affiche la chaîne localisée appropriée, sauf lorsque la culture actuelle de l’interface utilisateur est suédoise (Suède), auquel cas elle utilise des ressources en langue anglaise. Étant donné que les ressources de langue suédoise ne sont pas disponibles, l’application utilise plutôt les ressources de la culture par défaut, comme défini par l’attribut NeutralResourcesLanguageAttribute .

Constructeur ResourceManager(String, Assembly)

Cette section concerne la surcharge du ResourceManager(String, Assembly) constructeur.

Applications de bureau

Dans les applications de bureau, les fichiers de ressources spécifiques à la culture doivent être contenus dans les assemblys satellites, et le fichier de ressources de la culture par défaut doit être contenu dans l’assembly principal. Un assembly satellite est supposé contenir des ressources pour une seule culture spécifiée dans le manifeste de cet assembly et est chargé si nécessaire.

Remarque

Pour récupérer des ressources à partir de fichiers .resources directement au lieu de les récupérer à partir d’assemblys, vous devez appeler la méthode à la CreateFileBasedResourceManager place pour instancier un ResourceManager objet.

Si le fichier de ressources identifié par baseName est introuvable, assemblyla méthode instancie un ResourceManager objet, mais la tentative de récupération d’une ressource spécifique lève généralement une exception MissingManifestResourceException. Pour plus d’informations sur le diagnostic de la cause de l’exception, consultez la section « Gestion de l’exception MissingManifestResourceException » de la ResourceManager rubrique de classe.

Applications Windows 8.x

Important

Bien que la ResourceManager classe soit prise en charge dans les applications Windows 8.x, nous ne recommandons pas son utilisation. Utilisez cette classe uniquement lorsque vous développez des projets de bibliothèque de classes portables qui peuvent être utilisés avec des applications Windows 8.x. Pour récupérer des ressources à partir d’applications Windows 8.x, utilisez plutôt la classe Windows.ApplicationModel.Resources.ResourceLoader .

Dans les applications Windows 8.x, le gestionnaire de ressources utilise le nom simple du paramètre pour rechercher un jeu de assembly ressources correspondant dans le fichier PRI (Package Resource Index) de l’application. Le baseName paramètre est utilisé pour rechercher un élément de ressource dans le jeu de ressources. Par exemple, le nom racine de PortableLibrary1.Resource1.de-DE.resources est PortableLibrary1.Resource1.

Exemple

L’exemple suivant utilise une application « Hello World » simple non localisée pour illustrer le ResourceManager(String, Assembly) constructeur. Le contenu d’un fichier texte nommé ExampleResources.txt est Greeting=Hello. Lorsque l’application est compilée, la ressource est incorporée dans l’assembly d’application principal.

Le fichier texte peut être converti en fichier de ressources binaire à l’aide du générateur de fichiers de ressources (ResGen.exe) à l’invite de commandes comme suit :

resgen ExampleResources.txt

L’exemple suivant fournit le code exécutable qui instancie un ResourceManager objet, invite l’utilisateur à entrer un nom et affiche un message d’accueil.

using System;
using System.Reflection;
using System.Resources;

public class Example1
{
    public static void Main()
    {
        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine("{0} {1}!", greeting, name);
    }
}
// The example produces output similar to the following:
//       Enter your name: John
//       Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources

Module Example1
    Public Sub Main()
        ' Retrieve the resource.
        Dim rm As New ResourceManager("ExampleResources",
                                      GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")

        Console.Write("Enter your name: ")
        Dim name As String = Console.ReadLine()
        Console.WriteLine("{0} {1}!", greeting, name)
    End Sub
End Module
' The example produces output similar to the following:
'       Enter your name: John
'       Hello John!

Elle peut être compilée à l’aide de la commande suivante en C# :

csc Example.cs /resource:ExampleResources.resources

L’exemple récupère une référence à l’assembly qui contient le fichier de ressources en passant un type défini dans cet assembly à la typeof fonction (en C#) ou à la GetType fonction (en Visual Basic) et en récupérant la valeur de sa Type.Assembly propriété.