ResourceManager Clase

Definición

Representa un administrador de recursos que proporciona un acceso más cómodo a los recursos específicos de la referencia cultural en tiempo de ejecución.

public ref class ResourceManager
public class ResourceManager
[System.Serializable]
public class ResourceManager
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ResourceManager
type ResourceManager = class
[<System.Serializable>]
type ResourceManager = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ResourceManager = class
Public Class ResourceManager
Herencia
ResourceManager
Derivado
Atributos

Ejemplos

En el ejemplo siguiente se muestra cómo usar una referencia cultural explícita y la referencia cultural de interfaz de usuario actual implícita para obtener recursos de cadena de un ensamblado principal y un ensamblado satélite. Para obtener más información, vea la sección "Ubicaciones de directorio para ensamblados satélite no instalados en la caché global de ensamblados" del tema Creación de ensamblados satélite .

Para ejecutar este ejemplo:

  1. En el directorio de la aplicación, cree un archivo denominado rmc.txt que contenga las siguientes cadenas de recursos:

    day=Friday
    year=2006
    holiday="Cinco de Mayo"
    
  2. Use el generador de archivos de recursos para generar el archivo de recursos rmc.resources desde el archivo de entrada rmc.txt de la siguiente manera:

    resgen rmc.txt
    
  3. Cree un subdirectorio del directorio de la aplicación y asígnelo el nombre "es-MX". Este es el nombre de referencia cultural del ensamblado satélite que creará en los tres pasos siguientes.

  4. Cree un archivo denominado rmc.es-MX.txt en el directorio es-MX que contenga las siguientes cadenas de recursos:

    day=Viernes
    year=2006
    holiday="Cinco de Mayo"
    
  5. Use el generador de archivos de recursos para generar el archivo de recursos rmc.es-MX.resources desde el archivo de entrada rmc.es-MX.txt de la siguiente manera:

    resgen rmc.es-MX.txt
    
  6. Supongamos que el nombre de archivo de este ejemplo es rmc.vb o rmc.cs. Copie el código fuente siguiente en un archivo. Después, compile e inserte el archivo de recursos de ensamblado principal, rmc.resources, en el ensamblado ejecutable. Si usa el compilador de Visual Basic, la sintaxis es:

    vbc rmc.vb /resource:rmc.resources
    

    La sintaxis correspondiente para el compilador de C# es:

    csc /resource:rmc.resources rmc.cs
    
  7. Use assembly Linker para crear un ensamblado satélite. Si el nombre base de la aplicación es rmc, el nombre del ensamblado satélite debe ser rmc.resources.dll. El ensamblado satélite debe crearse en el directorio es-MX. Si es-MX es el directorio actual, use este comando:

    al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
    
  8. Ejecute rmc.exe para obtener y mostrar las cadenas de recursos incrustadas.

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

class Example
{
    public static void Main()
    {
    string day;
    string year;
    string holiday;
    string celebrate = "{0} will occur on {1} in {2}.\n";

    // Create a resource manager.
    ResourceManager rm = new ResourceManager("rmc",
                             typeof(Example).Assembly);

    Console.WriteLine("Obtain resources using the current UI culture.");

    // Get the resource strings for the day, year, and holiday
    // using the current UI culture.
    day  = rm.GetString("day");
    year = rm.GetString("year");
    holiday = rm.GetString("holiday");
    Console.WriteLine(celebrate, holiday, day, year);

    // Obtain the es-MX culture.
    CultureInfo ci = new CultureInfo("es-MX");

    Console.WriteLine("Obtain resources using the es-MX culture.");

   // Get the resource strings for the day, year, and holiday
   // using the specified culture.
    day  = rm.GetString("day", ci);
    year = rm.GetString("year", ci);
    holiday = rm.GetString("holiday", ci);
// ---------------------------------------------------------------
// Alternatively, comment the preceding 3 code statements and
// uncomment the following 4 code statements:
// ----------------------------------------------------------------
// Set the current UI culture to "es-MX" (Spanish-Mexico).
//    Thread.CurrentThread.CurrentUICulture = ci;

// Get the resource strings for the day, year, and holiday
// using the current UI culture. Use those strings to
// display a message.
//    day  = rm.GetString("day");
//    year = rm.GetString("year");
//    holiday = rm.GetString("holiday");
// ---------------------------------------------------------------

// Regardless of the alternative that you choose, display a message
// using the retrieved resource strings.
    Console.WriteLine(celebrate, holiday, day, year);
    }
}
/*
This example displays the following output:

   Obtain resources using the current UI culture.
   "5th of May" will occur on Friday in 2006.

   Obtain resources using the es-MX culture.
   "Cinco de Mayo" will occur on Viernes in 2006.
*/
Imports System.Resources
Imports System.Reflection
Imports System.Threading
Imports System.Globalization

