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