Ejemplo n.º 1
0
        public static bool TryFindFile(
            string directory,
            string fileName,
            string extension,
            ICultureExpression requestedCulture,
            IHostingEnvironment env,
            ICultureOption cultureOption,
            out IFileCultureInfo result)
        {
            // match requested
            if (TryFindFile(directory, fileName, extension, env, requestedCulture, out result))
            {
                return(true);
            }

            // match default
            if (TryFindFile(directory, fileName, extension, env, cultureOption.DefaultCulture, out result))
            {
                return(true);
            }

            // match no language
            string    targetName = $"{fileName}.{extension}";
            IFileInfo file       = env.ContentRootFileProvider.GetFileInfo(Path.Combine(directory, targetName));

            if (file.Exists && !file.IsDirectory)
            {
                result = new FileCultureInfo($"{directory}/{targetName}", targetName, fileName, extension, null);
                return(true);
            }

            // match failed
            result = null;
            return(false);
        }
        public override async Task ExecuteResultAsync(ActionContext context)
        {
            if (!(context is PageContext pageContext))
            {
                throw new ArgumentException($"{nameof(context)} should be instance of type {typeof(PageContext).Name}");
            }


            string executingFilePath = ".";
            string basePath          = this.Page.Path;
            string fileName          = Path.GetFileName(basePath);
            string pageName          = Path.GetFileNameWithoutExtension(basePath);
            string directory         = basePath.Substring(0, basePath.Length - fileName.Length);

            while (directory[directory.Length - 1] == '/')
            {
                directory = directory.Substring(0, directory.Length - 1);
            }

            HttpContext      httpContext     = pageContext.HttpContext;
            IRazorViewEngine engine          = httpContext.RequestServices.GetRequiredService <IRazorViewEngine>();
            ICultureContext  cultureContext  = httpContext.RequestServices.GetRequiredService <ICultureContext>();
            IFileCultureInfo fileCultureInfo = httpContext.RequestServices.GetRequiredService <ICultureFileCache>().Get(_requestedCulture, directory, pageName, "cshtml");

            if (fileCultureInfo != null)
            {
                httpContext.RequestServices.GetRequiredService <ILocalizedViewRenderContextAccessor>().Context = new LocalizedViewRenderContext(_requestedCulture, fileCultureInfo.Culture, cultureContext.UrlCultureSpecifier);
                string relativePath = fileCultureInfo.RelativePath; // 7 == ".cshtml".Length
                if (!relativePath.Equals(this.Page.Path))
                {
                    RazorPageResult pageResult        = engine.GetPage(executingFilePath, relativePath);
                    Page            page              = (Page)pageResult.Page;
                    PageContext     resultPageContext = pageContext.CreateCopy();
                    ViewContext     resultViewContext = this.Page.ViewContext.CreateCopy();
                    page.ViewContext = resultViewContext;
                    resultViewContext.ExecutingFilePath             = relativePath;
                    resultPageContext.ActionDescriptor.PageTypeInfo = page.GetType().GetTypeInfo();
                    resultPageContext.ActionDescriptor.RelativePath = relativePath;
                    page.PageContext = resultPageContext;
                    page.HtmlEncoder = this.Page.HtmlEncoder;
                    page.Path        = relativePath;
                    this.Page        = page;
                }
            }
            else
            {
                httpContext.RequestServices.GetRequiredService <ILocalizedViewRenderContextAccessor>().Context = new LocalizedViewRenderContext(_requestedCulture, null, cultureContext.UrlCultureSpecifier);
            }

            var executor = context.HttpContext.RequestServices.GetRequiredService <PageResultExecutor>();
            await executor.ExecuteAsync(pageContext, this);
        }
Ejemplo n.º 3
0
        public static bool TryFindFile(
            string directory,
            string fileName,
            string extension,
            ICultureExpression requestedCulture,
            HttpContext httpContext,
            out IFileCultureInfo result)
        {
            IHostingEnvironment env    = httpContext.RequestServices.GetRequiredService <IHostingEnvironment>();
            ICultureOption      option = httpContext.RequestServices.GetRequiredService <ICultureOption>();

            return(TryFindFile(directory, fileName, extension, requestedCulture, env, option, out result));
        }
        public override ViewEngineResult FindView(ActionContext actionContext, ViewResult viewResult)
        {
            string viewName = viewResult.ViewName;

            if (viewName == null)
            {
                viewName = GetActionName(actionContext);
            }
            if (viewName == null)
            {
                return(base.FindView(actionContext, viewResult));
            }

            string controllerName;

            if (!actionContext.ActionDescriptor.RouteValues.TryGetValue(ControllerNameKey, out controllerName) ||
                string.IsNullOrEmpty(controllerName))
            {
                controllerName = "";
            }
            string directory = Path.Combine("Views", controllerName);

            HttpContext               httpContext     = actionContext.HttpContext;
            IServiceProvider          provider        = httpContext.RequestServices;
            ICultureOption            cultureOption   = provider.GetRequiredService <ICultureOption>();
            ICultureContext           cultureContext  = provider.GetRequiredService <ICultureContext>();
            CultureMatchingViewResult viewFindResult  = (CultureMatchingViewResult)viewResult;
            ICultureFileCache         fileCache       = provider.GetRequiredService <ICultureFileCache>();
            IFileCultureInfo          fileCultureInfo = fileCache.Get(viewFindResult.RequestedCulture, directory, viewName, "cshtml");

            if (fileCultureInfo != null)
            {
                httpContext.RequestServices.GetRequiredService <ILocalizedViewRenderContextAccessor>().Context = new LocalizedViewRenderContext(viewFindResult.RequestedCulture, fileCultureInfo.Culture, cultureContext.UrlCultureSpecifier);
                string relativePath = fileCultureInfo.RelativePath.Substring(0, fileCultureInfo.RelativePath.Length - 7); // 7 == ".cshtml".Length
                relativePath        = relativePath.Substring(directory.Length + 1);
                viewResult.ViewName = relativePath;
                return(base.FindView(actionContext, viewResult));
            }
            else
            {
                httpContext.RequestServices.GetRequiredService <ILocalizedViewRenderContextAccessor>().Context = new LocalizedViewRenderContext(viewFindResult.RequestedCulture, null, cultureContext.UrlCultureSpecifier);
                return(base.FindView(actionContext, viewResult));
            }
        }
