Empaquetado e implementación de recursos en aplicaciones .NETPackaging and Deploying Resources in .NET Apps

Las aplicaciones se basan en el Administrador de recursos de .NET Framework, representado por la clase ResourceManager, para recuperar recursos localizados.Applications rely on the .NET Framework Resource Manager, represented by the ResourceManager class, to retrieve localized resources. El Administrador de recursos da por supuesto que se usa un modelo de concentrador y radio para empaquetar e implementar los recursos.The Resource Manager assumes that a hub and spoke model is used to package and deploy resources. El concentrador es el ensamblado principal que contiene el código ejecutable no localizable y los recursos de una referencia cultural única, denominada referencia cultural neutra o predeterminada.The hub is the main assembly that contains the nonlocalizable executable code and the resources for a single culture, called the neutral or default culture. La referencia cultural predeterminada es la referencia cultural de reserva de la aplicación. Se trata de la referencia cultural cuyos recursos se usarán si no se encuentran recursos localizados.The default culture is the fallback culture for the application; it is the culture whose resources are used if localized resources cannot be found. Cada radio se conecta a un ensamblado satélite que contiene los recursos de una única referencia cultural, pero no contiene código.Each spoke connects to a satellite assembly that contains the resources for a single culture, but does not contain any code.

Este modelo cuenta con varias ventajas:There are several advantages to this model:

  • Puede agregar recursos para nuevas referencias culturales de forma incremental después de implementar una aplicación.You can incrementally add resources for new cultures after you have deployed an application. Dado que el desarrollo posterior de los recursos específicos de la referencia cultural puede requerir bastante tiempo, esto permite lanzar primero la aplicación principal y entregar los recursos específicos de la referencia cultural en un momento posterior.Because subsequent development of culture-specific resources can require a significant amount of time, this allows you to release your main application first, and deliver culture-specific resources at a later date.
  • Puede actualizar y cambiar los ensamblados satélite de una aplicación sin volver a compilarla.You can update and change an application's satellite assemblies without recompiling the application.
  • Una aplicación solo necesita cargar los ensamblados satélite que contienen los recursos necesarios para una referencia cultural determinada.An application needs to load only those satellite assemblies that contain the resources needed for a particular culture. Esto puede reducir considerablemente el uso de recursos del sistema.This can significantly reduce the use of system resources.

Aun así, este modelo también tiene inconvenientes:However, there are also disadvantages to this model:

  • Debe administrar varios conjuntos de recursos.You must manage multiple sets of resources.
  • El costo inicial de probar una aplicación es mayor, ya que se deben someter a prueba varias configuraciones.The initial cost of testing an application increases, because you must test several configurations. Tenga en cuenta que, a largo plazo, será más fácil y menos costoso probar una aplicación principal con varios ensamblados satélite que probar y mantener varias versiones internacionales paralelas.Note that in the long term it will be easier and less expensive to test one core application with several satellites, than to test and maintain several parallel international versions.

Convenciones de nomenclatura de recursosResource naming conventions

Al empaquetar los recursos de la aplicación, debe asignarles un nombre según las convenciones de nomenclatura de recursos que espera Common Language Runtime.When you package your application's resources, you must name them using the resource naming conventions that the common language runtime expects. El tiempo de ejecución identifica un recurso por su nombre de referencia cultural.The runtime identifies a resource by its culture name. Cada referencia cultural tiene un nombre único, que suele ser una combinación de un nombre de referencia cultural de dos letras en minúsculas asociado a un idioma y, si es necesario, un nombre de referencia cultural secundaria de dos letras en mayúsculas asociado a un país o región.Each culture is given a unique name, which is usually a combination of a two-letter, lowercase culture name associated with a language and, if required, a two-letter, uppercase subculture name associated with a country or region. El nombre de la referencia cultural secundaria va después del nombre de la referencia cultural, separado por un guion (-).The subculture name follows the culture name, separated by a dash (-). Algunos ejemplos son los siguientes: ja-JP para japonés de Japón, en-US para inglés de Estados Unidos, de-DE para alemán de Alemania o de-AT para alemán de Austria.Examples include ja-JP for Japanese as spoken in Japan, en-US for English as spoken in the United States, de-DE for German as spoken in Germany, or de-AT for German as spoken in Austria. Consulte la columna Etiqueta de idioma en la lista de nombres de los idiomas y las regiones compatibles con Windows.See the Language tag column in the list of language/region names supported by Windows. Los nombres de las referencias culturales siguen el estándar definido por BCP 47.Culture names follow the standard defined by BCP 47.

