Share via


Buscar y utilizar recursos para una referencia cultural específica

Common Language Runtime proporciona compatibilidad para recuperar recursos específicos de referencias culturales que están empaquetados e implementados en ensamblados satélite. Los ensamblados satélite solo contienen archivos de recursos o recursos separados, como archivos .gif. No contienen código ejecutable.

En el modelo de implementación de ensamblado satélite, se crea una aplicación con un ensamblado predeterminado (el principal) y varios ensamblados satélite. Los recursos de la referencia cultural predeterminada o neutra deben empaquetarse con el ensamblado principal. Debe crearse además un ensamblado satélite independiente por cada idioma que admita la aplicación. Como los ensamblados satélite no forman parte del ensamblado principal, los recursos correspondientes a una referencia cultural específica se pueden reemplazar o actualizar fácilmente sin reemplazar el ensamblado principal de la aplicación.

Por ejemplo, en una sencilla aplicación "Hello world", si la referencia cultural predeterminada o neutra es "en" (inglés), puede crear un recurso denominado Greeting y almacenarlo en una cadena única denominada HelloString cuyo valor sea "Hello world!". Para indicar que "en" es la referencia cultural predeterminada de la aplicación, también debe agregar el siguiente atributo System.Resources.NeutralResourcesLanguageAttribute al archivo AssemblyInfo de la aplicación o a uno de los archivos de código fuente que se compilarán en el ensamblado principal de la aplicación.

<Assembly: NeutralResourcesLanguageAttribute("en")>

A continuación, agregará a la aplicación compatibilidad con las referencias culturales adicionales. Por ejemplo, puede agregar compatibilidad con las referencias culturales "en-US", "fr-FR" y "ru-RU" tal y como se describe a continuación:

  • Para admitir la referencia cultural "en-US" o Inglés (Estados Unidos), cree un archivo de recursos denominado Greeting.en-US.resx y guárdelo en una cadena única denominada HelloString cuyo valor sea "Hi world!".

  • Para admitir la referencia cultural "fr-FR" o Francés (Francia), cree un archivo de recursos denominado Greeting.fr-FR.resx y guárdelo en una cadena única denominada HelloString cuyo valor sea "Salut tout le monde!".

  • Para admitir la referencia cultural "ru-RU" o Ruso (Rusia), cree un archivo de recursos denominado Greeting.ru-RU.resx y guárdelo en una cadena única denominada HelloString cuyo valor sea "Всем привет!".

La clase System.Resources.ResourceManager proporciona acceso a los recursos específicos de la referencia cultural en tiempo de ejecución y controla cómo la aplicación los recupera mediante el proceso de retroceso de recursos. Para obtener más información, vea la sección "Proceso de reserva de recursos" del tema Empaquetar e implementar recursos.

El objeto ResourceManager determina qué recursos se van a recuperar en función de la propiedad CultureInfo.CurrentUICulture del subproceso actual. Por ejemplo, si se compila una aplicación con los recursos predeterminados del idioma inglés en el ensamblado principal y con los recursos de idioma del francés (Francia) y ruso (Rusia) en dos ensamblados satélite y la propiedad CurrentUICulture se establece en "fr-FR", el objeto ResourceManager recuperará los recursos del francés.

La propiedad CurrentUICulture puede establecerse implícita o explícitamente. El mecanismo mediante el que se establezca esta propiedad afectará al modo en que el objeto ResourceManager recupera los recursos en función de la referencia cultural:

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

    Precaución

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

  • Si la aplicación no establece explícitamente la propiedad CurrentUICulture, la función GetUserDefaultUILanguage la establece de forma implícita en Windows 2000 y Windows XP. Esta función la proporciona la 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, se establecerá de forma predeterminada en el idioma instalado en el sistema, que es el idioma de los recursos del sistema operativo.

En el siguiente ejemplo, se establece explícitamente la propiedad CurrentUICulture. Define una matriz que contiene los nombres de las referencias culturales compatibles para la sencilla aplicación "Hello world". A continuación, selecciona aleatoriamente uno de estos nombres de referencia cultural, lo utiliza para crear instancias de un objeto CultureInfo y convierte esa referencia cultural en la referencia cultural del subproceso actual. La llamada al método MessageBox.Show (en el ejemplo de C#) o a la función Interaction.MsgBox (en el ejemplo de Visual Basic) muestra después la cadena localizada asignada al recurso 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 Program
{
   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("LocatingCS1.Greetings", Assembly.GetExecutingAssembly()); 
         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;
      }
   }
}

Vea también

Conceptos

Recursos en aplicaciones

Recuperar recursos en ensamblados satélite

Resources in ASP.NET Applications

Otros recursos

Codificación y localización

Historial de cambios

Fecha

Historial

Motivo

Mayo de 2010

Se ha revisado exhaustivamente.

Comentarios de los clientes.