Détection de la langue d’affichage du navigateur

En utilisant le code suivant

ssortingng[] languages = HttpContext.Current.Request.UserLanguages; ssortingng chosenLanguage = languages[0]; 

si j’ai installé 3 langues (ex. “da (danois)”, “sv (suédois)” et “en (anglais)”), le tableau de langues ressemble à ceci:

 [0]: "en-US" [1]: "en;q=0.8" [2]: "da;q=0.6" [3]: "sv;q=0.4" 

Même si je change la langue d’affichage en “Danois” au lieu de “Anglais”, le tableau ne change aucune des valeurs. D’après ce que d’autres personnes ont écrit sur ce sujet, la valeur [0] devrait être la langue choisie par le navigateur, mais elle rest "en-US" .

Existe-t-il un autre moyen d’enregistrer la langue du navigateur ou est-ce que je fais quelque chose de mal?

Définir la UICulture and Culture sur la page a fonctionné pour moi:

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" UICulture="auto" Culture="auto" %> 

J’ai ensuite réglé ma langue de chrome en French et je me suis assuré de commander de nouveau les langues – chrome prendra la langue par défaut pour le navigateur .

J’ai ensuite utilisé:

 Response.Write(System.Threading.Thread.CurrentThread.CurrentUICulture); 

Qui m’a correctement donné fr

Vous pouvez définir la culture au niveau de la page ou globalement, voir ici .

J’ai une application MVC et j’ai dû traiter cela d’une manière différente. Notre application utilise des langues paramétrées dans l’URL. Ce que je peux recommander car le changement de langue n’est pas possible pour la réponse acceptée. Il est également devenu explorable par les moteurs de recherche dans différentes langues et permet à l’utilisateur de sauvegarder ou d’envoyer une URL avec une langue spécifique.

Mais, à la demande initiale, je souhaitais détecter la langue de l’utilisateur. À présent, l’OP a indiqué qu’il ne pouvait pas modifier l’ordre. En effet, certains navigateurs (Chrome) déterminent cela, quelle que soit la langue que vous avez définie. sélection de la langue chrome Comme vous pouvez le constater, la langue de l’interface est définie sur l’anglais, mais pour tester, j’ai déplacé l’allemand vers le haut, que je n’utilise que pour la traduction. Résultat:

les langues

Ainsi, Chrome ajoute simplement tout ce que l’utilisateur a défini dans les parameters. La plupart des utilisateurs n’auront probablement défini que la langue de leur interface utilisateur et certaines langues qu’ils souhaitent utiliser pour les traductions / vérifications orthographiques. Alors voici mon code

Global.asax

 protected void Session_Start(Object sender, EventArgs e) { Session["sessionId"] = Session.SessionID; Session.Timeout = 120; //first point of request, get the user's browser language ssortingng[] languages = Request.UserLanguages; if (languages != null && Session.IsNewSession) { LanguageEnum requestLanguage = LanguageHelper.GetLanguage(languages); if (requestLanguage != LanguageEnum.NL)//NL is default for the sources { Response.RedirectToRoute("Locolized", new { lang = requestLanguage.ToSsortingng().ToLower() });//Locolized is an route name, see below } } } 

Assistant de langue

 public static LanguageEnum GetLanguage(ssortingng[] languages) { if (languages == null) return DefaultLanguage; LanguageEnum lang = DefaultLanguage; bool firstDone = false; foreach (ssortingng language in languages) { ssortingng realLanguage = Regex.Replace(language, "[;q=(0-9).]", ""); LanguageEnum givenlang = GetLanguage(realLanguage);//converts it to an enum, overload method. //first one should be the used language that is set for a browser (if user did not change it their self). //In some browsers their might be multiple languages (for translations) if (!firstDone) { firstDone = true; lang = givenlang; } else { //ranking others lang = RankLanguage(lang, givenlang); } } return lang; } private static LanguageEnum RankLanguage(LanguageEnum existing, LanguageEnum newLnag) { if (existing == LanguageEnum.EN && newLnag != LanguageEnum.EN) { //everything that is other then english gets a higher rank return newLnag; } //add other usecases here specific to your application/use case, keep in mind that all other languages could pass return existing; } //below code is for setting the language culture I use, //fixed number and date format for now, this can be improved. //might be if your interests if you want to use parameterized languages public static void SetLanguage(LanguageEnum language) { ssortingng lang = ""; switch (language) { case LanguageEnum.NL: lang = "nl-NL"; break; case LanguageEnum.EN: lang = "en-GB"; break; case LanguageEnum.DE: lang = "de-DE"; break; } try { NumberFormatInfo numberInfo = CultureInfo.CreateSpecificCulture("nl-NL").NumberFormat; CultureInfo info = new CultureInfo(lang); info.NumberFormat = numberInfo; //later, we will if-else the language here info.DateTimeFormat.DateSeparator = "/"; info.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; Thread.CurrentThread.CurrentUICulture = info; Thread.CurrentThread.CurrentCulture = info; } catch (Exception) { } } 

La façon dont je gère les URL paramétrées pourrait vous intéresser:

RouteConfig.cs Sous les autres mappages

 routes.MapRoute( name: "Locolized", url: "{lang}/{controller}/{action}/{id}", constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" }, // en or en-US defaults: new { controller = "shop", action = "index", id = UrlParameter.Optional } ); 

FilterConfig.cs (il peut être nécessaire d’append, le cas échéant, append FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); à la méthode Application_start() dans Global.asax

 public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new ErrorHandler.AiHandleErrorAtsortingbute()); //filters.Add(new HandleErrorAtsortingbute()); filters.Add(new LocalizationAtsortingbute("nl-NL"), 0); } } 

Et enfin, le LocalizationAtsortingbute

 public class LocalizationAtsortingbute : ActionFilterAtsortingbute { private ssortingng _DefaultLanguage = "nl-NL"; private ssortingng[] allowedLanguages = { "nl", "en" }; public LocalizationAtsortingbute(ssortingng defaultLanguage) { _DefaultLanguage = defaultLanguage; } public override void OnActionExecuting(ActionExecutingContext filterContext) { ssortingng lang = (ssortingng) filterContext.RouteData.Values["lang"] ?? _DefaultLanguage; LanguageHelper.SetLanguage(lang); } } 

Ce qu’il rest à faire, c’est d’append Ressources, voici une réponse précédente que j’ai écrite et qui couvre cela: https://stackoverflow.com/a/35813707/2901207

Avez-vous essayé Request.ServerVariables("HTTP_ACCEPT_LANGUAGE") ??

voici ma sortie fr-FR,en-US;q=0.5