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