2009-10-27 15 views
28

Sto appena iniziando a localizzare un'applicazione ASP.Net MVC. La maggior parte delle stringhe verrà definita nei file di risorse e recuperata tramite Matt's Localization Helpers. Altre stringhe devono essere memorizzate in un database.ASP.NET MVC: quando impostare Thread.CurrentThread.CurrentUICulture?

La mia domanda: Devo impostare CurrentUICulture presto in cantiere richiesta e l'uso che in tutta l'applicazione, o utilizzare direttamente Request.UserLanguages[0] in caso di necessità?

In questo momento Sto pensando che dovrei impostare CurrentUICulture in Application_BeginRequest. L'implementazione sarebbe simile a questa:

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

È questo il posto migliore per impostare CurrentUICulture ed è Request.UserLanguages[0] il posto migliore per ottenere queste informazioni?


Aggiornamento:

Ariel's messaggio mi ha fatto capire che questo può essere definito senza codice, utilizzando 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"/> 

risposta

13

Ecco un esempio usando un HttpModule:

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

Altre opzioni, creare una classe controller di base e implementare la logica di localizzazione lì. Oppure utilizza un attributo del filtro azione, ma dovrai ricordarti di aggiungerlo su ogni controller o combinare questo approccio con la classe Controller di base.

+1

ottimo collegamento! Grazie. –

+0

Questo metodo è ancora valido con l'arrivo di AsyncController nella versione recente di ASP.NET MVC? Perché tecnicamente potrebbero non essere eseguiti con lo stesso thread di 'Thread.CurrentThread'. –

+0

Non fuori dalla scatola. Vedi http: // StackOverflow.it/questions/20601578/async-webapi-thread-currentculture –

6

Request.UserLanguages ​​[0] può essere solo un suggerimento su quale lingua gli utenti desiderano vedere. La maggior parte degli utenti non sa dove cambiare la lingua del browser.

Un altro punto: non essere sicuro che Request.UsLanguages ​​[0] sia una lingua valida. Può anche essere nullo. (Non sono sicuro che i robot ci siano)

Di solito nella pagina è presente un selettore di lingua. Una volta che un utente ha selezionato una lingua, viene memorizzata in un cookie, una sessione o un URL. Mi piace usare l'URL perché penso che sia carino.

Se un utente visualizza la pagina senza impostare una lingua sulla pagina, è necessario verificare se Request.UserLanguages ​​[0] è una lingua supportata e impostare Thread.CurrentThread.CurrentUICulture.

Uso un filtro per impostare Thread.CurrentThread.CurrentUICulture. Questo è ok se nessun altro filtro utilizza Thread.CurrentThread.CurrentUICulture. Altrimenti dovresti impostare il giusto ordine di esecuzione per i filtri.

Io uso anche l'helper Matts e ha funzionato molto bene finora.