Nota

Existen algunas excepciones para los nombres de referencia cultural de dos letras, como zh-Hans para chino (simplificado).There are some exceptions for the two-letter culture names, such as zh-Hans for Chinese (Simplified).

Nota

Para más información sobre cómo crear archivos de recursos, vea Crear archivos de recursos y Crear ensamblados satélite.For information about creating resource files, see Creating Resource Files and Creating Satellite Assemblies.

El proceso de reserva de recursosThe Resource Fallback Process

El modelo de concentrador y radio para empaquetar e implementar recursos usa un proceso de reserva para buscar los recursos apropiados.The hub and spoke model for packaging and deploying resources uses a fallback process to locate appropriate resources. Si una aplicación solicita un recurso localizado que no está disponible, Common Language Runtime busca en la jerarquía de referencias culturales el recurso de reserva apropiado que coincida mejor con la solicitud de la aplicación del usuario y produce una excepción solo en última instancia.If an application requests a localized resource that is unavailable, the common language runtime searches the hierarchy of cultures for an appropriate fallback resource that most closely matches the user's application's request, and throws an exception only as a last resort. El tiempo de ejecución usará el recurso apropiado, si lo encuentra, en cada nivel de la jerarquía.At each level of the hierarchy, if an appropriate resource is found, the runtime uses it. Si no se encuentra el recurso, la búsqueda continúa en el siguiente nivel.If the resource is not found, the search continues at the next level.

Para mejorar el rendimiento de la búsqueda, aplique el atributo NeutralResourcesLanguageAttribute al ensamblado principal y pásele el nombre del idioma neutral que funcionará con el ensamblado principal.To improve lookup performance, apply the NeutralResourcesLanguageAttribute attribute to your main assembly, and pass it the name of the neutral language that will work with your main assembly.

Proceso de reserva de recursos de .NET Framework.NET Framework resource fallback process

El proceso de reserva de recursos de .NET Framework conlleva los pasos siguientes:The .NET Framework resource fallback process involves the following steps:

Sugerencia

