2013-08-30 1 views
7

Se l'utente ha il proprio browser impostato su fr-CA, ad esempio, ma il mio sito ha la possibilità di visualizzare la pagina in un'altra lingua disponibile (come l'inglese). Come posso sovrascrivere l'intestazione del linguaggio accept in modo che possa ricaricare utilizzando la lingua specificata?Come cambio il browser accept-language

Stavo tentando di modificare semplicemente l'intestazione Accept-Language e quindi di ricaricare la pagina, ma non sono sicuro di come farlo. qualche idea?

AGGIORNAMENTO: Ok, quindi sto convincendo la gente a spiegarmi quale sia la localizzazione, quindi non devo averlo fatto correttamente.

Attualmente il mio sito ha la globalizzazione impostata su auto nel web.config, in modo tale da impostare automaticamente la cultura del thread su qualsiasi lingua negoziata all'avvio dell'app. Per impostazione predefinita, il browser dell'utente invierà l'intestazione della lingua di accettazione in base alle impostazioni della lingua per il browser che, come indicato da qualcuno di seguito, gli utenti medi non hanno idea di cosa siano, dove siano o come cambiarli. In ogni caso, chiamiamo questo comportamento predefinito che il browser gestirà prima le intestazioni della lingua. Tuttavia, in qualità di FEATURE, voglio consentire all'utente di modificare questa intestazione di lingua accettata dalla pagina. Ad esempio, nell'applicazione, le impostazioni della lingua saranno normalmente determinate dal cookie o dalle preferenze dell'utente (tramite le impostazioni del profilo), ma sulla pagina di destinazione/di accesso (in particolare se questa è la prima volta che accedono a un determinato computer), ho non ho idea di chi tu sia, quindi ho solo le impostazioni del tuo browser da cui partire. Ma diciamo che stai viaggiando per lavoro e accedi a questo sito da un computer americano, la pagina viene caricata in inglese e non puoi leggerla e non hai idea di come cambiare la lingua del browser. Non sarebbe bello avere la possibilità di scegliere la lingua da un menu a discesa o un'icona o qualcosa del genere? Penso che sarebbe.

Quindi, per fare ciò, ho bisogno di essere in grado di cambiare quell'intestazione del linguaggio di accettazione e ricaricare la pagina. Questo è dove non sono sicuro di come procedere.

Ho provato navigator.language = <selected language> e xhr.setRequestHeader ma questi non sembrano funzionare.

+0

Non so se mi aiuta ma utilizzo Accept-Language per consegnare il contenuto correlato e fornire un fallback se non ci sono impostazioni locali per il linguaggio accettato disponibili sul server – Bernhard

risposta

4

Potrei sbagliarmi ma le impostazioni internazionali non sono qualcosa che si modifica nel codice. Questo è determinato dalla configurazione utente del browser. Se si utilizza un HttpClient, si invia definitivamente il valore desiderato per l'intestazione Accept-Language al server, ma non aspettarsi di cambiarlo dal codice e renderlo efficace in TUTTE le richieste originate nel browser.

È prassi comune impostare un cookie personalizzato con la preferenza della lingua dell'utente. Per impostazione predefinita, è necessario popolare questo cookie con il valore sull'intestazione Accept-Language. In ASP.NET MVC v'è un'impostazione in modo sia Thread.CurrentThread.CurrentCulture e Thread.CurrentThread.CurrentUICulture ottenere di impostare in base alla configurazione del browser dell'utente:

<system.web> 
    <globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto" /> 
</system.web> 

È possibile quindi creare un ActionFilter che avrebbe controllare il cookie della lingua personalizzata e imposta il valore Thread.CurrentThread.CurrentUICulture di conseguenza.

Thread.CurrentThread.CurrentUICulture viene utilizzato per determinare quali risorse deve essere utilizzato dal codice. Mentre Thread.CurrentThread.CurrentCulture viene utilizzato per tutti i numeri e la gestione delle date.

Questo è il modo che filtrano l'azione potrebbe essere simile:

public class LanguageActionFilter : IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext); 
     var culture = new CultureInfo(langCookie.Value); 

     Thread.CurrentThread.CurrentUICulture = culture; 
    } 

    private HttpCookie GetOrSetLanguageCookie(HttpContextBase context) 
    { 
     var cookie = context.Request.Cookies[Constants.LanguageCookieName]; 
     if (cookie == null) 
     { 
      //set the cookie for first time 
      cookie = new HttpCookie(Constants.LanguageCookieName, Thread.CurrentThread.CurrentUICulture.Name) 
      { 
       Expires = DateTime.Now.AddYears(1), 
       Path = "/" 
      }; 
      context.Response.Cookies.Add(cookie); 
     } 
     return cookie; 
    } 
} 

