public override async Task Invoke(IOwinContext context)
        {
            var requestCulture = Options.DefaultRequestCulture;
            IRequestCultureProvider winningProvider = null;

            if (Options.RequestCultureProviders != null)
            {
                foreach (var provider in this.Options.RequestCultureProviders)
                {
                    var providerResultCulture = await provider.DetermineProviderCultureResult(context);
                    if (providerResultCulture == null)
                        continue;

                    var cultures = providerResultCulture.Cultures;
                    var uiCultures = providerResultCulture.UICultures;

                    CultureInfo cultureInfo = null;
                    CultureInfo uiCultureInfo = null;
                    if (Options.SupportedCultures != null)
                    {
                        cultureInfo = GetCultureInfo(cultures, Options.SupportedCultures, Options.FallBackToParentCultures);
                    }

                    if (Options.SupportedUICultures != null)
                    {
                        uiCultureInfo = GetCultureInfo(uiCultures, Options.SupportedUICultures, Options.FallBackToParentUICultures);
                    }

                    if (cultureInfo == null && uiCultureInfo == null)
                    {
                        continue;
                    }

                    if (cultureInfo == null)
                    {
                        cultureInfo = Options.DefaultRequestCulture.Culture;
                    }

                    if (cultureInfo != null && uiCultureInfo == null)
                    {
                        uiCultureInfo = Options.DefaultRequestCulture.UICulture;
                    }

                    var result = new RequestCulture(cultureInfo, uiCultureInfo);
                    requestCulture = result;
                    winningProvider = provider;
                    break;
                }
            }

            //context.Features.Set<IRequestCultureFeature>(new RequestCultureFeature(requestCulture, winningProvider));
            SetCurrentThreadCulture(requestCulture);
            await Next.Invoke(context);
        }
        /// <summary>
        /// Creates a string representation of a <see cref="RequestCulture"/> for placement in a cookie.
        /// </summary>
        /// <param name="requestCulture">The <see cref="RequestCulture"/>.</param>
        /// <returns>The cookie value.</returns>
        public static string MakeCookieValue(RequestCulture requestCulture)
        {
            if (requestCulture == null)
            {
                throw new ArgumentNullException("requestCulture");
            }

            var seperator = _cookieSeparator[0].ToString();

            return string.Join(seperator,
                string.Format("{0}{1}", _culturePrefix, requestCulture.Culture.Name),
                string.Format("{0}{1}", _uiCulturePrefix, requestCulture.UICulture.Name));
        }
 private static void SetCurrentThreadCulture(RequestCulture requestCulture)
 {
     Thread.CurrentThread.CurrentCulture = requestCulture.Culture;
     Thread.CurrentThread.CurrentUICulture = requestCulture.UICulture;
 }