Class Example
    Public Shared Sub Main() 
        Dim day As String
        Dim year As String
        Dim holiday As String
        Dim celebrate As String = "{0} will occur on {1} in {2}." & vbCrLf

        ' Create a resource manager. 
        Dim rm As New ResourceManager("rmc", GetType(Example).Assembly)

        Console.WriteLine("Obtain resources using the current UI culture.")

        ' Get the resource strings for the day, year, and holiday 
        ' using the current UI culture. 
        day = rm.GetString("day")
        year = rm.GetString("year")
        holiday = rm.GetString("holiday")
        Console.WriteLine(celebrate, holiday, day, year)

        ' Obtain the es-MX culture.
        Dim ci As New CultureInfo("es-MX")

        Console.WriteLine("Obtain resources using the es-MX culture.")

        ' Get the resource strings for the day, year, and holiday 
        ' using the es-MX culture.  
        day = rm.GetString("day", ci)
        year = rm.GetString("year", ci)
        holiday = rm.GetString("holiday", ci)

        ' ---------------------------------------------------------------
        ' Alternatively, comment the preceding 3 code statements and 
        ' uncomment the following 4 code statements:
        ' ----------------------------------------------------------------
        ' Set the current UI culture to "es-MX" (Spanish-Mexico).
        '    Thread.CurrentThread.CurrentUICulture = ci
        ' Get the resource strings for the day, year, and holiday 
        ' using the current UI culture. 
        '    day  = rm.GetString("day")
        '    year = rm.GetString("year")
        '    holiday = rm.GetString("holiday")
        ' ---------------------------------------------------------------

        ' Regardless of the alternative that you choose, display a message 
        ' using the retrieved resource strings.
        Console.WriteLine(celebrate, holiday, day, year)
    End Sub 
End Class
' This example displays the following output:
'Obtain resources using the current UI culture.
'"5th of May" will occur on Friday in 2006.
'
'Obtain resources using the es-MX culture.
'"Cinco de Mayo" will occur on Viernes in 2006.

Comentarios

Importante

Llamar a métodos de esta clase con datos que no son de confianza supone un riesgo de seguridad. Llame a los métodos de esta clase solo con datos de confianza. Para obtener más información, vea Data Validation (Validación de datos).

La ResourceManager clase recupera los recursos de un archivo .resources binario incrustado en un ensamblado o desde un archivo .resources independiente. Si se ha localizado una aplicación y se han implementado recursos localizados en ensamblados satélite, busca recursos específicos de la referencia cultural, proporciona reserva de recursos cuando no existe un recurso localizado y admite la serialización de recursos.

Para obtener más información sobre cómo crear y administrar recursos en aplicaciones de escritorio y aplicaciones Windows 8.x, consulte las secciones siguientes:

Aplicaciones de escritorio

En el caso de las aplicaciones de escritorio, la ResourceManager clase recupera los recursos de los archivos de recursos binarios (.resources). Normalmente, un compilador de lenguaje o assembly Linker (AL.exe) inserta estos archivos de recursos en un ensamblado. También puede usar un ResourceManager objeto para recuperar recursos directamente desde un archivo .resources que no está incrustado en un ensamblado mediante una llamada al CreateFileBasedResourceManager método .

Precaución

El uso de archivos .resources independientes en una aplicación de ASP.NET interrumpirá la implementación de XCOPY, ya que los recursos permanecen bloqueados hasta que el método los ReleaseAllResources libera explícitamente. Si desea implementar recursos con las aplicaciones de ASP.NET, debe compilar los archivos .resources en ensamblados satélite.

En una aplicación basada en recursos, un archivo .resources contiene los recursos de la referencia cultural predeterminada cuyos recursos se usan si no se puede encontrar ningún recurso específico de la referencia cultural. Por ejemplo, si la referencia cultural predeterminada de una aplicación es inglés (en), los recursos de idioma inglés se usan siempre que no se encuentren recursos localizados para una referencia cultural específica, como inglés (Estados Unidos) (en-US) o francés (francia) (fr-FR). Normalmente, los recursos de la referencia cultural predeterminada se insertan en el ensamblado de la aplicación principal y los recursos de otras referencias culturales localizadas se insertan en ensamblados satélite. Los ensamblados satélite solo contienen recursos. Tienen el mismo nombre de archivo raíz que el ensamblado principal y una extensión de .resources.dll. En el caso de las aplicaciones cuyos ensamblados no están registrados en la caché global de ensamblados, los ensamblados satélite se almacenan en un subdirectorio de aplicación cuyo nombre corresponde a la referencia cultural del ensamblado.

Creación de recursos

Al desarrollar una aplicación basada en recursos, se almacena información de recursos en archivos de texto (archivos que tienen una extensión de .txt o .restext) o archivos XML (archivos que tienen una extensión .resx). Después, compile el texto o los archivos XML con el Generador de archivos de recursos (Resgen.exe) para crear un archivo .resources binario. A continuación, puede insertar el archivo .resources resultante en un archivo ejecutable o biblioteca mediante una opción del compilador, como /resources para los compiladores de C# y Visual Basic, o puede insertarlo en un ensamblado satélite mediante assembly Linker (AI.exe). Si incluye un archivo .resx en el proyecto de Visual Studio, Visual Studio controla la compilación e inserción de recursos predeterminados y localizados automáticamente como parte del proceso de compilación.

