Empaquetar e implementar recursos
Actualización: noviembre 2007
.NET Framework utiliza un modelo de concentrador y de radio para empaquetar e implementar recursos. El concentrador es el ensamblado principal que contiene el código ejecutable no localizable así como los recursos de una única referencia cultural, denominada referencia cultural neutra o predeterminada. La referencia cultural predeterminada es la referencia cultural de reserva de la aplicación. Cada radio se conecta a un ensamblado satélite que contiene los recursos de una única referencia cultural, pero no contiene ningún código.
Este modelo ofrece varias ventajas:
Tras implementar una aplicación, se pueden agregar de forma incremental recursos para nuevas referencias culturales. Como el subsiguiente desarrollo de recursos específicos de la referencia cultural puede requerir mucho tiempo, esto permite lanzar primero la principal aplicación y posteriormente los recursos específicos de la referencia cultural.
Se pueden actualizar y cambiar los ensamblados satélite de una aplicación sin recompilar dicha aplicación.
La aplicación sólo necesita cargar aquellos ensamblados satélite que contengan los recursos necesarios para una referencia cultural determinada. De este modo, se puede reducir en gran medida el uso de los recursos del sistema.
Sin embargo, este modelo también tiene desventajas:
Se han de administrar varios conjuntos de recursos.
El costo inicial de comprobar una aplicación se incrementa ya que se han de comprobar varias configuraciones. A largo plazo, será más fácil y menos costoso comprobar una aplicación principal con varios ensamblados satélite que comprobar y mantener varias versiones internacionales paralelas.
Convenciones de nomenclatura para recursos
Al empaquetar los recursos de una aplicación, es preciso asignarles un nombre mediante las convenciones de nomenclatura para recursos que espera Common Language Runtime. El motor en tiempo de ejecución identifica un recurso por su firma de referencia cultural o por su nombre. A cada referencia cultural se le otorga un nombre único, que es una combinación de un nombre de referencia cultural de dos letras en minúscula asociado a un idioma y, si es preciso, un nombre de subreferencia cultural de dos letras en mayúscula asociado a un país o una región. El nombre de la subreferencia cultural va precedido del nombre de la referencia cultural, separados ambos nombres por un guión (-). Los ejemplos incluyen ja-JP para el japonés de Japón, en-US para el inglés de EE.UU. y de-DE para el alemán de Alemania (a diferencia de de-AT para el alemán de Austria). Vea CultureInfo (Clase) para obtener una lista completa de los nombres de referencias culturales.
Proceso de reserva de recursos
El modelo de concentrador y de radio para empaquetar e implementar recursos utiliza un proceso de reserva para buscar los recursos apropiados. Si el usuario de una aplicación solicita un ResourceSet que no esté disponible, Common Language Runtime buscará en la jerarquía de referencias culturales el recurso de reserva apropiado que más se parezca a la solicitud del usuario, y producirá una excepción sólo como último recurso. Si encuentra un recurso apropiado, el motor en tiempo de ejecución lo utilizará en cada nivel de la jerarquía. En caso de que no lo encuentre, la búsqueda continuará en el siguiente nivel. El proceso de reserva de recursos se describe en los siguientes pasos:
El motor en tiempo de ejecución comprueba primero la caché de ensamblados global en busca de un ensamblado que coincida con la referencia cultural solicitada de la aplicación.
La caché de ensamblados global puede almacenar ensamblados de recursos que compartan numerosas aplicaciones. De este modo, no es preciso incluir conjuntos de recursos específicos en la estructura de directorios de cada aplicación que se cree. Si el motor en tiempo de ejecución encuentra una referencia a un ensamblado, buscará el recurso solicitado en dicho ensamblado. Si encuentra la entrada en el ensamblado, utilizará el recurso solicitado. En caso contrario, continuará la búsqueda.
A continuación, el motor en tiempo de ejecución busca en el directorio del ensamblado que se ejecuta actualmente un directorio que coincida con la referencia cultural solicitada. Si lo encuentra, buscará en ese directorio un ensamblado satélite válido para la referencia cultural solicitada. Después, el motor en tiempo de ejecución busca el recurso solicitado en el ensamblado satélite. Si lo encuentra en el ensamblado, lo utilizará. En caso contrario, continuará la búsqueda.
A continuación, el motor en tiempo de ejecución busca de nuevo en la caché de ensamblados global, pero esta vez busca el ensamblado primario del recurso solicitado. Si existe, el motor en tiempo de ejecución buscará el recurso solicitado en el ensamblado.
El ensamblado primario se define como la referencia cultural de reserva adecuada. Considere los ensamblados primarios como los mejores candidatos; proporcionar cualquier recurso es preferible a producir una excepción. Este proceso permite asimismo volver a utilizar los recursos. Sólo se necesita incluir un recurso determinado en el nivel primario si la referencia cultural secundaria no necesita localizar el recurso solicitado. Por ejemplo, si se proporcionan ensamblados satélite para en (inglés neutro), en-GB (inglés del Reino Unido) y en-US (inglés de EE.UU.), el satélite en contendrá la terminología común y los satélites en-GB y en-US podrán proporcionar reemplazos sólo para aquellos términos que sean distintos.
A continuación, el motor en tiempo de ejecución comprueba si el directorio del ensamblado que se ejecuta actualmente contiene un directorio primario. Si existe un directorio primario, el motor en tiempo de ejecución buscará en ese directorio un ensamblado satélite válido para la referencia cultural primaria. Si encuentra el ensamblado, buscará el recurso solicitado en dicho ensamblado. Si encuentra el recurso, lo utilizará. En caso contrario, continuará la búsqueda.
A continuación, el motor en tiempo de ejecución busca los ensamblados primarios, al igual que en el paso anterior, en varios posibles niveles. Cada referencia cultural tiene sólo un ensamblado primario, pero éste puede tener su propio ensamblado primario.
Si se han buscado la referencia cultural inicialmente especificada y todos los ensamblados primarios pero aún no se ha encontrado el recurso, se utilizará el recurso correspondiente a la referencia cultural (de reserva) predeterminada. A partir de la versión 2.0 de .NET Framework, es posible especificar que la ubicación de los recursos de reserva definitivos para los recursos sea un ensamblado satélite, en lugar del ensamblado principal. Utilizando NeutralResourcesLanguageAttribute con la enumeración UltimateResourceFallbackLocation, puede controlar si la ubicación de los recursos de reserva definitivos se encuentra en el ensamblado principal o en un ensamblado satélite.
Nota: El recurso predeterminado es el único recurso que se compila con el ensamblado principal. A menos que especifique un ensamblado satélite mediante NeutralResourcesLanguageAttribute, es el recurso de reserva definitivo (elemento primario final). Por ello, se recomienda incluir siempre un conjunto predeterminado de recursos en el ensamblado principal. De este modo, se garantiza que no se producirá ninguna excepción. Al incluir un archivo de recursos predeterminado, se proporciona una reserva de todos los recursos y se garantiza que siempre habrá al menos un recurso para el usuario, aunque no sea específico de una referencia cultural.
Por último, si el motor en tiempo de ejecución no encuentra un recurso para una referencia cultural (de reserva) predeterminada, se producirá una excepción que indique que no se ha encontrado el recurso.
Como ejemplo del modo en que se busca un recurso solicitado, supongamos que el usuario solicita un recurso localizado para el español de México. De acuerdo con las convenciones de nomenclatura para recursos anteriormente descritas, el motor en tiempo de ejecución busca primero, en la caché de ensamblados global, el ensamblado que coincida con la referencia cultural solicitada, "es-MX". Al no encontrarlo, el motor en tiempo de ejecución busca en el directorio del ensamblado que se ejecuta actualmente un directorio "es-MX". Al no encontrarlo, el motor en tiempo de ejecución busca de nuevo en la caché de ensamblados global un ensamblado primario que refleje la referencia cultural de reserva apropiada; en este caso, "es" (español). Si no encuentra el ensamblado primario, el motor en tiempo de ejecución buscará en todos los posibles niveles de ensamblados primarios la referencia cultural "es-MX" hasta que encuentre el correspondiente recurso. Si no lo encuentra, el motor en tiempo de ejecución utilizará el recurso correspondiente a la referencia cultural predeterminada.
Recursos de reserva definitivos en el ensamblado satélite
A partir de la versión 2.0 de .NET Framework, es posible quitar recursos de forma opcional del ensamblado principal y especificar que los recursos de reserva definitivos se encontrarán en un ensamblado satélite correspondiente a una referencia cultural concreta. Para controlar el proceso de reserva, puede utilizar NeutralResourcesLanguageAttribute. Se ha agregado un nuevo constructor a la clase NeutralResourcesLanguageAttribute que utiliza un parámetro UltimateResourceFallbackLocation adicional para especificar la ubicación en la que ResourceManager debe extraer los recursos de reserva: el ensamblado principal o un ensamblado satélite.
El ejemplo siguiente muestra cómo aplicar el atributo en el nivel de clase:
[assembly: NeutralResourcesLanguageAttribute("de" , UltimateResourceFallbackLocation.Satellite)]
En el caso de la ubicación de los recursos de reserva definitivos, hace que ResourceManager busque los recursos en el subdirectorio "de" del directorio del ensamblado que se está ejecutando en ese momento.
Sugerencia de alternativa de empaquetado
Debido a restricciones de tiempo o presupuesto, quizá no sea factible crear un conjunto de recursos para cada subreferencia cultural que admita la aplicación. En ese caso, se puede crear un único ensamblado satélite para una referencia cultural primaria que puedan utilizar todas las subreferencias culturales relacionadas. Por ejemplo, se puede proporcionar un único ensamblado satélite en inglés (en) que recuperarán aquellos usuarios que soliciten recursos en inglés específicos de la región, y un único ensamblado satélite en alemán (de) para los usuarios que soliciten recursos en alemán específicos de la región. Por ejemplo, las solicitudes de alemán en Alemania (de-DE), de alemán en Austria (de-AT) y de alemán en Suiza (de-CH) recurrirán al ensamblado satélite en alemán (de). Seleccione minuciosamente los recursos predeterminados que se van a compilar con el ensamblado principal. Los recursos predeterminados constituyen la reserva final y, por consiguiente, deberán ser los recursos que vayan a solicitar la mayoría de los usuarios de la aplicación. Si bien esta solución implementa los recursos menos específicos de la referencia cultural, puede reducir en gran medida el costo de adaptación de la aplicación.