2010-06-28 10 views
8

Ich versuche, das Land meiner Kunden zu bekommen, also verwende ich CultureInfo.CurrentCulture. Problem ist, dass, wenn meine kanadischen Kunden meine Website verwenden, sie als Amerikaner angezeigt werden.CultureInfo.CurrentCulture gibt mir die falsche Kultur

Es sieht so aus, als ob CultureInfo.CurrentCulture das Land meines Servers statt ihres Landes zurückgibt. Wie bekomme ich das Land meiner Kunden?

Antwort

2

Ich glaube, Sie müssen Code schreiben lesen Sie die Kultur des Benutzers von der eingehenden Browser-Anfrage, und legen Sie Ihre CultureInfo von diesem.

This fellow describes how they do it: Legen Sie die Anzeigekultur für den aktuellen Thread auf die am besten geeignete Kultur aus dem eingehenden HTTP-Objekt "Anforderung" des Benutzers fest.

Er hat eine ausgezeichnete Diskussion gibt, aber das ist im Grunde, wie er es tut:

In Page_Load, machen sie diesen Aufruf: UIUtilities.setCulture(Request);

Wo ist das, was man bekommt:

/// 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

In den richtigen Zeilen, aber beachten Sie, dass der Accept-Language-Header, der vom Browser gesendet wird, nicht unbedingt die bevorzugte Sprache des Benutzers ist. Ich bin in Europa und habe zufällig eine US-Version von Windows, also sendet mein IE8 en-US. Beachten Sie außerdem, dass der Name in der Kopfzeile der akzeptierten Sprache möglicherweise kein gültiger Name der .NET-Kultur ist. Daher sollte der Aufruf von CreateSpecificCulture in einem try/catch eingeschlossen sein. – Joe

+0

kein Glück. Ich bekomme immer noch en-uns in Test – thchaver

+0

Was bekommen Sie von Request.UserLanguages? Sind Sie sicher, welche Sprache Ihr Browser anfordert? – DOK

18

Sie müssen nur das culture Attribut auf auto in Ihrer Datei web.config festlegen:

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

Dadurch wird die CurrentCulture automatisch auf die Kultur des Clients festgelegt.

Sie können uiCulture auch auf auto setzen, wenn Sie lokalisierte Ressourcen verwenden.

+1

Ich wünschte, ich könnte dies mehr als einmal aufmuntern, danke. Hat mich 3 Stunden gekostet, damit das funktioniert :) – Thousand

1

In meinem Fall hatte meine Maschine ursprünglich Englisch - Großbritannien installiert. Ich habe die Sprache Englisch - US hinzugefügt und als Standard festgelegt. Ich habe auch verifiziert, dass US in der Registrierung richtig eingestellt wurde. Leider zeigte System.Threading.Thread.CurrentThread.CurrentCulture immer noch die falsche Kultur, UK. Ich habe festgestellt, dass Sie die Sprachoptionen einstellen müssen. Laden Sie das Sprachpaket, die Handschrift und die Rede herunter.

Sogar dann war die Kultur falsch. Das Vereinigte Königreich würde überall auf der Maschine auftauchen und nachdem ich das US Sprachpaket installiert hatte, ging das Startmenü völlig durcheinander. Ich habe aufgegeben und das Betriebssystem mit einer englisch-amerikanischen Version neu installiert.