public override ValueTask <RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values) { if (MixService.GetAppSetting <bool>(MixAppSettingKeywords.IsInit)) { return(ValueTask.FromResult(values)); } RouteValueDictionary result = values; var keys = values.Keys.ToList(); var language = (string)values[keys[0]]; var keyIndex = 1; if (!MixService.Instance.CheckValidCulture(language)) { language = MixService.GetAppSetting <string>(MixAppSettingKeywords.DefaultCulture); keyIndex -= 1; } var path = string.Join('/', values.Values.Skip(keyIndex)); if (MixService.Instance.CheckValidAlias(language, path)) { result["controller"] = "home"; result["culture"] = language; result["action"] = "Index"; result["seoName"] = path; return(ValueTask.FromResult(result)); } string notTransformPattern = @"^(.*)\.(xml|json|html|css|js|map|jpg|png|gif|jpeg|svg|map|ico|webmanifest|woff|woff2|ttf|eot)$"; Regex reg = new Regex(notTransformPattern); if (reg.IsMatch(httpContext.Request.Path.Value)) { return(ValueTask.FromResult(values)); } var currentController = GetRouteValue(values, keys, ref keyIndex); var controller = MixService.Translate(currentController, language, currentController); if (!IsValidController(controller)) { controller = "home"; keyIndex -= 1; result["keyword"] = keyIndex < keys.Count ? string.Join('/', values.Values.Skip(keyIndex + 1)) : string.Empty; result["seoName"] = keys.Count > keyIndex ? (string)values[keys[keyIndex]] : string.Empty; result["culture"] = language; result["action"] = "Index"; result["controller"] = controller; } else { if (keys.Count > 2) { result["id"] = GetRouteValue(values, keys, ref keyIndex); } result["controller"] = controller; result["keyword"] = GetRouteValue(values, keys, ref keyIndex); } result["action"] = "Index"; return(ValueTask.FromResult(result)); }