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. 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:
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