Clase System.Resources.NeutralResourcesLanguageAttribute

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

En las aplicaciones de escritorio, el NeutralResourcesLanguageAttribute atributo informa al administrador de recursos de la referencia cultural predeterminada de una aplicación y la ubicación de sus recursos. De forma predeterminada, los recursos se insertan en el ensamblado de la aplicación principal y puede usar el atributo de la manera siguiente. Esta instrucción especifica que el inglés (Estados Unidos) es la referencia cultural predeterminada de la aplicación.

[assembly: NeutralResourcesLanguage("en-US")]
<Assembly:NeutralResourcesLanguage("en-US")>

También puede usar el NeutralResourcesLanguageAttribute atributo para indicar dónde ResourceManager puede encontrar los recursos de la referencia cultural predeterminada proporcionando un UltimateResourceFallbackLocation valor de enumeración en la instrucción attribute. Esto suele hacerse para indicar que los recursos residen en un ensamblado satélite. Por ejemplo, la siguiente instrucción especifica que el inglés (Estados Unidos) es la referencia cultural predeterminada o neutral de la aplicación y que sus recursos residen en un ensamblado satélite. El ResourceManager objeto los buscará en un subdirectorio denominado en-US.

[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
<Assembly:NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)>

Sugerencia

Se recomienda usar siempre el NeutralResourcesLanguageAttribute atributo para definir la referencia cultural predeterminada de la aplicación.

El atributo realiza dos roles:

  • Si los recursos de la referencia cultural predeterminada se insertan en el ensamblado principal de la aplicación y ResourceManager tienen que recuperar recursos que pertenecen a la misma referencia cultural que la referencia cultural predeterminada, usa ResourceManager automáticamente los recursos ubicados en el ensamblado principal en lugar de buscar un ensamblado satélite. Esto omite el sondeo de ensamblado habitual, mejora el rendimiento de la búsqueda para el primer recurso que se carga y puede reducir el espacio de trabajo. Consulte Empaquetado e implementación de recursos para el proceso ResourceManager que usa para sondear los archivos de recursos.

  • Si los recursos de la referencia cultural predeterminada se encuentran en un ensamblado satélite en lugar de en el ensamblado de la aplicación principal, el NeutralResourcesLanguageAttribute atributo especifica la referencia cultural y el directorio desde el que el entorno de ejecución puede cargar los recursos.

Aplicaciones de la Tienda Windows 8.x

En las aplicaciones de la Tienda Windows 8.x cuyos recursos se cargan y recuperan mediante la ResourceManager clase , el NeutralResourcesLanguageAttribute atributo define la referencia cultural neutral cuyos recursos se usan en caso de un sondeo con errores. No especifica la ubicación de los recursos. De forma predeterminada, ResourceManager usa el archivo de índice de recursos del paquete (PRI) de la aplicación para buscar los recursos de la referencia cultural predeterminada. La referencia cultural neutra definida por el NeutralResourcesLanguageAttribute atributo se agrega al final de la lista de idiomas de la interfaz de usuario para simular este efecto.

Si carga y recupera recursos mediante la clase WindowsRuntime Windows.ApplicationModel.Resources.ResourceLoader o los tipos del espacio de nombres Windows.ApplicationModel.Resources.Core , se omite el NeutralResourcesLanguageAttribute atributo.

Ejemplos

En el NeutralResourcesLanguageAttribute ejemplo siguiente se usa una aplicación sencilla de "Hola mundo" para ilustrar el uso del atributo para definir una referencia cultural predeterminada o de reserva. Requiere la creación de archivos de recursos independientes para las referencias culturales inglés (en), inglés (Estados Unidos) (en-US) y francés (Francia) (fr-FR). A continuación se muestra el contenido de un archivo de texto denominado ExampleResources.txt para la referencia cultural en inglés.

# Resources for the default (en) culture.
Greeting=Hello

Para usar el archivo de recursos en una aplicación, debe usar el Generador de archivos de recursos (Resgen.exe) para convertir el archivo de su formato de texto (.txt) a un formato binario (.resources) como se indica a continuación:

resgen ExampleResources.txt

Cuando se compila la aplicación, el archivo de recursos binarios se incrustará en el ensamblado de la aplicación principal.

A continuación se muestra el contenido de un archivo de texto denominado ExampleResources.en-US.txt que proporciona recursos para la referencia cultural inglés (Estados Unidos).

# Resources for the en-US culture.
Greeting=Hi

El archivo de texto se puede convertir en un archivo de recursos binarios mediante el Generador de archivos de recursos (ResGen.exe) en la línea de comandos de la siguiente manera:

resgen ExampleResources.en-US.txt ExampleResources.en-US.resources

A continuación, el archivo de recursos binarios debe compilarse en un ensamblado mediante Assembly Linker (Al.exe) y colocarse en el subdirectorio en-US del directorio de la aplicación mediante la emisión del comando siguiente:

al /t:lib /embed:ExampleResources.en-US.resources /culture:en-US /out:en-us\Example.resources.dll

A continuación se muestra el contenido de un archivo de texto denominado ExampleResources.fr-FR.txt que proporciona recursos para la referencia cultural francés (Francia).

# Resources for the fr-FR culture.
Greeting=Bonjour

El archivo de texto se puede convertir en un archivo de recursos binarios mediante ResGen.exe en la línea de comandos de la manera siguiente:

resgen ExampleResources.fr-FR.txt ExampleResources.fr-FR.resources

A continuación, el archivo de recursos binarios se debe compilar en un ensamblado mediante Assembly Linker y colocarlo en el subdirectorio fr-FR del directorio de la aplicación mediante la emisión del siguiente comando:

al /t:lib /embed:ExampleResources.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll

En el ejemplo siguiente se proporciona el código ejecutable que establece la referencia cultural actual, se solicita el nombre del usuario y se muestra una cadena localizada.

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

[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example
{
    public static void Main()
    {
        // Select the current culture randomly to test resource fallback.
        string[] cultures = { "de-DE", "en-us", "fr-FR" };
        Random rnd = new Random();
        int index = rnd.Next(0, cultures.Length);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultures[index]);
        Console.WriteLine("The current culture is {0}",
                          CultureInfo.CurrentUICulture.Name);

        // 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);
    }
}
Imports System.Globalization
Imports System.Resources
Imports System.Threading 

<Assembly:NeutralResourcesLanguageAttribute("en")>

Module Example
   Public Sub Main()
      ' Select the current culture randomly to test resource fallback.
      Dim cultures() As String = { "de-DE", "en-us", "fr-FR" }
      Dim rnd As New Random()
      Dim index As Integer = rnd.Next(0, cultures.Length)
      Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultures(index))      
      Console.WriteLine("The current culture is {0}", 
                        CultureInfo.CurrentUICulture.Name)       

      ' 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

Se puede compilar mediante el comando siguiente en Visual Basic:

vbc Example.vb /resource:ExampleResources.resources

o mediante el comando siguiente en C#:

csc Example.cs /resource:ExampleResources.resources