简体   繁体   中英

Where to put general language adjustment?

Well, the title says it all.

I do the following now in my LanguageFilterAttribute class:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request         = filterContext.HttpContext.Request;
        string currentUrl   = request.RawUrl;
        var urlHelper       = new UrlHelper(request.RequestContext);

        string baseurl                      = urlHelper.Content("~");
        string currentLanguageFromUrl       = currentUrl.Split('/')[1];
        string currentLanguageFromCulture   = CultureHelper.CheckCulture();
        var currentLanguageFromCookie       = request.Cookies["_culture"];

        var possibleCultures                = UnitOfWork.CulturesRepository.GetListOfCultureNames();

        if (possibleCultures.All(culture => currentLanguageFromUrl != culture))
        {
            string cultureName;
            string newUrl;

            if (currentLanguageFromCookie != null)
            {
                cultureName = currentLanguageFromCookie.Value;
                CultureHelper.SetCulture(cultureName);
                newUrl = baseurl + cultureName;
                filterContext.Result = new RedirectResult(newUrl);
                return;
            }

            if (currentLanguageFromCulture != null)
            {
                cultureName = currentLanguageFromCulture;
                CultureHelper.SetCulture(cultureName);
                newUrl = baseurl + cultureName;
                filterContext.Result = new RedirectResult(newUrl);
                return;
            }

            cultureName = possibleCultures[0];
            CultureHelper.SetCulture(cultureName);
            newUrl = baseurl + cultureName;
            filterContext.Result = new RedirectResult(newUrl);
            return;
        }

        CultureHelper.SetCulture(currentLanguageFromUrl);

        base.OnActionExecuting(filterContext);
    };

Which sets the language when you select a new one from the dopdown on the shared Layout page (this works btw, selecting a different language triggers respectively, the above and below class correctly).

    public static void SetCulture(string culture)
    {
        var cultureCookie = HttpContext.Current.Request.Cookies["_culture"] ?? new HttpCookie("_culture");
        cultureCookie.Value = culture;
        var request = HttpContext.Current.Request;

        cultureCookie.Domain = request.Url.Host;

        cultureCookie.Expires = DateTime.Now.AddYears(1);
        cultureCookie.Path = "/";
        HttpContext.Current.Response.Cookies.Add(cultureCookie);

        CultureInfo info = CultureInfo.CreateSpecificCulture(culture.ToString());

        Thread.CurrentThread.CurrentCulture = info;
        Thread.CurrentThread.CurrentUICulture = info;

    }

The problem with this is, as you can guess, I will have to apply the [LanguageFilter] attribute on all my controllers. Isn't there a file where I can place this that will change my language every time I go to another page?

http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx

When a new application thread is started, its current culture and current UI culture are defined by the current system culture, and not by the current thread culture.

Isn't this your case?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM