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));
        }