Ejemplo n.º 5
0
        private static bool TryFindFile(
            string directory,
            string fileName,
            string extension,
            IHostingEnvironment env,
            ICultureExpression requestedCulture,
            out IFileCultureInfo result)
        {
            string             filePath;
            string             targetName;
            string             culture;
            IFileInfo          file;
            IDirectoryContents contents;
            IFileProvider      provider = env.ContentRootFileProvider;

            if (requestedCulture.IsAllRegion)
            {
                // find by name
                // View.en.cshtml
                culture    = requestedCulture.Language;
                targetName = $"{fileName}.{culture}.{extension}";
                filePath   = $"{directory}/{targetName}";
                file       = provider.GetFileInfo(filePath);
                if (file.Exists && !file.IsDirectory)
                {
                    result = new FileCultureInfo(filePath, targetName, fileName, extension, requestedCulture);
                    return(true);
                }

                // try find directory named with language
                // en/View.cshtml
                contents = provider.GetDirectoryContents(directory);
                IFileInfo dir = contents.FirstOrDefault(x => x.IsDirectory && x.Name.Equals(culture));
                if (dir != null)
                {
                    targetName = $"{fileName}.{extension}";
                    filePath   = $"{directory}/{dir.Name}/{targetName}";
                    file       = provider.GetFileInfo(filePath);
                    if (file.Exists && !file.IsDirectory)
                    {
                        result = new FileCultureInfo(filePath, targetName, fileName, extension, requestedCulture);
                        return(true);
                    }
                }

                // find the first region having the same language
                // View.en-XX.cshtml
                string startsWithFilter = $"{fileName}.{culture}-";
                string endsWithFilter   = $".{extension}";
                file = contents.FirstOrDefault(x => !x.IsDirectory && x.Name.StartsWith(startsWithFilter) && x.Name.EndsWith(endsWithFilter));
                if (file != null)
                {
                    culture  = file.Name.Substring(fileName.Length + 1);
                    culture  = Path.GetFileNameWithoutExtension(culture);
                    filePath = $"{directory}/{file.Name}";
                    result   = new FileCultureInfo(filePath, file.Name, fileName, extension, culture.ParseCultureExpression());
                    return(true);
                }

                // try find directory named with the first region having the same language
                // en-XX/View.cshtml
                startsWithFilter = $"{culture}-";
                dir = contents.FirstOrDefault(x => x.IsDirectory && x.Name.StartsWith(startsWithFilter));
                if (dir != null)
                {
                    targetName = $"{fileName}.{extension}";
                    filePath   = $"{directory}/{dir.Name}/{targetName}";
                    file       = provider.GetFileInfo(filePath);
                    if (file.Exists && !file.IsDirectory)
                    {
                        culture = dir.Name;
                        result  = new FileCultureInfo(filePath, targetName, fileName, extension, culture.ParseCultureExpression());
                        return(true);
                    }
                }
            }
            else
            {
                // find by name
                // View.en-US.cshtml
                culture    = requestedCulture.DisplayName;
                targetName = $"{fileName}.{culture}.{extension}";
                filePath   = $"{directory}/{targetName}";
                file       = provider.GetFileInfo(filePath);
                if (file.Exists && !file.IsDirectory)
                {
                    result = new FileCultureInfo(filePath, targetName, fileName, extension, requestedCulture);
                    return(true);
                }

                // try find directory named with name
                // en-US/View.cshtml
                contents = provider.GetDirectoryContents(directory);
                IFileInfo dir = contents.FirstOrDefault(x => x.IsDirectory && x.Name.Equals(culture));
                if (dir != null)
                {
                    targetName = $"{fileName}.{extension}";
                    filePath   = $"{directory}/{culture}/{targetName}";
                    file       = provider.GetFileInfo(filePath);
                    if (file.Exists && !file.IsDirectory)
                    {
                        result = new FileCultureInfo(filePath, targetName, fileName, extension, requestedCulture);
                        return(true);
                    }
                }

                // find by language
                // View.en.cshtml
                culture    = requestedCulture.Language;
                targetName = $"{fileName}.{culture}.{extension}";
                filePath   = $"{directory}/{targetName}";
                file       = provider.GetFileInfo(filePath);
                if (file.Exists && !file.IsDirectory)
                {
                    result = new FileCultureInfo(filePath, targetName, fileName, extension, culture.ParseCultureExpression());
                    return(true);
                }

                // try find directory named with the specific language
                // en/View.cshtml
                dir = contents.FirstOrDefault(x => x.IsDirectory && x.Name.Equals(culture));
                if (dir != null)
                {
                    targetName = $"{fileName}.{extension}";
                    filePath   = $"{directory}/{culture}/{targetName}";
                    file       = provider.GetFileInfo(filePath);
                    if (file.Exists && !file.IsDirectory)
                    {
                        result = new FileCultureInfo(filePath, targetName, fileName, extension, culture.ParseCultureExpression());
                        return(true);
                    }
                }
            }

            result = null;
            return(false);
        }