Este artículo comenzará con los conceptos básicos de globalización y localización de recursos en Asp.net y explicará los pasos y métodos para lograr la globalización y localización en Asp.net1.1 y Asp.net2.0.
uno. Conceptos básicos
1. ¿Por qué localizar recursos?
Nuestro sitio puede ser visto por personas de varios países y regiones del mundo, y las personas de cada país y región tienen su propio idioma y características culturales. Tomemos como ejemplo nuestra gran patria, China continental utiliza el chino simplificado, mientras que Hong Kong, Macao y Taiwán utilizan el chino tradicional. Además, cada país tiene diferentes formatos de expresión para moneda, números, calendario y otra información. Nuestro país utiliza principalmente el formato de año, mes y día, mientras que Estados Unidos utiliza el formato de mes, día y año. Hay muchas diferencias como esta, por lo que no daré muchos ejemplos. Para brindarles a los visitantes de nuestro sitio web una mejor experiencia de usuario, debemos brindar una solución global. Siempre que el usuario seleccione su idioma y región, el sitio mostrará la información de la página de acuerdo con su idioma y hábitos culturales. localización.
2.
Los nombresde cultura, cultura fija, cultura no específica y cultura específica
siguen el estándar RFC 1766 y tienen el formato "<código de idioma2>-<código de país/región2>", donde <código de idioma2> se deriva de ISO 639-1. código de dos letras en minúscula, <código de país/región2> es un código de dos letras en mayúscula derivado de ISO 3166. Por ejemplo, el inglés estadounidense es "en-US". Cuando no hay códigos de idioma de dos letras disponibles, se utilizan códigos de tres letras derivados de ISO 639-2; por ejemplo, el código de tres letras "div" se utiliza para las regiones donde se habla el idioma dhivehi. Algunos nombres culturales tienen sufijos que especifican un símbolo de escritura, por ejemplo, "-Cyrl" especifica un símbolo de escritura cirílico y "-Latn" especifica un símbolo de escritura latina. Ejemplo:
Nombre de la cultura | Identificador de la cultura | Idioma - País |
zh-CN | 0x0804 | Chino - China |
zh-TW | 0x0404 | Chino - Taiwán |
zh-CHS | 0x0004 | Chino simplificado |
zh-CHT | 0x |
7C |
04 | Chino tradicional | |
en | 0x0009 | Inglés |
en - US | 0x0409 | Inglés - Estados Unidos | en
- | GB | 0x0809 |
uz | - | UZ - Cyrl |
0x0843 | Uzbeko (cirílico) - Uzbekistán uz-UZ-Latn 0x0443 | Uzbeko (latín) - Uzbekistán |
culturas fijas no son sensible a la cultura. Puede utilizar la cadena vacía ("") para especificar una cultura fija por nombre o por el identificador de cultura 0x007F. Las instancias de cultura invariante están representadas por la propiedad InvariantCulture de la clase CultureInfo. Las culturas fijas sólo están asociadas con el idioma inglés, no con ningún país. Se puede utilizar en casi cualquier método en el espacio de nombres "globalizado" que requiera cultura. Si su programa realiza comparaciones de cadenas u operaciones de cambio de casos, debe usar InvariantCulture para garantizar que, independientemente de la cultura establecida por el sistema, el comportamiento se realizará de acuerdo con la cultura fija del idioma inglés representada por InvariantCulture. Sin embargo, una cultura fija debe usarse solo en procesos que requieren resultados independientes de la cultura (como los servicios del sistema, de lo contrario, los resultados que obtiene pueden ser lingüísticamente incorrectos o culturalmente inapropiados); Ejemplo: CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture; Estas dos líneas de código tienen el mismo efecto, el propósito es obtener una instancia de cultura invariante.
Por ejemplo, ahora desea ejecutar el método dateTime.ToString() en una instancia de DateTime dateTime. En realidad, este método utiliza la cultura actual de su hilo actual como cultura predeterminada y convierte la instancia de fecha en el formato de cadena correspondiente según esta cultura. Entonces, si no lo necesitamos para realizar la operación ToString de acuerdo con el subproceso o la cultura del sistema en este momento, entonces deberíamos usar este método dateTime.ToString("G", CultureInfo.InvariantCulture) o dateTime.ToString("G" , DateTimeFormatInfo.InvariantInfo) .
Una cultura neutral es una cultura que está asociada con un idioma pero no con un país. Una cultura específica es aquella asociada a un determinado idioma y a un determinado país. Por ejemplo, "en" es una cultura neutral, mientras que "en-US" es una cultura específica. Tenga en cuenta que "zh-CHS" (chino simplificado) y "zh-CHT" (chino tradicional) son culturalmente neutrales.
Las culturas tienen una estructura jerárquica, es decir, el padre de una cultura específica es una cultura no específica y el padre de una cultura no específica es una cultura invariante. La propiedad Parent de la clase CultureInfo devolverá la cultura no específica asociada con la cultura específica. Si el recurso específico de la cultura no existe en el sistema o no está disponible de otro modo, se usa el recurso no específico de la cultura; si el recurso no específico de la cultura tampoco está disponible, se usa el recurso incrustado en el ensamblado principal.
3. Implemente tipos, propiedades y métodos comunes para la localización.
La clase CultureInfo representa información sobre una cultura específica, incluido el nombre de la cultura, el sistema de escritura y el calendario utilizados, así como información sobre operaciones comunes (como formatear fechas y clasificación de cadenas). Proporciona acceso a objetos de información específicos de la cultura. Generalmente hay dos formas de crear una instancia de la clase CultureInfo, de la siguiente manera:
CultureInfo cultura = CultureInfo. CreateSpecificCulture (nombre);
CultureInfo culture = new CultureInfo(name);
La diferencia entre los dos es que con el primer método, solo puede crear una instancia de CultureInfo de una cultura fija o una cultura específica. Si el nombre es una cadena vacía, se crea una instancia de cultura fija. Si el nombre es una cultura no específica, se crea una instancia de CultureInfo específica de la cultura predeterminada asociada con el nombre. El segundo método consiste en crear una instancia de CultureInfo de la cultura especificada por el nombre, que puede ser fija, no específica o específica de la cultura.
La propiedad CurrentCulture de la clase Thread se utiliza para obtener o establecer la cultura del hilo actual. Debe configurarse para una cultura específica. Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Si Thread.CurrentThread.CurrentCulture = new CultureInfo("en ");
La propiedad CurrentUICulture de la clase Thread se usa para obtener o establecer la cultura actual utilizada por el administrador de recursos para buscar recursos específicos de la cultura en tiempo de ejecución. El administrador de recursos aquí se puede asociar con la clase ResourceManger.
Thread.CurrentThread.CurrentUICulture = new CultureInfo("es");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
La clase ResourceManger puede encontrar recursos específicos de una cultura, proporcionar recursos sustitutos cuando los recursos localizados no existen y admitir la serialización de recursos. El constructor ResourceManager más utilizado es el ResourceManager público (cadena, ensamblaje). Su significado es inicializar una nueva instancia de la clase ResourceManager, que busca archivos de recursos del ensamblaje dado utilizando el nombre raíz especificado. El llamado nombre raíz es, por ejemplo, el nombre raíz de un archivo de recursos llamado "MyResource.en-US.resources" es "MyResource". Se puede agregar un espacio de nombres a la expresión del nombre raíz, como "MyWebSite.Resource.UserFolder.MyResource". El ensamblaje puede ser el ensamblaje donde se encuentra la página que necesita llamar al archivo de recursos, como typeof(MyPage).Assembly. El método GetString de la clase ResourceManager se utiliza para obtener el valor de la clave especificada en el archivo de recursos. Ejemplo: cuando se haya establecido la propiedad CurrentUICulture del hilo, siga el siguiente método.
ResourceManager rm = new ResourceManager("elementos", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");
Si desea obtener recursos de acuerdo con la cultura especificada, escriba lo siguiente:
ResourceManager rm = new ResourceManager("elementos", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("bienvenido",ci);
dos. Para implementar la localización de recursos en Asp.net1.1,
primero debe crear una carpeta de recursos en el proyecto del sitio web WebTest y almacenar los archivos de recursos comunes a todo el proyecto en esta carpeta. Por ejemplo, hemos creado los siguientes tres archivos de recursos: MyResource.en.resx, MyResource.en-US.resx, MyResource.zh-CN.res. Hay dos pares clave-valor en cada archivo de recursos, los valores clave son Estado y Dirección. Llame al archivo de recursos en la página MyPage.aspx que necesita usar el archivo de recursos, como se muestra a continuación:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", tipo de (Mi página).Assembly);
Label1.Text = rm.GetString("Estado");
Label2.Text = rm.GetString("Address");
Bueno, en este momento Label1 y Label2 mostrarán "estado" y "dirección" de acuerdo con las regulaciones del archivo MyResource.zh-CN.resx. El anterior es el método de localización más básico y simple. Hay algunos problemas ocultos aquí. Resolvamos y optimicemos este método uno por uno.
1. La forma de obtener la cultura predeterminada del usuario
es a través de la configuración en la opción "Propiedades" -> "Idioma" del navegador del usuario. Tome la superior como idioma predeterminado del usuario.
CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Generalmente, CurrentCulture y CurrentUICulture están configurados para tener la misma cultura. Por supuesto, también pueden ser diferentes. Por ejemplo, usted especifica que CurrentCulture es en-US y CurrentUICulture es zh-CN. El efecto de esto es que la moneda, la fecha y otra información en la página se muestran en formato de inglés americano, y el administrador de recursos obtendrá el contenido que debe obtenerse del archivo de recursos de MyResource.zh-CN.resx. archivo.
Si la página de su sitio no proporciona la función para que los usuarios seleccionen un idioma, se mostrará de acuerdo con la cultura establecida por el navegador del usuario de forma predeterminada, por lo que puede colocar el código anterior en el método Application_BeginRequest de Global.asax. archivo cs. De esta manera, cada vez que un usuario solicita una página, nuestro programa establecerá primero la cultura.
2. Recuerde la configuración regional del usuario
Las configuraciones o selecciones locales del navegador se pueden recordar a través de la sesión. Pero esta operación no se puede realizar en el método Application_BeginRequest en el archivo Global.asax.cs porque la sesión aún no está disponible en ese momento. Si su sitio no proporciona la función para que los usuarios seleccionen un idioma, entonces no es necesario que recuerde la configuración regional del usuario. Simplemente configúrela en el método Application_BeginRequest en el archivo Global.asax.cs como se describe anteriormente. Sin efecto. actuación. Esto evita principalmente conflictos en los que el usuario cambia repentinamente la configuración de idioma en el navegador a mitad de camino, pero el sitio web aún muestra el contenido de la página al usuario de acuerdo con la cultura almacenada en la sesión.
Si ha mencionado la función de permitir que el usuario seleccione un idioma, entonces obviamente necesita usar una sesión en el programa de la página para registrar la selección cultural del usuario. Debido a que cada solicitud del cliente al segmento del servidor, el segmento del servidor abrirá un nuevo hilo para procesamiento y respuesta. Si su programa no recuerda la selección del cliente, solo responderá con la cultura predeterminada.
3. ¿Cómo encuentra el administrador de recursos los archivos de recursos correspondientes para una cultura específica?
Al realizar una operación de valor, es decir, al ejecutar el método GetString de la clase ResourceManager, el administrador de recursos buscará el archivo de recursos correspondiente de acuerdo con la propiedad CurrentUICulture del hilo actual. Hay varias situaciones:
(1 Por ejemplo, si la cultura correspondiente a CurrentUICulture es en-US, primero verifique si MyResource.en-US.resx existe, tome el valor y si no existe; si MyResource.en.resx existe.
(2 Por ejemplo, la cultura correspondiente a la CurrentUICulture actual es en, porque en es una cultura no específica, luego primero busque si el archivo de recursos MyResource.en-US.resx de la cultura específica en-US está asociado con ella). existe de forma predeterminada. Si es así, obtenga el valor de él; si no existe, verifique si MyResource.en.resx existe.
(3 Por ejemplo, si la cultura correspondiente a CurrentUICulture es en-GB, primero busque el archivo de recursos MyResource.en-GB.resx. Si no existe, verifique si MyResource.en.resx existe. existe, obtenga el valor de él; si no existe, verifique si el archivo de recursos MyResource.en-US.resx de la cultura específica predeterminada en-US asociada con en existe. existe en este momento, pero MyResource.en-CA resx existe, el programa aún generará una excepción que indica que no se puede encontrar el archivo de recursos apropiado.
Por lo tanto, podemos resumir que cuando el hilo actual CurrentUICulture corresponde a una cultura específica, el administrador de recursos primero busca el archivo de recursos correspondiente a esta cultura específica. Si no lo encuentra, buscará su archivo de recursos que no sea de cultura. todavía no se ha encontrado y luego busque el archivo de recursos de la cultura predeterminada asociada con su asociación no específica de la cultura. Cuando CurrentUICulture del hilo actual corresponde a una cultura no específica, el administrador de recursos primero verifica si existe el archivo de recursos específico de la cultura predeterminado correspondiente a la cultura no específica. Si no existe, verifique si el archivo de recursos correspondiente a la cultura no específica. -Existe una cultura específica y arroja una excepción si tampoco existe.
4. ¿Cómo lidiar con culturas que no brindan soporte de localización?
Si el sitio no proporciona los archivos de recursos correspondientes para admitir la cultura predeterminada del usuario, entonces la CurrentUICulture de su hilo actual debe convertirse a la cultura predeterminada de su sitio, como en-US o zh-CN. Hay dos oportunidades de conversión:
Una es que cuando obtenga Request.UserLanguages[0], compárelo con la cultura preestablecida admitida en el archivo de configuración. Si se confirma que no es compatible, configure inmediatamente CurrentUICulture como la cultura predeterminada.
El segundo es usar la estructura try catch para capturar la excepción MissingManifestResourceException cuando se usa el método GetString de ResourceManager para obtener el valor. En el manejo de excepciones, primero configure CurrentUICulture en la cultura predeterminada y luego use GetString para obtener el valor nuevamente.
5. Configure la cultura predeterminada del sitio y uiCulture a través de Web.config
<globalization requestEncoding="utf-8" ResponseEncoding="utf-8" uiCulture="zh-CN" culture="en-US"/>
Como se muestra arriba: se especifica que la cultura predeterminada del sitio es en-US (debe ser una cultura específica aquí) y uiCulture es zh-CN.
Por supuesto, también puedes configurarlo página por página en la etiqueta Página de cada página: <@Page Culture="zh-CN" UICulture="en">. Independientemente de cómo se configure web.config aquí, la página se mostrará de acuerdo con la configuración de la etiqueta Página.
tres. Implementación de la localización de recursos en Asp.net2.0
Asp.net2.0 proporciona métodos de implementación más diversos para la localización de recursos. Me centraré aquí en las diferencias con Asp.net1.1.
1. La configuración de la cultura predeterminada del sitio y uiCulture a través de Web.config
ya se analizó en Asp.net1.1 utilizando el archivo web.config para configurar la cultura del sitio, pero en Asp.net2.0 es más flexible. Normalmente, querrás que todas las páginas de tu sitio se ajusten a la misma cultura. Simplemente asigne un valor "auto" para todo el sitio a los atributos UICulture y Culture (cultura) del elemento de globalización en web.config como se muestra a continuación. Tenga en cuenta que este valor "auto" no se utiliza en Asp.net1.1. <globalization uiCulture="auto" culture="auto" /> El significado de auto es que ASP.NET obtiene la configuración cultural preferida del usuario al verificar el encabezado HTTP enviado por el navegador y usa esta cultura para establecer la cultura predeterminada del sitio Es decir, las propiedades CurrentUICulture y CurrentCulture del hilo actual.
Además de la configuración automática, también puede especificar la cultura predeterminada de un sitio para Asp.net: <globalization uiCulture="auto:zh-CN" culture="auto:zh-CN" /> Nota: Esto solo es posible si ASP. NET no puede encontrar el encabezado HTTP para determinar la cultura preferida del usuario. Por ejemplo, cuando no hay una configuración cultural en "Propiedades" -> "Idioma" del navegador y está completamente vacía, la cultura predeterminada establecida después de auto tendrá efecto.
Una vez configurada la globalización en web.config, su aplicación no necesita escribir ningún código. CurrentUICulture y CurrentCulture del hilo obtendrán la configuración cultural de acuerdo con los valores de atributos culturales y uiCulture establecidos en el elemento de globalización. Si la globalización no está configurada, CurrentUICulture y CurrentCulture del hilo tendrán de forma predeterminada en-US.
2. Utilice el archivo Web.config para realizar un seguimiento de la selección regional del usuario.
En Asp.net1.1, los sitios que proporcionan selección regional generalmente usan sesiones para registrar la selección del usuario, de modo que cada vez que el usuario realiza una solicitud al sitio, Todo. El contenido mostrado se localiza según la cultura elegida por el usuario. Otro método proporcionado en Asp.net2.0 es utilizar el archivo web.config para realizar un seguimiento de la selección cultural del usuario.
Puede admitir la identificación anónima de la cultura de un usuario agregando una propiedad de perfil basada en cadenas llamada LanguagePreference a su archivo web.config. Tenga en cuenta que el atributo habilitado del elemento de identificación anónima debe ser "verdadero"; de lo contrario, la función de identificación anónima no estará disponible.
<identificación anónima habilitada="true"/>
<perfil>
<propiedades>
<añadir nombre="LanguagePreference" tipo="cadena" defaultValue="auto" enableAnonymous="true" />
</propiedades>
</profile>
A continuación explicaré cómo programar el atributo LanguagePreference en Asp.net2.0. Primero, puede escribir una clase PageBase, que hereda de System.Web.UI.Page y sirve como clase base para todas las clases de páginas del sitio. El propósito de esto es realmente muy simple: extraer algunos procesos de procesamiento comunes en cada página y colocarlos en la clase base para reducir la duplicación de código y mejorar la capacidad de mantenimiento. Luego escriba el siguiente código en la clase PageBase: protected override void InitializeCulture()
{
base.InitializeCulture();
cadena LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
//Cuando el usuario visita este sitio por primera vez y Profile.LanguagePreference está vacío, identifica la configuración de idioma del navegador del usuario
si (cadena.IsNullOrEmpty (Preferencia de idioma))
{
si (this.Context.Request.UserLanguages != nulo)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = IdiomaPreferencia;
}
}
demás
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}
El método InitializeCulture de la clase System.Web.UI.Page se agregó recientemente en Asp.net2.0. Establece Culture y UICulture para el hilo actual. El ciclo de vida de la página se ha diseñado para que el método InitializeCulture se ejecute antes del inicio y la carga de la página. En el código anterior, primero use ((ProfileCommon)this.Context.Profile).LanguagePreference para obtener el valor del atributo de perfil LanguagePreference actual y determinar si está vacío, es decir, si la configuración cultural se ha guardado para el usuario; . Si está vacío, la cultura preferida del usuario se obtiene del encabezado Http y se guarda mediante ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;. Si no está vacío, significa que la configuración cultural del usuario se ha guardado, luego use esta cultura para configurar las propiedades CurrentUICulture y CurrentCulture del hilo actual.
Si <globalization uiCulture="auto" culture="auto" /> está definido en Web.config, entonces el código anterior se puede simplificar a: protected override void InitializeCulture()
{
base.InitializeCulture();
cadena LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference
if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
demás
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
}
Si el sitio proporciona una función que permite a los usuarios seleccionar una cultura, como colocar una lista de selecciones de idiomas en la página principal del sitio, entonces la elección de cultura del usuario se puede recordar mediante la siguiente declaración:
protegido vacío lstLanguage_SelectedIndexChanged (remitente del objeto, EventArgs e)
{
if (lstLanguage.SelectedValue! = "Auto") //La opción predeterminada es Auto
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
demás
{
Perfil.LanguagePreference = nulo;
}
Respuesta.Redirect(Solicitud.Url.AbsolutePath);
}
Preste atención a la línea de código Response.Redirect(Request.Url.AbsolutePath); porque el código de manejo de eventos se ejecuta después de Page_Load, si desea que la página cambie rápidamente, debe realizar una operación de redirección.
Cuando utilice archivos de recursos para crear archivos de recursos globales en el sitio
en Asp.net2.0
, VS.Net2005 creará automáticamente una carpeta App_GlobalResources específicamente para almacenar archivos de recursos globales.El llamado archivo de recursos global es un archivo de recursos utilizado por múltiples archivos de páginas o páginas maestras en el sitio. Supongamos que creamos archivos llamados MyResource.resx y MyResource.zh-cn.resx. En el programa, podemos usar el siguiente código para obtener el valor en el archivo de recursos: this.lblCountry.Text = Resources.MyResource.Country;
Donde País es la clave en el archivo de recursos. Obviamente, esto es mucho más fácil que obtener valores de archivos de recursos en Asp.net 1.1.
Hay dos cuestiones a tener en cuenta aquí: primero, al crear un grupo de archivos de recursos con el mismo nombre raíz, se deben crear archivos sin identificación cultural, como MyResource.resx, otros como MyResource.en-gb y MyResource. zh-cn.resx se crean según sea necesario. Si no se crea MyResource.resx y solo se crea MyResource.zh-cn.resx, MyResource no aparecerá en el espacio de nombres de Recursos en el código anterior, por lo que la compilación del código anterior no puede realizarse. MyResource.resx debe almacenar el contenido del idioma predeterminado del sitio en caso de que no se pueda encontrar un archivo de recursos localizado que coincida con CurrentUICulture del hilo actual o no se pueda encontrar el valor clave correspondiente en el archivo de recursos localizado. Asp.net se basa en la clave del archivo MyResource.resx. Si la clave de país no existe en MyResource.resx, pero la clave de país existe en MyResource.zh-cn.resx, el código anterior también informará un error. al compilar. En segundo lugar, Asp.net no informará ninguna excepción cuando no pueda encontrar el recurso localizado en el área correspondiente. Obtendrá automáticamente el valor del archivo MyResource.resx, pero no cambiará la CurrentUICulture del hilo actual.
Al crear archivos de recursos locales en el sitio, VS.Net2005 creará automáticamente una carpeta App_LocalResources específicamente para almacenar archivos de recursos locales. Los llamados archivos de recursos locales son archivos de recursos que se utilizan para un archivo de una sola página en el sitio. Su método de denominación es generalmente Default.aspx.resx y Default.aspx.zh-cn.resx. Ahora agrego tres claves Idioma, lblNavigation.Text y lblNavigation.ForeColor en el archivo de recursos predeterminado. Entre ellos, configuré azul para lblNavigation.ForeColor de Default.aspx.resx y rojo para lblNavigation.ForeColor de Default.aspx.zh-cn.resx. Hay dos formas de obtener contenido de archivos de recursos locales en Default.aspx en el archivo de página:
(1). <asp:Label ID="lblLanguage" runat="servidor" Text="<%$ Recursos:Idioma %>"></asp:Label>
(2). <asp:Label ID="lblNavigaion" runat="servidor" meta:resourcekey="lblNavigation"></asp:Label>
Tenga cuidado al utilizar el símbolo $ cuando utilice el primer método. Usar el segundo método es más flexible y le permite establecer valores para muchas propiedades del control a la vez.
Todavía hay problemas a tener en cuenta aquí: se debe crear el archivo de recursos local predeterminado de la página, como se requiere Default.aspx.resx y se requiere Default.aspx.zh-cn.resx. Si no crea un archivo de recursos local predeterminado, pero usa archivos de recursos locales en la página, cuando use el primer método para vincular, se producirá un error de compilación; cuando use el segundo método para vincular, no se producirá ningún error de compilación. Se produce un error, pero la configuración de estas propiedades no tiene ningún efecto, como si no estuvieran escritas.
4. Mostrar imágenes localizadas
Mostrar imágenes localizadas también es una característica nueva de Asp.net2.0. En Asp.net2.0, los archivos de recursos no se limitan a combinaciones de pares clave-valor de tipo cadena. Puede guardar varios tipos de archivos. Utilice esta función para localizar imágenes. De hecho, las llamadas imágenes localizadas no son más que colocar imágenes preparadas para diferentes regiones en diferentes archivos de recursos localizados. Por ejemplo, coloque LitwareSlogan.jpg en MyResource.resx y coloque LitwareSlogan.cn.jpg en MyResource.zh-cn.resx.
Cuando los archivos de recursos globales de diferentes versiones localizadas contienen versiones localizadas de archivos de imagen, puede personalizar un archivo de controlador llamado MyLocalImage.ashx para cargarlo condicionalmente según la preferencia de idioma del usuario. El código es el siguiente Mostrar.
Método de llamada en la página:
<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />
Cómo escribir el controlador de MyLocalImage.ashx:
clase pública MyLocalImage: IHttpHandler
{
ProcessRequest pública vacía (contexto HttpContext)
{
contexto.Response.ContentType = "imagen/png";
cadena LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
si (!string.IsNullOrEmpty(LanaguageReference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanaguageReference);
}
Mapa de bits bm = Recursos.Litware.LitwareSlogan;
Imagen MemoryStream = nueva MemoryStream();
bm.Save(imagen,ImageFormat.Png);
contexto.Response.BinaryWrite(image.GetBuffer());
}
}
La clase de controlador personalizado definida en MyLocalImage.ashx utiliza una lógica similar a la que vio anteriormente en el método personalizado InitializeCulture para inicializar la configuración de CurrentUICulture para el subproceso actual antes de recuperar el archivo de imagen del archivo de recursos global. Quizás se pregunte por qué la CurrentUICulture del hilo actual se ha configurado en la clase base de la página y debe restablecerse aquí. Esto se debe a que el hilo aquí no es el mismo que el hilo procesado en la clase base. Después de que el controlador personalizado inicialice correctamente la configuración de CurrentUICulture, puede acceder al archivo de imagen a través de la clase de recurso fuertemente tipada de MyResource.resx. Entonces es sólo cuestión de escribir los bits del archivo de imagen en el flujo de respuesta HTTP.