Example #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);
        }
Example #2
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);
        }