2009-10-27 15 views
28

Ich fange gerade an, eine ASP.Net MVC-Anwendung zu lokalisieren. Die meisten Zeichenfolgen werden in Ressourcendateien definiert und über Matt's Localization Helpers abgerufen. Andere Zeichenfolgen müssen in einer Datenbank gespeichert werden.ASP.NET MVC: wann Thread.CurrentThread.CurrentUICulture festlegen?

Meine Frage: Sollte ich CurrentUICulture früh in der Anforderungspipeline und verwenden, die in der gesamten Anwendung oder direkt Request.UserLanguages[0] verwenden, wenn nötig?

Gerade jetzt Ich denke, dass ich CurrentUICulture in Application_BeginRequest setzen sollte. Die Umsetzung würde wie folgt aussehen:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    var cultureName = HttpContext.Current.Request.UserLanguages[0]; 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName); 
} 

Ist dies der beste Ort CurrentUICulture zu setzen und ist Request.UserLanguages[0] der beste Ort, dass Informationen zu bekommen?


Update:

Ariel's Post machte mir klar, dass dies ohne Code definiert werden können, unter Verwendung von web.config

<system.web> 
    <!--If enableClientBasedCulture is true, ASP.NET can set the UI culture and culture for a Web page automatically, based on the values that are sent by a browser.--> 
    <globalization enableClientBasedCulture="true" culture="auto:en-US" uiCulture="auto:en"/> 

Antwort

13

Hier wird eine Probe ein Httpmodule verwenden:

http://weblogs.manas.com.ar/smedina/2008/12/17/internationalization-in-aspnet-mvc/

Andere Optionen, erstellen Sie eine Basis-Controller-Klasse und implementieren Sie dort die Lokalisierungslogik. Oder verwenden Sie ein Aktionsfilter-Attribut, aber Sie müssen daran denken, es auf jedem Controller hinzuzufügen oder diesen Ansatz mit der Basis-Controller-Klasse zu kombinieren.

+1

toller link! Vielen Dank. –

+0

Ist diese Methode in der aktuellen Version von ASP.NET MVC noch gültig, wenn AsyncController ausgeführt wird? Weil sie technisch nicht unter demselben Thread laufen wie 'Thread.CurrentThread'. –

+0

Nicht im Lieferumfang enthalten. Siehe http: // stackoverflow.com/questions/20601578/async-webapi-thread-currentculture –

6

Request.UserLanguages ​​[0] kann nur ein Hinweis sein, welche Sprache der Benutzer sehen möchte. Die meisten Benutzer wissen nicht, wo sie die Browsersprache ändern sollen.

Ein weiterer Punkt: Seien Sie nicht sicher, dass Request.UserLanguages ​​[0] eine gültige Sprache ist. Es kann sogar null sein. (Nicht sicher, was Bots dort haben)

Sie haben normalerweise eine Sprachauswahl auf der Seite. Sobald ein Benutzer dort eine Sprache ausgewählt hat, wird diese in einem Cookie, einer Sitzung oder URL gespeichert. Ich benutze gerne URL, weil ich denke, dass es hübsch aussieht.

Wenn ein Benutzer Ihre Seite sieht, ohne eine Sprache auf Ihrer Seite festgelegt zu haben, sollten Sie überprüfen, ob Request.UserLanguages ​​[0] eine von Ihnen unterstützte Sprache ist, und Thread.CurrentThread.CurrentUICulture festlegen.

Ich verwende einen Filter, um Thread.CurrentThread.CurrentUICulture festzulegen. Das ist in Ordnung, solange kein anderer Filter Thread.CurrentThread.CurrentUICulture verwendet. Andernfalls müssten Sie die richtige Ausführungsreihenfolge für Filter festlegen.

Ich benutze auch Matts Helfer und es funktionierte bisher sehr gut.

Verwandte Themen