Es posible que pueda usar el elemento de configuración <relativeBindForResources> para optimizar el proceso de reserva de recursos y el proceso mediante el cual el tiempo de ejecución sondea los ensamblados de recursos.You may be able to use the <relativeBindForResources> configuration element to optimize the resource fallback process and the process by which the runtime probes for resource assemblies. Para obtener más información, vea la sección Optimizar el proceso de reserva de recursos.For more information, see the Optimizing the Resource Fallback Process section.

  1. El tiempo de ejecución busca primero en la caché global de ensamblados un ensamblado que coincida con la referencia cultural solicitada para la aplicación.The runtime first checks the global assembly cache for an assembly that matches the requested culture for your application.

    La caché global de ensamblados puede almacenar ensamblados de recursos compartidos por varias aplicaciones.The global assembly cache can store resource assemblies that are shared by many applications. Esto evita tener que incluir conjuntos de recursos específicos en la estructura de directorios de cada aplicación que se cree.This frees you from having to include specific sets of resources in the directory structure of every application you create. Si el tiempo de ejecución encuentra una referencia al ensamblado, busca en el ensamblado el recurso solicitado.If the runtime finds a reference to the assembly, it searches the assembly for the requested resource. Si encuentra la entrada en el ensamblado, usará el recurso solicitado.If it finds the entry in the assembly, it uses the requested resource. Si no encuentra la entrada, seguirá con la búsqueda.If it doesn't find the entry, it continues the search.

  2. Después, el tiempo de ejecución busca en el directorio del ensamblado actualmente en ejecución un subdirectorio que coincida con la referencia cultural solicitada.The runtime next checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. Si lo encuentra, busca en ese subdirectorio un ensamblado satélite válido para la referencia cultural solicitada.If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture. Luego, el tiempo de ejecución busca en el ensamblado satélite el recurso solicitado.The runtime then searches the satellite assembly for the requested resource. Si encuentra el recurso en el ensamblado, lo usará.If it finds the resource in the assembly, it uses it. Si no encuentra el recurso, seguirá con la búsqueda.If it doesn't find the resource, it continues the search.

  3. Después, el tiempo de ejecución consulta Windows Installer para determinar si el ensamblado satélite se va a instalar a petición.The runtime next queries the Windows Installer to determine whether the satellite assembly is to be installed on demand. Si es así, controla la instalación, carga el ensamblado y busca en él el recurso solicitado.If so, it handles the installation, loads the assembly, and searches it or the requested resource. Si encuentra el recurso en el ensamblado, lo usará.If it finds the resource in the assembly, it uses it. Si no encuentra el recurso, seguirá con la búsqueda.If it doesn't find the resource, it continues the search.

  4. El tiempo de ejecución genera el evento AppDomain.AssemblyResolve para indicar que no ha podido encontrar el ensamblado satélite.The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. Si opta por controlar el evento, el controlador de eventos puede devolver una referencia al ensamblado satélite cuyos recursos se usarán para la búsqueda.If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. En caso contrario, el controlador de eventos devuelve null y continúa la búsqueda.Otherwise, the event handler returns null and the search continues.

  5. Luego, el tiempo de ejecución busca de nuevo en la caché global de ensamblados el ensamblado principal de la referencia cultural solicitada.The runtime next searches the global assembly cache again, this time for the parent assembly of the requested culture. Si el ensamblado principal existe en la caché global de ensamblados, el tiempo de ejecución busca en el ensamblado el recurso solicitado.If the parent assembly exists in the global assembly cache, the runtime searches the assembly for the requested resource.

    La referencia cultural principal se define como la referencia cultural de reserva adecuada.The parent culture is defined as the appropriate fallback culture. Considere los elementos principales como candidatos de reserva, porque es preferible proporcionar cualquier recurso antes que producir una excepción.Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. Este proceso también permite reutilizar los recursos.This process also allows you to reuse resources. Debe incluir un recurso determinado en el nivel principal solo si la referencia cultural secundaria no necesita localizar el recurso solicitado.You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. Por ejemplo, si proporciona ensamblados satélite para en (inglés neutro), en-GB (inglés del Reino Unido) y en-US (inglés de Estados Unidos), el satélite en contendrá la terminología común, mientras que los satélites en-GB y en-US proporcionarán invalidaciones solo para los términos que difieren.For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite would contain the common terminology, and the en-GB and en-US satellites could provide overrides for only those terms that differ.

  6. Después, el tiempo de ejecución busca en el directorio del ensamblado actualmente en ejecución para ver si contiene un directorio principal.The runtime next checks the directory of the currently executing assembly to see if it contains a parent directory. Si existe un directorio principal, el tiempo de ejecución busca en el directorio un ensamblado satélite válido para la referencia cultural principal.If a parent directory exists, the runtime searches the directory for a valid satellite assembly for the parent culture. Si encuentra el ensamblado, el tiempo de ejecución busca en el ensamblado el recurso solicitado.If it finds the assembly, the runtime searches the assembly for the requested resource. Si encuentra el recurso, lo usará.If it finds the resource, it uses it. Si no encuentra el recurso, seguirá con la búsqueda.If it doesn't find the resource, it continues the search.

  7. Después, el tiempo de ejecución consulta Windows Installer para determinar si el ensamblado satélite principal se va a instalar a petición.The runtime next queries the Windows Installer to determine whether the parent satellite assembly is to be installed on demand. Si es así, controla la instalación, carga el ensamblado y busca en él el recurso solicitado.If so, it handles the installation, loads the assembly, and searches it or the requested resource. Si encuentra el recurso en el ensamblado, lo usará.If it finds the resource in the assembly, it uses it. Si no encuentra el recurso, seguirá con la búsqueda.If it doesn't find the resource, it continues the search.

  8. El tiempo de ejecución genera el evento AppDomain.AssemblyResolve para indicar que no ha podido encontrar un recurso de reserva apropiado.The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find an appropriate fallback resource. Si opta por controlar el evento, el controlador de eventos puede devolver una referencia al ensamblado satélite cuyos recursos se usarán para la búsqueda.If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. En caso contrario, el controlador de eventos devuelve null y continúa la búsqueda.Otherwise, the event handler returns null and the search continues.

  9. Después, el tiempo de ejecución busca ensamblados principales, como en los tres pasos anteriores, en varios niveles posibles.The runtime next searches parent assemblies, as in the previous three steps, through many potential levels. Cada referencia cultural tiene un solo elemento principal, que se define mediante la propiedad CultureInfo.Parent, pero un elemento principal puede tener su propio elemento principal.Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. La búsqueda de referencias culturales principales se detiene cuando la propiedad Parent de una referencia cultural devuelve CultureInfo.InvariantCulture. Para la reserva de recursos, la referencia cultural invariable no se considera una referencia cultural principal ni una referencia cultural que pueda tener recursos.The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture; for resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  10. Si se ha buscado en la referencia cultural especificada inicialmente y en todos los elementos principales y el recurso sigue sin encontrarse, se usa el recurso de la referencia cultural predeterminada (de reserva).If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. Normalmente, los recursos de la referencia cultural predeterminada se incluyen en el ensamblado de la aplicación principal.Typically, the resources for the default culture are included in the main application assembly. Aun así, puede especificar un valor de Satellite para la propiedad Location del atributo NeutralResourcesLanguageAttribute para indicar que la ubicación de reserva definitiva para los recursos es un ensamblado satélite, en lugar del ensamblado principal.However, you can specify a value of Satellite for the Location property of the NeutralResourcesLanguageAttribute attribute to indicate that the ultimate fallback location for resources is a satellite assembly, rather than the main assembly.

    Nota

    El recurso predeterminado es el único recurso que se puede compilar con el ensamblado principal.The default resource is the only resource that can be compiled with the main assembly. A menos que especifique un ensamblado satélite mediante el atributo NeutralResourcesLanguageAttribute, es la reserva definitiva (elemento principal final).Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). Por lo tanto, se recomienda incluir siempre un conjunto de recursos predeterminado en el ensamblado principal.Therefore, we recommend that you always include a default set of resources in your main assembly. Esto ayuda a evitar que se produzcan excepciones.This helps prevent exceptions from being thrown. Al incluir un archivo de recursos predeterminado, se proporciona una reserva para todos los recursos y se garantiza que al menos un recurso esté siempre presente para el usuario, incluso si no es específico de la referencia cultural.By including a default resource, file you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  11. Por último, si el tiempo de ejecución no encuentra un recurso para una referencia cultural predeterminada (de reserva), se produce una excepción MissingManifestResourceException o MissingSatelliteAssemblyException para indicar que no se pudo encontrar el recurso.Finally, if the runtime doesn't find a resource for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found.