Lo ideal es crear recursos para cada lenguaje que admita la aplicación, o al menos para un subconjunto significativo de cada idioma. Los nombres de archivo .resources binarios siguen el nombre base de la convención de nomenclatura. cultureName.resources, donde basename es el nombre de la aplicación o el nombre de una clase, según el nivel de detalle que desee. La CultureInfo.Name propiedad se usa para determinar cultureName. Un recurso para la referencia cultural predeterminada de la aplicación debe denominarse basename.resources.

Por ejemplo, supongamos que un ensamblado tiene varios recursos en un archivo de recursos que tiene el nombre base MyResources. Estos archivos de recursos deben tener nombres como MyResources.ja-JP.resources para la cultura japonesa (japonesa), MyResources.de.resources para la cultura alemana, MyResources.zh-CHS.resources para la cultura china simplificada y MyResources.fr-BE.resources para la cultura francesa (Bélgica). El archivo de recursos predeterminado debe denominarse MyResources.resources. Los archivos de recursos específicos de la referencia cultural se empaquetan normalmente en ensamblados satélite para cada referencia cultural. El archivo de recursos predeterminado debe insertarse en el ensamblado principal de la aplicación.

Tenga en cuenta que Assembly Linker permite que los recursos se marquen como privados, pero siempre debe marcarlos como públicos para que otros ensamblados puedan acceder a ellos. (Dado que un ensamblado satélite no contiene código, los recursos marcados como privados no están disponibles para la aplicación a través de cualquier mecanismo).

Para obtener más información sobre cómo crear, empaquetar e implementar recursos, consulte los artículos Creación de archivos de recursos, Creación de ensamblados satélite y Empaquetado e implementación de recursos.

Creación de instancias de un objeto ResourceManager

Cree una instancia de un ResourceManager objeto que recupere los recursos de un archivo .resources incrustado llamando a una de sus sobrecargas de constructor de clase. Esto acopla estrechamente un ResourceManager objeto con un archivo .resources determinado y con los archivos .resources localizados asociados en ensamblados satélite.

Los dos constructores más comunes son:

  • ResourceManager(String, Assembly) busca recursos basados en dos fragmentos de información que proporcione: el nombre base del archivo .resources y el ensamblado en el que reside el archivo .resources predeterminado. El nombre base incluye el espacio de nombres y el nombre raíz del archivo .resources, sin su referencia cultural o extensión. Tenga en cuenta que los archivos .resources que se compilan desde la línea de comandos normalmente no incluyen un nombre de espacio de nombres, mientras que los archivos .resources creados en el entorno de Visual Studio sí lo hacen. Por ejemplo, si un archivo de recursos se denomina MyCompany.StringResources.resources y se llama al ResourceManager constructor desde un método estático denominado Example.Main, el código siguiente crea una instancia de un ResourceManager objeto que puede recuperar recursos del archivo .resources:

    ResourceManager rm = new ResourceManager("MyCompany.StringResources",
                                             typeof(Example).Assembly);
    
    Dim rm As New ResourceManager("MyCompany.StringResources",
                                  GetType(Example).Assembly)
    
  • ResourceManager(Type) busca recursos en ensamblados satélite basados en información de un objeto de tipo. El nombre completo del tipo corresponde al nombre base del archivo .resources sin su extensión de nombre de archivo. En las aplicaciones de escritorio que se crean mediante el Diseñador de recursos de Visual Studio, Visual Studio crea una clase contenedora cuyo nombre completo es el mismo que el nombre raíz del archivo .resources. Por ejemplo, si un archivo de recursos se denomina MyCompany.StringResources.resources y hay una clase contenedora denominada MyCompany.StringResources, el código siguiente crea una instancia de un ResourceManager objeto que puede recuperar recursos del archivo .resources:

    ResourceManager rm = new ResourceManager(typeof(MyCompany.StringResources));
    
    Dim rm As New ResourceManager(GetType(MyCompany.StringResources))
    

Si no se encuentran los recursos adecuados, la llamada al constructor crea un objeto válido ResourceManager . Sin embargo, el intento de recuperar un recurso produce una MissingManifestResourceException excepción. Para obtener información sobre cómo tratar con la excepción, consulte la sección Control de las excepciones MissingManifestResourceException y MissingSatelliteAssembly más adelante en este artículo.

En el ejemplo siguiente se muestra cómo crear una instancia de un ResourceManager objeto . Contiene el código fuente de un archivo ejecutable denominado ShowTime.exe. También incluye el siguiente archivo de texto denominado Strings.txt que contiene un único recurso de cadena, TimeHeader:

