2010-06-28 24 views
8

Estoy tratando de obtener el país de mis clientes, entonces uso CultureInfo.CurrentCulture. El problema es que cuando mis clientes canadienses usan mi sitio web, se muestran como estadounidenses.CultureInfo.CurrentCulture me está dando la cultura equivocada

Parece que CultureInfo.CurrentCulture está devolviendo el país de mi servidor en lugar de su país. Entonces, ¿cómo puedo obtener el país de mis clientes?

Respuesta

2

Creo que necesita escribir el código en lea la cultura del usuario de la solicitud del navegador entrante, y configure su CultureInfo a partir de ahí.

This fellow describes how they do it: Establezca la cultura de visualización para el subproceso actual en la referencia cultural más adecuada del objeto de "solicitud" Http entrante del usuario.

Él tiene una excelente discusión allí, pero esto es básicamente cómo lo hace:

En Page_Load, que hacen de esta llamada: UIUtilities.setCulture(Request);

Cuando esto es lo que se llama:

/// Set the display culture for the current thread to the most 
/// appropriate culture from the user's incoming Http "request" object. 
internal static void setCulture(HttpRequest request) 
{ 
    if (request != null) 
    { 
     if (request.UserLanguages != null) 
     { 
     if (request.UserLanguages.Length > -1) 
     { 
      string cultureName = request.UserLanguages[0]; 
      UIUtilities.setCulture(cultureName); 
     } 
     } 
     // TODO: Set to a (system-wide, or possibly user-specified) default 
     // culture if the browser didn't give us any clues. 
    } 
} 

/// Set the display culture for the current thread to a particular named culture. 
/// <param name="cultureName">The name of the culture to be set 
/// for the thread</param> 
private static void setCulture(string cultureName) 
{ 
    Thread.CurrentThread.CurrentCulture = 
     CultureInfo.CreateSpecificCulture(cultureName); 
    Thread.CurrentThread.CurrentUICulture = new 
     CultureInfo(cultureName); 
} 
+0

En la línea derecha, pero tenga en cuenta que el encabezado Aceptar idioma enviado por el navegador no es necesariamente el idioma preferido del usuario. Estoy en Europa y tengo una versión estadounidense de Windows, entonces mi IE8 envía en-US. También tenga en cuenta que el nombre en el encabezado accept-language puede no ser un nombre de cultura .NET válido, por lo que la llamada a CreateSpecificCulture debe incluirse en try/catch. – Joe

+0

sin suerte. Todavía estoy obteniendo en-us en testing – thchaver

+0

¿Qué obtienes de Request.UserLanguages? Es decir, ¿está seguro de qué idioma está solicitando su navegador? – DOK

18

Solo necesita establecer el atributo culture en auto en su archivo web.config:

<system.web> 
    <globalization culture="auto" /> 
<system.web> 

Esto configurará automáticamente el CurrentCulture en la cultura del cliente.

También puede establecer uiCulture en auto si utiliza recursos localizados.

+1

ojalá pudiera votar esto más de una vez, gracias. Me tomó 3 horas para que esto funcione :) – Thousand

1

En mi caso, mi máquina originalmente tenía instalado English - UK. Agregué el idioma inglés - estadounidense y lo configuré como predeterminado. También verifiqué que EE. UU. Se configuró correctamente en el registro. Lamentablemente, System.Threading.Thread.CurrentThread.CurrentCulture todavía muestra la cultura incorrecta, Reino Unido. Descubrí que necesitas establecer las opciones de idioma. Descargue el paquete de idioma, la escritura y el discurso.

Incluso entonces la cultura era incorrecta. El Reino Unido se mostraría en toda la máquina y, después de instalar el paquete de idioma de EE. UU., El menú de inicio se volvió completamente loco. Me rendí y reinstalé el sistema operativo usando una versión en inglés.

Cuestiones relacionadas