Por ejemplo, supongamos que la aplicación solicita un recurso localizado para español (México) (referencia cultural es-MX).For example, suppose the application requests a resource localized for Spanish (Mexico) (the es-MX culture). El tiempo de ejecución busca primero en la caché global de ensamblados el ensamblado que coincida con es-MX, pero no lo encuentra.The runtime first searches the global assembly cache for the assembly that matches es-MX, but doesn't find it. Después, el tiempo de ejecución busca un directorio es-MX en el directorio del ensamblado actualmente en ejecución.The runtime then searches the directory of the currently executing assembly for an es-MX directory. Si esto no funciona, el tiempo de ejecución busca de nuevo en la caché global de ensamblados un ensamblado principal que refleje la referencia cultural de reserva adecuada, en este caso, es (español).Failing that, the runtime searches the global assembly cache again for a parent assembly that reflects the appropriate fallback culture — in this case, es (Spanish). Si no se encuentra el ensamblado principal, el tiempo de ejecución busca en todos los posibles niveles de ensamblados principales la referencia cultural es-MX hasta que encuentra un recurso correspondiente.If the parent assembly is not found, the runtime searches all potential levels of parent assemblies for the es-MX culture until it finds a corresponding resource. Si no se encuentra un recurso, el tiempo de ejecución usa el recurso para la referencia cultural predeterminada.If a resource isn't found, the runtime uses the resource for the default culture.

Optimización del proceso de reserva de recursos de .NET FrameworkOptimizing the .NET Framework Resource Fallback Process