TimeHeader=The current time is

Puede usar un archivo por lotes para generar el archivo de recursos e insertarlo en el archivo ejecutable. Este es el archivo por lotes para generar un archivo ejecutable mediante el compilador de C#:

resgen strings.txt
csc ShowTime.cs /resource:strings.resources

Para el compilador de Visual Basic, puede usar el siguiente archivo por lotes:

resgen strings.txt
vbc ShowTime.vb /resource:strings.resources
using System;
using System.Resources;

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("Strings", 
                               typeof(Example).Assembly);
      string timeString = rm.GetString("TimeHeader");
      Console.WriteLine("{0} {1:T}", timeString, DateTime.Now);   
   }
}
// The example displays output like the following:
//        The current time is 2:03:14 PM
Imports System.Resources

Module Example
   Public Sub Main()
      Dim rm As New ResourceManager("Strings", GetType(Example).Assembly)
      Dim timeString As String = rm.GetString("TimeHeader")
      Console.WriteLine("{0} {1:T}", timeString, Date.Now)   
   End Sub
End Module
' The example displays output similar to the following:
'       The current time is 2:03:14 PM

ResourceManager y recursos de Culture-Specific

Una aplicación localizada requiere que se implementen recursos, como se describe en el artículo Empaquetado e implementación de recursos. Si los ensamblados están configurados correctamente, el administrador de recursos determina qué recursos se van a recuperar en función de la propiedad del Thread.CurrentUICulture subproceso actual. (Esa propiedad también devuelve la referencia cultural de la interfaz de usuario del subproceso actual). Por ejemplo, si una aplicación se compila con recursos de idioma inglés predeterminados en el ensamblado principal y con recursos de idioma francés y ruso en dos ensamblados satélite, y la Thread.CurrentUICulture propiedad se establece en fr-FR, el administrador de recursos recupera los recursos en francés.

Puede establecer la CurrentUICulture propiedad explícita o implícitamente. La forma en que se establece determina cómo el ResourceManager objeto recupera los recursos en función de la referencia cultural:

  • Si establece explícitamente la Thread.CurrentUICulture propiedad en una referencia cultural específica, el administrador de recursos siempre recupera los recursos de esa referencia cultural, independientemente del explorador o del idioma del sistema operativo del usuario. Considere una aplicación compilada con recursos de idioma inglés predeterminados y tres ensamblados satélite que contienen recursos para inglés (Estados Unidos), francés (Francia) y ruso (Rusia). Si la CurrentUICulture propiedad se establece en fr-FR, el ResourceManager objeto siempre recupera los recursos francés (Francia), aunque el idioma del sistema operativo del usuario no sea francés. Asegúrese de que este es el comportamiento deseado antes de establecer la propiedad explícitamente.

    En ASP.NET aplicaciones, debe establecer la Thread.CurrentUICulture propiedad explícitamente, ya que es poco probable que la configuración del servidor coincida con las solicitudes de cliente entrantes. Una aplicación ASP.NET puede establecer la Thread.CurrentUICulture propiedad explícitamente en el idioma de aceptación del explorador del usuario.

    Al establecer explícitamente la Thread.CurrentUICulture propiedad , se define la referencia cultural de la interfaz de usuario actual para ese subproceso. No afecta a la referencia cultural actual de la interfaz de usuario de ningún otro subproceso de una aplicación.

  • Para establecer la referencia cultural de la interfaz de usuario de todos los subprocesos de un dominio de aplicación, asigne un CultureInfo objeto que represente esa referencia cultural a la propiedad estática CultureInfo.DefaultThreadCurrentUICulture .

  • Si no establece explícitamente la referencia cultural de la interfaz de usuario actual y no define una referencia cultural predeterminada para el dominio de aplicación actual, la CultureInfo.CurrentUICulture propiedad se establece implícitamente mediante la función WindowsGetUserDefaultUILanguage. Esta función la proporciona el Interfaz de usuario multilingüe (MUI), que permite al usuario establecer el idioma predeterminado. Si el usuario no establece el idioma de la interfaz de usuario, el valor predeterminado es el idioma instalado por el sistema, que es el idioma de los recursos del sistema operativo.

El siguiente ejemplo sencillo de "Hola mundo" establece explícitamente la referencia cultural de la interfaz de usuario actual. Contiene recursos para tres referencias culturales: inglés (Estados Unidos) o en-US, francés (Francia) o fr-FR, y ruso (Rusia) o ru-RU. Los recursos en-US se encuentran en un archivo de texto denominado Greetings.txt:

HelloString=Hello world!

Los recursos fr-FR se encuentran en un archivo de texto denominado Greetings.fr-FR.txt:

HelloString=Salut tout le monde!

Los recursos ru-RU se encuentran en un archivo de texto denominado Greetings.ru-RU.txt:

HelloString=Всем привет!

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

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

public class Example
{
   public 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;
      ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);
      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));
         Console.WriteLine(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}
