2017-02-09 2 views
1

Il y a un joli fil ici: Get CultureInfo from current visitorObtenir la langue sélectionnée (active) sur le navigateur

Expliquer que nous pouvons facilement obtenir les langues navigateur en utilisant:

var userLanguages = Request.UserLanguages; 

Le problème ici est que cela donne seulement moi les langues configurées dans le navigateur, mais pas celle sélectionnée. En même temps, la première langue du tableau ([0]) pourrait ne pas être la langue active.

Existe-t-il un moyen de trouver l'actif sur le serveur? Je sais que je pourrais le faire du côté client en utilisant javascript, mais je veux éviter les doubles appels.

+1

Qu'est-ce que "l'élément sélectionné", exactement? Avoir une icône de drapeau quelque part sur votre site ne modifie pas l'en-tête de demande Accept-Language du navigateur. – CodeCaster

+0

Gardez à l'esprit que 'UserLanguages' provient d'un en-tête. Les en-têtes peuvent être modifiés par des pare-feu. Donc, vous n'obtenez pas nécessairement la culture * de l'utilisateur * en regardant cet en-tête. C'est une bien meilleure expérience utilisateur que vous faites la partie culture de l'URL comme dans [cette réponse] (http://stackoverflow.com/a/32839796/181087). Il a également l'avantage de s'assurer que chaque culture est indexée par les moteurs de recherche, plutôt que seulement la langue par défaut. – NightOwl888

Répondre

2

Vous aurez besoin de définir cette information via un cookie (qui peut être basculé par un paramètre sur votre page). Pour déterminer la culture côté serveur, il suffit de lire le cookie lorsque vous exécutez une action.

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
{ 

    HttpCookie cultureCookie = Request.Cookies["currentCulture"]; 
    string cultureName = cultureCookie== null ? "en-US" : cultureCookie.Value;   
    if (cultureCookie != null) 
     cultureName = cultureCookie.Value; 

    // Modify current thread's cultures    
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName); 
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

    return base.BeginExecuteCore(callback, state); 
} 
+1

Ceci est seulement une petite partie de la résolution de l'ensemble du problème. Oui, vous pouvez _save_ préférences de langue dans un cookie, mais cela ne fait rien d'autre que d'ajouter un cookie à chaque demande. En outre, vous ne pouvez pas faire confiance au référent - si vous en avez même un (HTTPS ne le fait pas, et certains plugins de confidentialité le suppriment). – CodeCaster