En las siguientes condiciones, puede optimizar el proceso por el que el tiempo de ejecución busca recursos en ensamblados satélite.Under the following conditions, you can optimize the process by which the runtime searches for resources in satellite assemblies

  • Los ensamblados satélite se implementan en la misma ubicación que el ensamblado de código.Satellite assemblies are deployed in the same location as the code assembly. Si el ensamblado de código está instalado en la caché global de ensamblados, los ensamblados satélite también se instalan en la caché global de ensamblados.If the code assembly is installed in the Global Assembly Cache, satellite assemblies are also installed in the global assembly cache. Si el ensamblado de código está instalado en un directorio, los ensamblados satélite se instalan en carpetas específicas de referencias culturales de ese directorio.If the code assembly is installed in a directory, satellite assemblies are installed in culture-specific folders of that directory.

  • Los ensamblados satélite no se instalan a petición.Satellite assemblies are not installed on demand.

  • El código de la aplicación no controla el evento AppDomain.AssemblyResolve.Application code does not handle the AppDomain.AssemblyResolve event.

Para optimizar el sondeo de ensamblados satélite, incluya el elemento <relativeBindForResources> y establezca su atributo enabled en true en el archivo de configuración de la aplicación, como se muestra en el ejemplo siguiente.You optimize the probe for satellite assemblies by including the <relativeBindForResources> element and setting its enabled attribute to true in the application configuration file, as shown in the following example.

<configuration>
   <runtime>
      <relativeBindForResources enabled="true" />
   </runtime>
</configuration>

El sondeo optimizado de los ensamblados satélite es una característica opcional.The optimized probe for satellite assemblies is an opt-in feature. Es decir, el tiempo de ejecución sigue los pasos documentados en El proceso de reserva de recursos, a menos que el elemento <relativeBindForResources> esté presente en el archivo de configuración de la aplicación y su atributo enabled esté establecido en true.That is, the runtime follows the steps documented in The Resource Fallback Process unless the <relativeBindForResources> element is present in the application's configuration file and its enabled attribute is set to true. Si este es el caso, el proceso de sondeo de un ensamblado satélite se modifica de la manera siguiente:If this is the case, the process of probing for a satellite assembly is modified as follows:

  • El tiempo de ejecución usa la ubicación del ensamblado de código principal para sondear el ensamblado satélite.The runtime uses the location of the parent code assembly to probe for the satellite assembly. Si el ensamblado principal está instalado en la caché global de ensamblados, el tiempo de ejecución sondea la memoria caché, pero no el directorio de la aplicación.If the parent assembly is installed in the global assembly cache, the runtime probes in the cache but not in the application's directory. Si el ensamblado principal está instalado en un directorio de aplicación, el tiempo de ejecución sondea el directorio de la aplicación, pero no la caché global de ensamblados.If the parent assembly is installed in an application directory, the runtime probes in the application directory but not in the global assembly cache.

  • El tiempo de ejecución no consulta Windows Installer para la instalación a petición de ensamblados satélite.The runtime doesn't query the Windows Installer for on-demand installation of satellite assemblies.

  • Si se produce un error en el sondeo de un ensamblado de recurso en particular, el tiempo de ejecución no genera el evento AppDomain.AssemblyResolve.If the probe for a particular resource assembly fails, the runtime does not raise the AppDomain.AssemblyResolve event.

Proceso de reserva de recursos de .NET Core.NET Core resource fallback process