// The example displays output like the following:
//       The current culture is ru-RU.
//       Всем привет!
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example
   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
      Dim rm As New ResourceManager("Greetings", GetType(Example).Assembly)
      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, rm.GetString("HelloString"))

         Console.WriteLine(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
' The example displays output like the following:
'       The current culture is ru-RU.
'       Всем привет!

Para compilar este ejemplo, cree un archivo por lotes (.bat) que contenga los siguientes comandos y ejecútelo desde el símbolo del sistema. Si usa C#, especifique csc en lugar de vbc y Example.cs en lugar de Example.vb.

resgen Greetings.txt
vbc Example.vb /resource:Greetings.resources

resgen Greetings.fr-FR.txt
Md fr-FR
al /embed:Greetings.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll

resgen Greetings.ru-RU.txt
Md ru-RU
al /embed:Greetings.ru-RU.resources /culture:ru-RU /out:ru-RU\Example.resources.dll

Recuperar recursos

Llame a los GetObject(String) métodos y GetString(String) para acceder a un recurso específico. También puede llamar al GetStream(String) método para recuperar recursos que no son de cadena como una matriz de bytes. De forma predeterminada, en una aplicación que tiene recursos localizados, estos métodos devuelven el recurso para la referencia cultural determinada por la referencia cultural de interfaz de usuario actual del subproceso que realizó la llamada. Consulte la sección anterior ResourceManager y los recursos de Culture-Specific para obtener más información sobre cómo se define la referencia cultural de interfaz de usuario actual de un subproceso. Si el administrador de recursos no encuentra el recurso para la referencia cultural de la interfaz de usuario del subproceso actual, usa un proceso de reserva para recuperar el recurso especificado. Si el administrador de recursos no encuentra ningún recurso localizado, usa los recursos de la referencia cultural predeterminada. Para obtener más información sobre las reglas de reserva de recursos, consulte la sección "Proceso de reserva de recursos" del artículo Empaquetado e implementación de recursos.

Nota

Si no se encuentra el archivo .resources especificado en el constructor de clase ResourceManager , el intento de recuperar un recurso produce una MissingManifestResourceException excepción o MissingSatelliteAssemblyException . Para obtener información sobre cómo tratar con la excepción, vea la sección Control de MissingManifestResourceException y MissingSatelliteAssemblyException Exceptions más adelante en este tema.

En el ejemplo siguiente se usa el GetString método para recuperar recursos específicos de la referencia cultural. 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 método para recuperar la cadena localizada, que se muestra junto con el día y el mes actuales. Observe que la salida muestra la cadena localizada adecuada, excepto cuando la referencia cultural actual de la interfaz de usuario es sueca (Suecia). Dado que los recursos de idioma sueco no están disponibles, la aplicación usa en su lugar los recursos de la referencia cultural predeterminada, que es inglés.

El ejemplo requiere los archivos de recursos basados en texto enumerados en la tabla siguiente. Cada tiene un único recurso de cadena denominado DateStart.

culture Nombre de archivo Nombre del recurso Valor del recurso
en-US DateStrings.txt DateStart Hoy es
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

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.Globalization;
using System.Resources;
using System.Threading;

[assembly:NeutralResourcesLanguage("en")]

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "ru-RU", "sv-SE" };
      ResourceManager rm = new ResourceManager("DateStrings",
                                               typeof(Example).Assembly);
      
      foreach (var cultureName in cultureNames) {
         CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
         Thread.CurrentThread.CurrentCulture = culture; 
         Thread.CurrentThread.CurrentUICulture = culture;

         Console.WriteLine("Current UI Culture: {0}", 
                           CultureInfo.CurrentUICulture.Name);
         string dateString = rm.GetString("DateStart");
         Console.WriteLine("{0} {1:M}.\n", dateString, DateTime.Now);                           
      }                                           
   }
}
// The example displays output similar to the following:
//       Current UI Culture: en-US
//       Today is February 03.
//       
//       Current UI Culture: fr-FR
//       Aujourd'hui, c'est le 3 février
//       
//       Current UI Culture: ru-RU
//       Сегодня февраля 03.
//       
//       Current UI Culture: sv-SE
//       Today is den 3 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example).Assembly)
      
      For Each cultureName In cultureNames
         Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
         Thread.CurrentThread.CurrentCulture = culture 
         Thread.CurrentThread.CurrentUICulture = culture

         Console.WriteLine("Current UI Culture: {0}", 
                           CultureInfo.CurrentUICulture.Name)
         Dim dateString As String = rm.GetString("DateStart")
         Console.WriteLine("{0} {1:M}.", dateString, Date.Now)                           
         Console.WriteLine()
      Next                                           
   End Sub
End Module
' The example displays output similar to the following:
'       Current UI Culture: en-US
'       Today is February 03.
'       
'       Current UI Culture: fr-FR
'       Aujourd'hui, c'est le 3 février
'       
'       Current UI Culture: ru-RU
'       Сегодня февраля 03.
'       
'       Current UI Culture: sv-SE
'       Today is den 3 februari.

