Esempio n. 1
0
        public async Task <IViewComponentResult> InvokeAsync()
        {
            var currentUICulture  = CultureInfo.CurrentUICulture;
            var currentController = HttpContext.Request.RouteValues["controller"].ToString();
            var currentAction     = HttpContext.Request.RouteValues["action"].ToString();
            var urlPattern        = String.Empty;

            if (HttpContext.Request.RouteValues["url_pattern"] != null)
            {
                urlPattern = HttpContext.Request.RouteValues["url_pattern"].ToString();
            }

            LocalizationDirection translationDirection = LocalizationDirection.TranslatedToOriginal;

            var cultureOptions = new List <LanguageSwitcherOption>();

            foreach (CultureInfo ci in _localizationOptions.Value.SupportedCultures)
            {
                if (ci.Name != DefaultCulture)
                {
                    translationDirection = LocalizationDirection.OriginalToTranslated;
                }

                var translation = await _localizedRoutingProvider.ProvideRouteAsync(
                    ci.Name,
                    currentController,
                    currentAction,
                    translationDirection);

                var option = new LanguageSwitcherOption
                {
                    DisplayName          = ci.NativeName.Substring(0, ci.NativeName.IndexOf("(")),
                    CultureCode          = ci.Name,
                    TranslatedController = translation.Controller,
                    TranslatedAction     = translation.Action,
                    UrlPattern           = urlPattern
                };

                cultureOptions.Add(option);
            }

            var languageSwitcher = new LanguageSwitcher
            {
                CurrentUICulture = currentUICulture,
                CultureOptions   = cultureOptions
            };

            return(View("languageSelector", languageSwitcher));
        }
        /// <summary>
        /// Provides a route - depends on the direction.
        /// </summary>
        /// <param name="culture"></param>
        /// <param name="controler"></param>
        /// <param name="action"></param>
        /// <param name="direction"></param>
        /// <returns></returns>
        public async Task <RouteInformation> ProvideRouteAsync(string culture, string controler, string action, LocalizationDirection direction)
        {
            if (!_routesLoaded && !_routes.Any())
            {
                await _semaphore.WaitAsync();

                try
                {
                    _routes = await GetRoutesAsync();

                    _routesLoaded = true;
                }
                finally
                {
                    _semaphore.Release();
                }
            }

            return(GetLocalizedRoute(culture, controler, action, direction));
        }
        private RouteInformation GetLocalizedRoute(string culture, string controller, string action, LocalizationDirection direction)
        {
            Func <string, LocalizedRoute> translated = (currentCulture) =>
                                                       _routes
                                                       .FirstOrDefault(s =>
                                                                       s.Culture.Equals(currentCulture, StringComparison.OrdinalIgnoreCase) &&
                                                                       s.Translated.Action.Equals(action, StringComparison.OrdinalIgnoreCase) &&
                                                                       s.Translated.Controller.Equals(controller, StringComparison.OrdinalIgnoreCase));

            Func <string, LocalizedRoute> original = (currentCulture) =>
                                                     _routes
                                                     .FirstOrDefault(s =>
                                                                     s.Culture.Equals(currentCulture, StringComparison.OrdinalIgnoreCase) &&
                                                                     s.Original.Action.Equals(action, StringComparison.OrdinalIgnoreCase) &&
                                                                     s.Original.Controller.Equals(controller, StringComparison.OrdinalIgnoreCase));

            return(direction == LocalizationDirection.TranslatedToOriginal
                          ? translated(culture).Original
                          : original(culture).Translated);
        }