public void LanguageResolver_DoesntMatchDifferentCodes() { Assert.AreEqual(false, LanguageDefinitions.AreCodesEquivalent("en", "de-DE")); Assert.AreEqual(false, LanguageDefinitions.AreCodesEquivalent("de-DE", "fr-CA")); }
public void LanguageResolver_MatchesExactCodes() { Assert.AreEqual(true, LanguageDefinitions.AreCodesEquivalent("pt", "pt")); Assert.AreEqual(true, LanguageDefinitions.AreCodesEquivalent("pt-pt", "pt-PT")); }
public void LanguageResolver_MatchesSimilarCodes() { Assert.AreEqual(true, LanguageDefinitions.AreCodesEquivalent("en-US", "en-GB")); Assert.AreEqual(true, LanguageDefinitions.AreCodesEquivalent("pt", "pt-BR")); }
protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { // Get the language from the url -- most prioritary. var urlLocale = requestContext.RouteData.Values["culture"] as string ?? ""; var culturesToTest = new List <string>(); if (!string.IsNullOrEmpty(urlLocale)) { culturesToTest.Add(urlLocale); } // Get the language from the cookie, if it exists -- 2nd priority. var cookieLocale = requestContext.HttpContext.Request.Cookies["locale"]; if (cookieLocale != null) { culturesToTest.Add(cookieLocale.Value); } // Add all the user's requested languages from the Accept-Language header -- 3rd priority. culturesToTest.AddRange(requestContext .HttpContext .Request .UserLanguages .Select(l => l.Split(';')[0]) .ToList()); var chosenLanguage = LanguageDefinitions.GetClosestLanguageCode(culturesToTest.ToArray()); var localeCookie = new HttpCookie("locale", chosenLanguage); localeCookie.Expires = DateTime.Now.AddYears(2); requestContext.HttpContext.Response.SetCookie(localeCookie); // Redirect if the url locale doesn't match the culture name. if (!LanguageDefinitions.AreCodesEquivalent(chosenLanguage, urlLocale)) { var routeValues = requestContext.RouteData.Values; routeValues["culture"] = LanguageDefinitions.GetClosestLanguageCode(chosenLanguage); return(new RedirectHandler(new UrlHelper(requestContext).RouteUrl(routeValues))); } try { // Set the thread's language. var culture = CultureInfo.GetCultureInfo(chosenLanguage); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; } catch (CultureNotFoundException) { // if CultureInfo.GetCultureInfo throws exception // we should redirect with default locale return(GetDefaultLocaleRedirectHandler(requestContext)); } return(base.GetHttpHandler(requestContext)); }