Para compilar este ejemplo, cree un archivo por lotes que contenga los siguientes comandos y ejecútelo desde el símbolo del sistema. Si usa C#, especifique csc en lugar de vbc y showdate.cs en lugar de showdate.vb.

resgen DateStrings.txt
vbc showdate.vb /resource:DateStrings.resources

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

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

Hay dos maneras de recuperar los recursos de una referencia cultural específica distinta de la referencia cultural actual de la interfaz de usuario:

  • Puede llamar al GetString(String, CultureInfo)método , GetObject(String, CultureInfo)o GetStream(String, CultureInfo) para recuperar un recurso para una referencia cultural específica. Si no se encuentra un recurso localizado, el administrador de recursos usa el proceso de reserva de recursos para buscar un recurso adecuado.

  • Puede llamar al GetResourceSet método para obtener un ResourceSet objeto que represente los recursos de una referencia cultural determinada. En la llamada al método, puede determinar si el administrador de recursos sondea las referencias culturales primarias si no puede encontrar recursos localizados o si simplemente recurre a los recursos de la referencia cultural predeterminada. A continuación, puede usar los ResourceSet métodos para acceder a los recursos (localizados para esa referencia cultural) por nombre o para enumerar los recursos del conjunto.

Control de las excepciones MissingManifestResourceException y MissingSatelliteAssemblyException

Si intenta recuperar un recurso específico, pero el administrador de recursos no puede encontrar ese recurso y no se ha definido ninguna referencia cultural predeterminada o no se pueden encontrar los recursos de la referencia cultural predeterminada, el administrador de recursos produce una MissingManifestResourceException excepción si espera encontrar los recursos en el ensamblado principal o si MissingSatelliteAssemblyException espera encontrar los recursos en un ensamblado satélite. Tenga en cuenta que la excepción se produce cuando se llama a un método de recuperación de recursos como GetString o GetObject, y no cuando se crea una instancia de un ResourceManager objeto .

La excepción se produce normalmente en las siguientes condiciones:

  • El archivo de recursos o ensamblado satélite adecuado no existe. Si el administrador de recursos espera que los recursos predeterminados de la aplicación se inserten en el ensamblado de la aplicación principal, no están presentes. Si el NeutralResourcesLanguageAttribute atributo indica que los recursos predeterminados de la aplicación residen en un ensamblado satélite, no se encuentra ese ensamblado. Al compilar la aplicación, asegúrese de que los recursos están incrustados en el ensamblado principal o de que se genera el ensamblado satélite necesario y se denomina correctamente. Su nombre debe tener el formato appName.resources.dll y debe encontrarse en un directorio denominado después de la referencia cultural cuyos recursos contiene.

  • La aplicación no tiene definida una referencia cultural predeterminada o neutra. Agregue el NeutralResourcesLanguageAttribute atributo a un archivo de código fuente o al archivo de información del proyecto (AssemblyInfo.vb para una aplicación de Visual Basic o AssemblyInfo.cs para una aplicación de C#).

  • El baseName parámetro del ResourceManager(String, Assembly) constructor no especifica el nombre de un archivo .resources. El nombre debe incluir el espacio de nombres completo del archivo de recursos, pero no su extensión de nombre de archivo. Normalmente, los archivos de recursos que se crean en Visual Studio incluyen nombres de espacio de nombres, pero los archivos de recursos que se crean y compilan en el símbolo del sistema no lo hacen. Para determinar los nombres de los archivos .resources incrustados, compile y ejecute la siguiente utilidad. Se trata de una aplicación de consola que acepta el nombre de un ensamblado principal o ensamblado satélite como parámetro de línea de comandos. Muestra las cadenas que se deben proporcionar como parámetro baseName para que el administrador de recursos pueda identificar correctamente el recurso.

    using System;
    using System.IO;
    using System.Reflection;
    using System.Resources;
    
    public class Example
    {
       public static void Main()
       {
          if (Environment.GetCommandLineArgs().Length == 1) { 
             Console.WriteLine("No filename.");
             return;
          }
          
          string filename = Environment.GetCommandLineArgs()[1].Trim();
          // Check whether the file exists.
          if (! File.Exists(filename)) {
             Console.WriteLine("{0} does not exist.", filename);
             return;
          }   
          
          // Try to load the assembly.
          Assembly assem = Assembly.LoadFrom(filename);
          Console.WriteLine("File: {0}", filename);
             
          // Enumerate the resource files.
          string[] resNames = assem.GetManifestResourceNames();
          if (resNames.Length == 0)
             Console.WriteLine("   No resources found.");
    
          foreach (var resName in resNames)
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""));
    
          Console.WriteLine();
       }
    }
    
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    Module Example
       Public Sub Main()
          If Environment.GetCommandLineArgs.Length = 1 Then 
             Console.WriteLine("No filename.")
             Exit Sub
          End If
          Dim filename As String = Environment.GetCommandLineArgs(1).Trim()
          ' Check whether the file exists.
          If Not File.Exists(filename) Then
             Console.WriteLine("{0} does not exist.", filename)
             Exit Sub
          End If   
          
          ' Try to load the assembly.
          Dim assem As Assembly = Assembly.LoadFrom(filename)
          Console.WriteLine("File: {0}", filename)
             
          ' Enumerate the resource files.
          Dim resNames() As String = assem.GetManifestResourceNames()
          If resNames.Length = 0 Then
             Console.WriteLine("   No resources found.")
          End If
          For Each resName In resNames
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""))
          Next
          Console.WriteLine()
       End Sub
    End Module
    