El proceso de reserva de recursos de .NET Core conlleva los pasos siguientes:The .NET Core resource fallback process involves the following steps:

  1. El entorno de ejecución intenta cargar un ensamblado satélite para la referencia cultural solicitada.The runtime attempts to load a satellite assembly for the requested culture.

    • Busca en el directorio del ensamblado actualmente en ejecución un directorio que coincida con la referencia cultural solicitada.Checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. Si lo encuentra, busca en ese directorio un ensamblado satélite válido para la referencia cultural solicitada y lo carga.If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture and loads it.

      Nota

      En sistemas operativos con sistemas de archivos que distinguen mayúsculas de minúsculas (es decir, Linux y macOS), la búsqueda del subdirectorio de nombres de referencias culturales distingue mayúsculas de minúsculas.On operating systems with case-sensitive file systems (that is, Linux and macOS), the culture name subdirectory search is case-sensitive. El nombre del subdirectorio debe coincidir exactamente con las mayúsculas y minúsculas de CultureInfo.Name (por ejemplo, es o es-MX).The subdirectory name must exactly match the case of the CultureInfo.Name (for example, es or es-MX).

      Nota

      Si el programador ha derivado un contexto local de ensamblado personalizado de AssemblyLoadContext, la situación es complicada.If the programmer has derived a custom assembly load context from AssemblyLoadContext, the situation is complicated. Si el ensamblado que se ejecuta se cargó en el contexto personalizado, el entorno de ejecución carga el ensamblado satélite en el contexto personalizado.If the executing assembly was loaded into the custom context, the runtime loads the satellite assembly into the custom context. Los detalles quedan fuera del ámbito de este documento.The details are out of scope for this document. Consulte AssemblyLoadContext.See AssemblyLoadContext.

    • Si no se encuentra un ensamblado satélite, AssemblyLoadContext genera el evento AssemblyLoadContext.Resolving para indicar que no se puede encontrarlo.If a satellite assemble has not been found, the AssemblyLoadContext raises the AssemblyLoadContext.Resolving event to indicate that it is unable to find the satellite assembly. Si opta por controlar el evento, el controlador de eventos puede cargar y devolver una referencia al ensamblado satélite.If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

    • Si todavía no se encuentra un ensamblado satélite, AssemblyLoadContext hace que AppDomain desencadene un evento AppDomain.AssemblyResolve para indicar que no es posible encontrar el ensamblado satélite.If a satellite assembly still has not been found, the AssemblyLoadContext causes the AppDomain to trigger an AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. Si opta por controlar el evento, el controlador de eventos puede cargar y devolver una referencia al ensamblado satélite.If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

  2. Si se encuentra un ensamblado satélite, el entorno de ejecución lo busca para el recurso solicitado.If a satellite assembly is found, the runtime searches it for the requested resource. Si encuentra el recurso en el ensamblado, lo usará.If it finds the resource in the assembly, it uses it. Si no encuentra el recurso, seguirá con la búsqueda.If it doesn't find the resource, it continues the search.

    Nota

    Para buscar un recurso dentro del ensamblado satélite, el entorno de ejecución busca el archivo de recursos solicitado por ResourceManager para el CultureInfo.Name actual.To find a resource within the satellite assembly, the runtime searches for the resource file requested by the ResourceManager for the current CultureInfo.Name. Dentro del archivo de recursos, busca el nombre del recurso solicitado.Within the resource file it searches for the requested resource name. Si no se encuentra ninguno, se considera que no se encontró el recurso.If either is not found, the resource is treated as not found.

  3. A continuación, el entorno de ejecución busca los ensamblados de referencias culturales principales a través de muchos niveles potenciales, y repite cada vez los pasos 1 y 2.The runtime next searches the parent culture assemblies through many potential levels, each time repeating steps 1 & 2.

    La referencia cultural principal se define como una referencia cultural de reserva adecuada.The parent culture is defined as an appropriate fallback culture. Considere los elementos principales como candidatos de reserva, porque es preferible proporcionar cualquier recurso antes que producir una excepción.Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. Este proceso también permite reutilizar los recursos.This process also allows you to reuse resources. Debe incluir un recurso determinado en el nivel principal solo si la referencia cultural secundaria no necesita localizar el recurso solicitado.You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. Por ejemplo, si proporciona ensamblados satélite para en (inglés neutro), en-GB (inglés del Reino Unido) y en-US (inglés de Estados Unidos), el satélite en contiene la terminología común, mientras que los satélites en-GB y en-US proporcionarán invalidaciones solo para los términos que difieren.For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite contains the common terminology, and the en-GB and en-US satellites provides overrides for only those terms that differ.

    Cada referencia cultural tiene un solo elemento principal, que se define mediante la propiedad CultureInfo.Parent, pero un elemento principal puede tener su propio elemento principal.Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. La búsqueda de las referencias culturales principales se detiene cuando la propiedad Parent de una referencia cultural devuelve CultureInfo.InvariantCulture.The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture. Para la reserva de recursos, la referencia cultural invariable no se considera como una referencia cultural principal ni como una referencia cultural que puede tener recursos.For resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  4. Si se ha buscado en la referencia cultural especificada inicialmente y en todos los elementos principales y el recurso sigue sin encontrarse, se usa el recurso de la referencia cultural predeterminada (de reserva).If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. Normalmente, los recursos de la referencia cultural predeterminada se incluyen en el ensamblado de la aplicación principal.Typically, the resources for the default culture are included in the main application assembly. Aun así, puede especificar un valor de Satellite para la propiedad Location para indicar que la ubicación de reserva definitiva para los recursos es un ensamblado satélite, en lugar del ensamblado principal.However, you can specify a value of Satellite for the Location property to indicate that the ultimate fallback location for resources is a satellite assembly rather than the main assembly.

    Nota

    El recurso predeterminado es el único recurso que se puede compilar con el ensamblado principal.The default resource is the only resource that can be compiled with the main assembly. A menos que especifique un ensamblado satélite mediante el atributo NeutralResourcesLanguageAttribute, es la reserva definitiva (elemento principal final).Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). Por lo tanto, se recomienda incluir siempre un conjunto de recursos predeterminado en el ensamblado principal.Therefore, we recommend that you always include a default set of resources in your main assembly. Esto ayuda a evitar que se produzcan excepciones.This helps prevent exceptions from being thrown. Al incluir un archivo de recursos predeterminado, se proporciona una reserva para todos los recursos y se garantiza que al menos un recurso esté siempre presente para el usuario, incluso si no es específico de la referencia cultural.By including a default resource file, you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  5. Por último, si el tiempo de ejecución no encuentra un archivo de recursos para una referencia cultural predeterminada (de reserva), se produce una excepción MissingManifestResourceException o MissingSatelliteAssemblyException para indicar que no se pudo encontrar el recurso.Finally, if the runtime doesn't find a resource file for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found. Si se encuentra el archivo de recursos pero el recurso solicitado no se encuentra, la solicitud devuelve null.If the resource file is found but the requested resource is not present the request returns null.