Pleae Nota:

  • anche quando il vostro utente seleziona, diciamo "es-Ar" nell'interfaccia, e imposta la tua UICulture di conseguenza per quell'utente, SE il browser dell'utente è configurato con le date en-US pubblicate per quell'utente sarà analizzato usando la convenzione inglese, quindi il numero sarà float.

IE: se l'utente in USA con un browser impostata su en_US sceglie di utilizzare l'interfaccia spagnola della vostra applicazione, quando queste informazioni messaggio dell'utente alle date del server come:

1/5/2015 volontà essere parsing come 5 gennaio nel server, piuttosto che il 1 ° maggio.

Numeri come 1.900 verranno analizzati come 1900 nel server anziché 1.900.

Ho imparato questo nel modo più difficile. Ho una domanda here a cui non ho mai risposto.

Per favore fatemi sapere se avete domande.

+0

Ok, quindi questo è effettivamente il modo in cui il mio sito è impostato su, con impostazioni locali automatiche nel web.config. Lo uso perché si prenderà cura della lista delle lingue ufficiali. Ma la mia domanda era come ignorarlo. Per impostazione predefinita, il browser invia quelle intestazioni di lingua e il mio sito li onorerà il meglio possibile. Voglio ignorare ciò che il browser sta inviando in modo che possa consentire all'utente di scegliere a mano se lo desiderano come funzionalità. – Sinaesthetic

+0

In una nota a margine, so come cambiarlo in jquery per le chiamate ajax, ma ho davvero bisogno di un modo per farlo tramite postback. Ad esempio "Modifica l'intestazione e ricarica questa pagina". – Sinaesthetic

+0

Ho risposto alla tua domanda nelle prime righe; scusa se sono andato troppo lontano nei dettagli, ho pensato che sarebbe stato utile nel caso non aveste il quadro completo. Non è possibile modificare questo nel codice. Puoi sicuramente modificare questa intestazione per una richiesta avviata dal codice, ma non puoi farlo globalmente, così ogni richiesta successiva avviata nel browser ora avrà l'intestazione appropriata data la selezione della lingua dell'utente. –

3

L'intestazione Accept-Language è un'intestazione di richiesta, quindi viene inviata dal browser (o altro software client). Sul tuo server, puoi ignorarlo senza fare nulla. Cioè, non ha alcun effetto in quanto tale; tutto dipende dal fatto che il tuo codice lato server lo riconosca e compia un'azione. Quindi non è possibile e non è necessario modificare l'intestazione inviata dal browser.

L'utente può modificare l'intestazione Accept-Language inviata dal browser utilizzando le impostazioni delle preferenze del browser. Ad esempio, in Chrome, vai su "Impostazioni", fai clic su "Mostra impostazioni avanzate ...", scorri verso il basso fino a "Lingue", fai clic su "Impostazioni lingua e immissione ...", quindi aggiungi le lingue e trascina per ordinarle .

Questo non è qualcosa che le persone fanno spesso, e molte persone non hanno idea dell'esistenza di tali impostazioni. Quindi, ciò che il browser invia sono di solito alcune impostazioni di fabbrica. Possono essere piuttosto strani, ad es. Accept-Language: fr-CA significherebbe, con il protocollo, "se tu, caro server, hai versioni linguistiche diverse della risorsa per la quale sto richiedendo, per favore dammi francese canadese; se non ce l'hai, non mi interessa quale versione dai ". Ciò significa che se la risorsa esiste in francese generico (francese francese) o in inglese, questi non avrebbero alcuna preferenza rispetto, per esempio, alla versione Swahili o Volapük. Quindi un header più sensato sarebbe normalmente Accept-Language: fr-CA, fr, en, e questo è in pratica come dovresti trattare con Accept-Language: fr-CA.