Si va a cambiar explícitamente la referencia cultural actual de la aplicación, también debe recordar que el administrador de recursos recupera un conjunto de recursos basado en el valor de la CultureInfo.CurrentUICulture propiedad y no en la CultureInfo.CurrentCulture propiedad . Normalmente, si cambia un valor, también debe cambiar el otro.

Control de versiones de recursos

Dado que el ensamblado principal que contiene los recursos predeterminados de una aplicación es independiente de los ensamblados satélite de la aplicación, puede publicar una nueva versión del ensamblado principal sin volver a implementar los ensamblados satélite. Use el SatelliteContractVersionAttribute atributo para usar ensamblados satélite existentes e indique al administrador de recursos que no vuelva a implementarlos con una nueva versión del ensamblado principal,

Para obtener más información sobre la compatibilidad de control de versiones con ensamblados satélite, consulte el artículo Recuperación de recursos.

<satelliteassemblies> Nodo de archivo de configuración

Nota

Esta sección es específica de las aplicaciones de .NET Framework.

En el caso de los ejecutables que se implementan y ejecutan desde un sitio web (archivos .exe HREF), el ResourceManager objeto puede sondear los ensamblados satélite en la Web, lo que puede afectar al rendimiento de la aplicación. Para eliminar el problema de rendimiento, puede limitar este sondeo a los ensamblados satélite que ha implementado con la aplicación. Para ello, cree un <satelliteassemblies> nodo en el archivo de configuración de la aplicación para especificar que ha implementado un conjunto específico de referencias culturales para la aplicación y que el ResourceManager objeto no debe intentar sondear ninguna referencia cultural que no aparezca en ese nodo.

Nota

La alternativa preferida a la creación de un <satelliteassemblies> nodo es usar la característica de manifiesto de implementación de ClickOnce.

En el archivo de configuración de la aplicación, cree una sección similar a la siguiente:

<?xml version ="1.0"?>
<configuration>
  <satelliteassemblies>
    <assembly name="MainAssemblyName, Version=versionNumber, Culture=neutral, PublicKeyToken=null|yourPublicKeyToken">
      <culture>cultureName1</culture>
      <culture>cultureName2</culture>
      <culture>cultureName3</culture>
    </assembly>
  </satelliteassemblies>
</configuration>

Edite esta información de configuración de la siguiente manera:

  • Especifique uno o varios <assembly> nodos para cada ensamblado principal que implemente, donde cada nodo especifica un nombre de ensamblado completo. Especifique el nombre del ensamblado principal en lugar de MainAssemblyName y especifique los Versionvalores de atributo , PublicKeyTokeny Culture que corresponden al ensamblado principal.

    Para el Version atributo , especifique el número de versión del ensamblado. Por ejemplo, la primera versión del ensamblado podría ser el número de versión 1.0.0.0.

    Para el PublicKeyToken atributo , especifique la palabra clave null si no ha firmado el ensamblado con un nombre seguro o especifique el token de clave pública si ha firmado el ensamblado.

    Para el Culture atributo , especifique la palabra clave neutral para designar el ensamblado principal y haga que la ResourceManager clase sondee solo para las referencias culturales enumeradas en los <culture> nodos.

    Para obtener más información sobre los nombres de ensamblado completos, consulte el artículo Nombres de ensamblado. Para obtener más información sobre los ensamblados con nombre seguro, consulte el artículo Creación y uso de ensamblados con nombre seguro.

  • Especifique uno o varios <culture> nodos con un nombre de referencia cultural específico, como "fr-FR" o un nombre de referencia cultural neutral, como "fr".

Si se necesitan recursos para cualquier ensamblado que no aparezca en el <satelliteassemblies> nodo, la ResourceManager clase sondea las referencias culturales mediante reglas de sondeo estándar.

Aplicaciones de Windows 8.x

Importante

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