Reserva definitiva en ensamblado satéliteUltimate Fallback to Satellite Assembly

Como alternativa, puede quitar recursos del ensamblado principal y especificar que el tiempo de ejecución debe cargar los recursos de reserva definitiva de un ensamblado satélite correspondiente a una referencia cultural específica.You can optionally remove resources from the main assembly and specify that the runtime should load the ultimate fallback resources from a satellite assembly that corresponds to a specific culture. Para controlar el proceso de reserva, use el constructor NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) y proporcione un valor para el parámetro UltimateResourceFallbackLocation que especifique si el Administrador de recursos debe extraer los recursos de reserva del ensamblado principal o de un ensamblado satélite.To control the fallback process, you use the NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) constructor and supply a value for the UltimateResourceFallbackLocation parameter that specifies whether Resource Manager should extract the fallback resources from the main assembly or from a satellite assembly.

En el ejemplo de .NET Framework siguiente se usa el atributo NeutralResourcesLanguageAttribute para almacenar los recursos de reserva de una aplicación en un ensamblado satélite para el idioma francés (fr).The following .NET Framework example uses the NeutralResourcesLanguageAttribute attribute to store an application's fallback resources in a satellite assembly for the French (fr) language. El ejemplo tiene dos archivos de recursos basados en texto que definen un recurso de cadena única denominado Greeting.The example has two text-based resource files that define a single string resource named Greeting. El primero, resources.fr.txt, contiene un recurso de idioma francés.The first, resources.fr.txt, contains a French language resource.

Greeting=Bon jour!

El segundo, resources.ru.txt, contiene un recurso de idioma ruso.The second, resources,ru.txt, contains a Russian language resource.

Greeting=Добрый день

Estos dos archivos se compilan en archivos .resources al ejecutar el generador de archivos de recursos (Resgen.exe) desde la línea de comandos.These two files are compiled to .resources files by running the resource file generator (Resgen.exe) from the command line. Para el recurso de idioma francés, el comando es:For the French language resource, the command is:

resgen.exe resources.fr.txtresgen.exe resources.fr.txt

