2008-11-01 23 views
21

Estoy construyendo una aplicación web ASP.NET, y todas mis cadenas se almacenan en un archivo de recursos. Me gustaría agregar un segundo idioma a mi aplicación, e idealmente, me gustaría detectar automáticamente el idioma del navegador del usuario (o el idioma de Windows) y de forma predeterminada a eso, en lugar de hacer que elijan algo además del inglés. Actualmente, estoy manejando toda la población de recursos manualmente, por lo que agregar un segundo archivo de recursos e idioma es trivial desde mi punto de vista, si tuviera una manera fácil de descubrir automáticamente qué idioma mostrar.Aplicación web multilingüe: ¿cómo puedo detectar el idioma del usuario en ASP.NET?

¿Alguien ha hecho esto, o tiene alguna idea sobre cómo podría recuperar ese valor? Como ASP.NET está basado en el servidor, no parece tener acceso a configuraciones específicas del navegador.

RESOLUCIÓN: Esto es lo que terminé haciendo. Usé un "For Each" para pasar por "HttpContext.Current.Request.UserLanguages" y busco uno que admita. De hecho, solo estoy revisando los dos caracteres de la izquierda, ya que todavía no admitimos dialectos, solo inglés y español. ¡Gracias por toda la ayuda!

Respuesta

6

Este article (linked to archive.org as original link is now dead) puede ser útil para detectar automáticamente la configuración de idioma del navegador.

[EDITAR] Sí. El artículo citado no usa ASP.NET. Esto article hace.

+0

esta es una solución ASP, ASP.NET no un uno, ¿verdad? –

+0

Aunque no es .NET, encontré el primer artículo mucho más informativo que el segundo, y me movió en la dirección correcta. – SqlRyan

2

Esta es una gran pregunta, ya que la localización en ASP.NET es ignorada por muchos desarrolladores.

ASP.NET debe elegirá automáticamente la configuración del navegador del usuario y forzar el CultureInfo.CurrentCulture a idioma del navegador del usuario. Puede forzar el tema con una línea en Page_OnInit() como:

Thread.CurrentThread.CurrentCulture = new CultureInfo(HttpContext.Current.Request.UserLanguages[0]); 

¿Cómo puede probar esto? Ingrese al panel de idiomas en nuestro navegador y cambie la configuración.

21

probar este en el web.config:

<globalization culture="auto" uiCulture="auto" /> 

Esto hará que ASP.NET para detectar automáticamente la cultura del cliente desde la cabecera de la solicitud. También puede configurar esto por página a través del atributo Página.

+0

maxam: envolví su código en un bloque de código formateado para mostrar los <> s. "edite" la respuesta para ver cómo se ve, si está interesado. –

+0

¡Gracias, muy apreciado! – Maxam

+1

Esto funcionó para mí (ps: no necesité usar la configuración 'enableClientBasedCulture') – wdanda

2

El cliente generalmente establece Accept-Language en el encabezado de solicitud HTTP con una lista del lenguaje preferido cuantificada cuantitativamente, convencionalmente (pero no necesariamente) en orden de más favorecido a menos favorecido. Puede analizar eso, pero como ha señalado Maxam, ASP.NET tiene un mecanismo para hacerlo en su nombre.

1
/// <summary> 
    /// Sets a user's Locale based on the browser's Locale setting. If no setting 
    /// is provided the default Locale is used. 
    /// </summary> 

public static void SetUserLocale(string CurrencySymbol, bool SetUiCulture) 
{ 
    HttpRequest Request = HttpContext.Current.Request; 
    if (Request.UserLanguages == null) 
     return; 

    string Lang = Request.UserLanguages[0]; 
    if (Lang != null) 
    { 
     // *** Problems with Turkish Locale and upper/lower case 
     // *** DataRow/DataTable indexes 
     if (Lang.StartsWith("tr")) 
      return; 

     if (Lang.Length < 3) 
      Lang = Lang + "-" + Lang.ToUpper(); 
     try 
     { 
      System.Globalization.CultureInfo Culture = new System.Globalization.CultureInfo(Lang); 
      if (CurrencySymbol != null && CurrencySymbol != "") 
       Culture.NumberFormat.CurrencySymbol = CurrencySymbol; 

      System.Threading.Thread.CurrentThread.CurrentCulture = Culture; 

      if (SetUiCulture) 
       System.Threading.Thread.CurrentThread.CurrentUICulture = Culture; 
     } 
     catch 
     { ;} 
    } 
} 

La fuente de este artículo está aquí: How to detect browser language

Cuestiones relacionadas