Para las aplicaciones Windows 8.x, la ResourceManager clase recupera los recursos de los archivos de índice de recursos de paquete (PRI). Un único archivo PRI (el archivo PRI del paquete de aplicación) contiene los recursos para la referencia cultural predeterminada y las referencias culturales localizadas. La utilidad MakePRI se usa para crear un archivo PRI a partir de uno o varios archivos de recursos que están en formato de recurso XML (.resw). En el caso de los recursos que se incluyen en un proyecto de Visual Studio, Visual Studio controla el proceso de creación y empaquetado automático del archivo PRI. A continuación, puede usar la clase .NET Framework ResourceManager para acceder a los recursos de la aplicación o de la biblioteca.

Puede crear una instancia de un ResourceManager objeto para una aplicación Windows 8.x de la misma manera que para una aplicación de escritorio.

A continuación, puede acceder a los recursos de una referencia cultural determinada pasando el nombre del recurso que se va a recuperar al GetString(String) método . De forma predeterminada, este método devuelve el recurso de la referencia cultural determinada por la referencia cultural de la interfaz de usuario actual del subproceso que realizó la llamada. También puede recuperar los recursos de una referencia cultural específica pasando el nombre del recurso y un CultureInfo objeto que representa la referencia cultural cuyo recurso se va a recuperar al GetString(String, CultureInfo) método . Si no se encuentra el recurso de la referencia cultural de la interfaz de usuario actual o la referencia cultural especificada, el administrador de recursos usa una lista de reserva de idioma de la interfaz de usuario para buscar un recurso adecuado.

Constructores

ResourceManager()

Inicializa una nueva instancia de la clase ResourceManager con valores predeterminados.

ResourceManager(String, Assembly)

Inicializa una nueva instancia de la clase ResourceManager que busca los recursos que contienen los archivos con el nombre raíz especificado, en el objeto dado.

ResourceManager(String, Assembly, Type)

Inicializa una nueva instancia de la clase ResourceManager que usa un ResourceSet especificado para buscar recursos que contenga archivos con el nombre de raíz especificado en el ensamblado determinado.

ResourceManager(Type)

Inicializa una nueva instancia de la clase ResourceManager que busca recursos en los ensamblados satélite a partir de la información del objeto de tipo especificado.

Campos

BaseNameField

Especifica el nombre raíz de los archivos de recursos donde ResourceManager busca recursos.

HeaderVersionNumber

Especifica la versión de los encabezados de archivos de recursos que la implementación actual de ResourceManager puede interpretar y producir.

MagicNumber

Conserva el número usado para identificar los archivos de recursos.

MainAssembly

Especifica el ensamblado principal que contiene los recursos.

ResourceSets
Obsoleto.

Contiene un objeto Hashtable que devuelve una asignación de referencias culturales a objetos ResourceSet.

Propiedades

BaseName

Obtiene el nombre raíz de los archivos de recursos donde ResourceManager busca recursos.

FallbackLocation

Obtiene o establece la ubicación de la que se recuperan los recursos de reserva predeterminados.

IgnoreCase

Obtiene o establece un valor que indica si el administrador de recursos permite realizar búsquedas de recursos sin distinción entre mayúsculas y minúsculas en los métodos GetString(String) y GetObject(String).

ResourceSetType

Obtiene el tipo de objeto de conjunto de recursos que el administrador de recursos usa para construir un objeto ResourceSet.

Métodos

CreateFileBasedResourceManager(String, String, Type)

Devuelve un objeto ResourceManager que busca un directorio específico en lugar de en el manifiesto del ensamblado para recursos.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetNeutralResourcesLanguage(Assembly)

Devuelve información específica de la referencia cultural para los recursos predeterminados del ensamblado recuperando el valor del atributo NeutralResourcesLanguageAttribute en un ensamblado específico.

GetObject(String)

Devuelve el valor del recurso que no sea de cadena especificado.

GetObject(String, CultureInfo)

Obtiene el valor del recurso especificado de cadena no adaptado a la referencia cultural especificada.

GetResourceFileName(CultureInfo)

Genera el nombre del archivo de recursos para el objeto CultureInfo especificado.

GetResourceSet(CultureInfo, Boolean, Boolean)

Recupera el conjunto de recursos para una referencia cultural determinada.

GetSatelliteContractVersion(Assembly)

Devuelve la versión especificada por el atributo SatelliteContractVersionAttribute en el ensamblado especificado.

GetStream(String)

Devuelve un objeto de secuencia de memoria no administrada del recurso especificado.

GetStream(String, CultureInfo)

Devuelve un objeto de secuencia de memoria no administrada a partir del recurso especificado, usando la referencia cultural especificada.

GetString(String)

Devuelve el valor del recurso de cadena especificado.

GetString(String, CultureInfo)

Devuelve el valor del recurso de cadena adaptado a la referencia cultural especificada.

GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
InternalGetResourceSet(CultureInfo, Boolean, Boolean)

Proporciona la implementación para buscar un conjunto de recursos.

MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ReleaseAllResources()

Indica al administrador de recursos que llame al método Close() en todos los objetos ResourceSet y libere todos los recursos.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Seguridad para subprocesos

Este tipo es seguro para la ejecución de subprocesos.

Consulte también