2009-10-27 16 views
28

Właśnie zaczynam lokalizować aplikację ASP.Net MVC. Większość ciągów zostanie zdefiniowana w plikach zasobów i pobrana przez Matt's Localization Helpers. Pozostałe ciągi muszą być przechowywane w bazie danych.ASP.NET MVC: Kiedy ustawić Thread.CurrentThread.CurrentUICulture?

Moje pytanie: powinienem ustawić CurrentUICulture wcześnie żądanie rurociągu i użyć całej aplikacji, lub bezpośrednio korzystać Request.UserLanguages[0] jeśli zajdzie taka potrzeba?

Już teraz Myślę, że powinienem ustawić CurrentUICulture w Application_BeginRequest. Realizacja będzie wyglądać mniej więcej tak:

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

Jest to najlepsze miejsce, aby ustawić CurrentUICulture i jest Request.UserLanguages[0] najlepsze miejsce, aby uzyskać te informacje?


Aktualizacja:

Ariel's po uświadomił mi, że to może być określona bez kodu, używając 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"/> 

Odpowiedz

13

Oto przykład przy użyciu HttpModule:

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

Inne opcje, utwórz klasę kontrolera bazowego i zaimplementuj tam logikę lokalizacji. Lub użyj atrybutu filtra akcji, ale musisz pamiętać, aby dodać go do każdego kontrolera lub połączyć to podejście z klasą kontrolera bazy.

+1

świetny link! Dziękuję Ci. –

+0

Czy ta metoda jest nadal ważna wraz z nadejściem AsyncController w najnowszej wersji ASP.NET MVC? Ponieważ technicznie mogą nie działać pod tym samym wątkiem niż "Thread.CurrentThread". –

+0

Nie po wyjęciu z pudełka. Zobacz http: // stackoverflow.com/questions/20601578/async-webapi-thread-currentculture –

6

Prośba.UserLanguages ​​[0] może być jedynie wskazówką, jakiego języka użytkownik chce zobaczyć. Większość użytkowników nie wie, gdzie zmienić język przeglądarki.

Inna kwestia: nie należy się upewnić, że Request.UserLanguages ​​[0] jest prawidłowym językiem. Może nawet mieć wartość zerową. (Nie wiesz, jakie boty mają)

Zazwyczaj na stronie znajduje się selektor języka. Gdy użytkownik wybrał tam język, jest przechowywany w pliku cookie, sesji lub adresie URL. Lubię używać adresu URL, ponieważ wydaje mi się, że wygląda ładnie.

Jeśli użytkownik widzi twoją stronę bez ustawienia języka na twojej stronie, powinieneś sprawdzić, czy Request.UserLanguages ​​[0] jest językiem, który wspierasz i ustawia Thread.CurrentThread.CurrentUICulture.

Używam filtra do ustawienia Thread.CurrentThread.CurrentUICulture. To ok, o ile żaden inny filtr nie używa Thread.CurrentThread.CurrentUICulture. W przeciwnym razie musisz ustawić prawidłową kolejność wykonywania dla filtrów.

Używam również pomocnika Mattsa i działało bardzo dobrze do tej pory.

Powiązane problemy