Para el recurso de idioma ruso, el comando es:For the Russian language resource, the command is:

resgen.exe resources.ru.txtresgen.exe resources.ru.txt

Los archivos .resources se insertan en bibliotecas de vínculos dinámicos mediante la ejecución de Assembly Linker (Al.exe) desde la línea de comandos para el recurso de idioma francés de la manera siguiente:The .resources files are embedded into dynamic link libraries by running assembly linker (Al.exe) from the command line for the French language resource as follows:

al /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dllal /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dll

y para el recurso de idioma ruso de la manera siguiente:and for the Russian language resource as follows:

al /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dllal /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dll

El código fuente de la aplicación reside en un archivo denominado Example1.cs o Example1.vb.The application source code resides in a file named Example1.cs or Example1.vb. Incluye el atributo NeutralResourcesLanguageAttribute para indicar que el recurso de aplicación predeterminado se encuentra en el subdirectorio fr.It includes the NeutralResourcesLanguageAttribute attribute to indicate that the default application resource is in the fr subdirectory. Crea una instancia del Administrador de recursos, recupera el valor del recurso Greeting y lo muestra en la consola.It instantiates the Resource Manager, retrieves the value of the Greeting resource, and displays it to the console.

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

[assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)]

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("resources", 
                                               typeof(Example).Assembly);
      string greeting = rm.GetString("Greeting");
      Console.WriteLine(greeting); 
   }
}
Imports System.Reflection
Imports System.Resources

<Assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)>
Module Example
   Public Sub Main()
      Dim rm As New ResourceManager("resources", GetType(Example).Assembly)
      Dim greeting As String = rm.GetString("Greeting")
      Console.WriteLine(greeting) 
   End Sub
End Module

Después, puede compilar código fuente de C# desde la línea de comandos de la manera siguiente:You can then compile C# source code from the command line as follows:

csc Example1.cs

El comando para el compilador de Visual Basic es muy parecido:The command for the Visual Basic compiler is very similar:

vbc Example1.vb

Dado que no hay ningún recurso insertado en el ensamblado principal, no es necesario compilar con el modificador /resource.Because there are no resources embedded in the main assembly, you do not have to compile by using the /resource switch.

Cuando se ejecute el ejemplo desde un sistema cuyo idioma sea distinto del ruso, se mostrará la salida siguiente:When you run the example from a system whose language is anything other than Russian, it displays the following output:

Bon jour!

Alternativa de empaquetado sugeridaSuggested Packaging Alternative

Las restricciones de tiempo o de presupuesto podrían impedir la creación de un conjunto de recursos para cada una de las referencias culturales secundarias que admite la aplicación.Time or budget constraints might prevent you from creating a set of resources for every subculture that your application supports. En su lugar, puede crear un único ensamblado satélite para la referencia cultural principal que todas las referencias culturales secundarias relacionadas puedan usar.Instead, you can create a single satellite assembly for a parent culture that all related subcultures can use. Por ejemplo, puede proporcionar un único ensamblado satélite en inglés (en) para que lo recuperen los usuarios que soliciten recursos en inglés específicos de una región y un único ensamblado satélite en alemán (de) para los usuarios que soliciten recursos en alemán específicos de una región.For example, you can provide a single English satellite assembly (en) that is retrieved by users who request region-specific English resources, and a single German satellite assembly (de) for users who request region-specific German resources. Por ejemplo, las solicitudes de alemán de Alemania (de-DE), Austria (de-AT) y Suiza (de-CH) recurrirán al ensamblado satélite en alemán (de).For example, requests for German as spoken in Germany (de-DE), Austria (de-AT), and Switzerland (de-CH) would fall back to the German satellite assembly (de). Los recursos predeterminados constituyen la reserva final y, por tanto, deben ser los recursos que solicitará la mayoría de los usuarios de la aplicación, por lo que debe elegir cuidadosamente estos recursos.The default resources are the final fallback and therefore should be the resources that will be requested by the majority of your application's users, so choose these resources carefully. Este método implementa recursos menos específicos de la referencia cultural, pero puede reducir considerablemente los costos de localización de la aplicación.This approach deploys resources that are less culturally specific, but can significantly reduce your application's localization costs.

Vea tambiénSee also