Compartir a través de


Constructores System.Resources.ResourceManager

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Constructor ResourceManager(Type)

Esta sección pertenece a la sobrecarga del ResourceManager(Type) constructor.

Aplicaciones de escritorio

En las aplicaciones de escritorio, el administrador de recursos usa el resourceSource parámetro para cargar un archivo de recursos determinado de la siguiente manera:

  • Si el NeutralResourcesLanguageAttribute atributo no se usa para indicar que los recursos de la referencia cultural predeterminada residen en un ensamblado satélite, el administrador de recursos asume que el archivo de recursos de la referencia cultural predeterminada se encuentra en el mismo ensamblado que el tipo especificado por el resourceSource parámetro .
  • El administrador de recursos supone que el archivo de recursos predeterminado tiene el mismo nombre base que el tipo especificado por el resourceSource parámetro .
  • El administrador de recursos usa la clase predeterminada ResourceSet para manipular el archivo de recursos.

Por ejemplo, dado un tipo denominado MyCompany.MyProduct.MyType, el administrador de recursos busca un archivo .resources denominado MyCompany.MyProduct.MyType.resources en el ensamblado que define MyType.

En Visual Studio, el Diseñador de recursos genera automáticamente código que define una internal clase (en C#) o Friend (en Visual Basic) cuyo nombre es el mismo que el nombre base del archivo .resources para la referencia cultural predeterminada. Esto permite crear instancias de un ResourceManager objeto y acoplarlo con un conjunto determinado de recursos obteniendo un objeto de tipo cuyo nombre corresponde al nombre del recurso, ya que siempre que la clase sea visible para el compilador, los recursos también deben ser. Por ejemplo, si un archivo .resources se denomina Resource1, la siguiente instrucción crea una instancia de un ResourceManager objeto para administrar el archivo .resources denominado Resource1:

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

Si no usa Visual Studio, puede crear una clase sin miembros cuyo espacio de nombres y nombre sean los mismos que el del archivo .resources predeterminado. En este ejemplo se ilustra.

Aplicaciones de Windows 8.x

Importante

Aunque la ResourceManager clase se admite en aplicaciones de Windows 8.x, no se recomienda su uso. Use esta clase solo cuando desarrolle proyectos de biblioteca de clases portables que se pueden usar con aplicaciones de Windows 8.x. Para recuperar recursos de aplicaciones de Windows 8.x, use la clase Windows.ApplicationModel.Resources.ResourceLoader en su lugar.

En las aplicaciones de Windows 8.x, ResourceManager usa el resourceSource parámetro para deducir el ensamblado, el nombre base y el espacio de nombres donde se pueden ubicar los elementos de recursos dentro del archivo de índice de recursos de paquete (PRI) de la aplicación. Por ejemplo, dado un tipo denominado MyCompany.MyProduct.MyType definido en MyAssembly, el administrador de recursos busca un identificador de conjunto de recursos denominado MyAssembly y busca un ámbito MyCompany.MyProduct.MyType dentro de ese conjunto de recursos. El administrador de recursos busca elementos de recursos en el contexto predeterminado (referencia cultural actual, configuración de contraste alto actual, etc.) dentro de este ámbito.

Ejemplo

En el ejemplo siguiente se usa el ResourceManager(Type) constructor para crear instancias de un ResourceManager objeto . Consta de recursos compilados a partir de archivos de .txt para las referencias culturales inglés (en), francés (Francia) (fr-FR) y ruso (Rusia) (ru-RU). En el ejemplo se cambia la referencia cultural actual y la referencia cultural actual de la interfaz de usuario a inglés (Estados Unidos), francés (Francia), ruso (Rusia) y sueco (Suecia). A continuación, llama al GetString(String) método para recuperar la cadena localizada, que muestra un saludo que depende de la hora del día.

El ejemplo requiere tres archivos de recursos basados en texto, como se muestra en la tabla siguiente. Cada archivo incluye recursos de cadena denominados Morning, Afternoony Evening.

Referencia cultural Nombre de archivo Nombre del recurso Valor del recurso
en-US GreetingResources.txt Morning Good morning
en-US GreetingResources.txt Afternoon Buenas tardes
en-US 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 Добрый вечер

Puede usar el siguiente archivo por lotes para compilar el ejemplo de Visual Basic y crear un archivo ejecutable denominado Greet.exe. Para compilar con C#, cambie el nombre del compilador de vbc a csc y la extensión de archivo de .vb a .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

Este es el código fuente del ejemplo (ShowDate.vb para la versión de Visual Basic o ShowDate.cs para la versión de C# del código).

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!

Además de definir una clase de aplicación denominada Example, el código fuente define una clase interna cuyo nombre, GreetingResources, es igual que el nombre base de los archivos de recursos. Esto permite crear una instancia correcta de un objeto mediante una ResourceManager llamada al ResourceManager(Type) constructor .

Observe que la salida muestra la cadena localizada adecuada, excepto cuando la referencia cultural actual de la interfaz de usuario es sueca (Suecia), en cuyo caso usa recursos de idioma inglés. Dado que los recursos de idioma sueco no están disponibles, la aplicación usa los recursos de la referencia cultural predeterminada, tal como se define en el NeutralResourcesLanguageAttribute atributo , en su lugar.

Constructor ResourceManager(String, Assembly)

Esta sección pertenece a la sobrecarga del ResourceManager(String, Assembly) constructor.

Aplicaciones de escritorio

En las aplicaciones de escritorio, los archivos de recursos específicos de la referencia cultural individual deben estar incluidos en ensamblados satélite y el archivo de recursos de la referencia cultural predeterminada debe estar incluido en el ensamblado principal. Se supone que un ensamblado satélite contiene recursos para una sola referencia cultural especificada en el manifiesto del ensamblado y se carga según sea necesario.

Nota:

Para recuperar recursos de archivos .resources directamente en lugar de recuperarlos de ensamblados, debe llamar al CreateFileBasedResourceManager método en su lugar para crear instancias de un ResourceManager objeto.

Si no se encuentra el archivo de recursos identificado por baseName en , el método crea una instancia de un ResourceManager objeto, pero el intento de recuperar un recurso específico produce una excepción, normalmente MissingManifestResourceExceptionassembly. Para obtener información sobre cómo diagnosticar la causa de la excepción, vea la sección "Control de la excepción MissingManifestResourceException" del tema de clase ResourceManager .

Aplicaciones de Windows 8.x

Importante

Aunque la ResourceManager clase se admite en aplicaciones de Windows 8.x, no se recomienda su uso. Use esta clase solo cuando desarrolle proyectos de biblioteca de clases portables que se pueden usar con aplicaciones de Windows 8.x. Para recuperar recursos de aplicaciones de Windows 8.x, use la clase Windows.ApplicationModel.Resources.ResourceLoader en su lugar.

En las aplicaciones de Windows 8.x, el administrador de recursos usa el nombre simple del parámetro para buscar un conjunto de recursos coincidente en el archivo del índice de recursos del paquete (PRI) de assembly la aplicación. El baseName parámetro se usa para buscar un elemento de recurso dentro del conjunto de recursos. Por ejemplo, el nombre raíz de PortableLibrary1.Resource1.de-DE.resources es PortableLibrary1.Resource1.

Ejemplo

En el ejemplo siguiente se usa una sencilla aplicación "Hola mundo" no localizada para ilustrar el ResourceManager(String, Assembly) constructor. El contenido de un archivo de texto denominado ExampleResources.txt es Greeting=Hello. Cuando se compila la aplicación, el recurso se inserta en el ensamblado de la aplicación principal.

El archivo de texto se puede convertir en un archivo de recursos binarios mediante el Generador de archivos de recursos (ResGen.exe) en el símbolo del sistema de la siguiente manera:

resgen ExampleResources.txt

En el ejemplo siguiente se proporciona el código ejecutable que crea una instancia de un ResourceManager objeto, se pide al usuario que escriba un nombre y muestre un saludo.

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!

Se puede compilar mediante el comando siguiente en C#:

csc Example.cs /resource:ExampleResources.resources

En el ejemplo se recupera una referencia al ensamblado que contiene el archivo de recursos pasando un tipo definido en ese ensamblado a la typeof función (en C#) o la GetType función (en Visual Basic) y recuperando el valor de su Type.Assembly propiedad.