Файлы ресурсов из папки ресурсов
У меня есть 3 файла ресурсов:
/Resources/Values.en-US.resx
/Resources/Values.es-ES.resx
/Resources/Values.fr-FR.resx
(English, Spanish, French)
Отсюда я хочу "просканировать", какие языки (из этих файлов ресурсов) доступны, чтобы я мог поместить их в список и отобразить их пользователю для выбора. После выпуска моей программы люди смогут добавлять больше языков. Программа выполнит поиск новых языков и сделает их доступными из списка.
Есть ли способ получить файлы из папки Resources?
1 ответ
Вы можете перебирать файлы, расположенные в каталоге содержимого приложения, затем выбирать файлы ресурсов, извлекать фрагмент культуры из имени файла и в конечном итоге создавать список культур.
Во-первых, введите IHostingEnvironment, чтобы использовать ContentRootPath
собственность это обеспечивает.
private readonly IHostingEnvironment _hostingEnvironment;
public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
Пока вы держите все свои файлы ресурсов под ./Resources/
каталог у вас должен быть в порядке.
Далее создайте DirectoryInfo:
var contentRootPath = Path.Combine(_hostingEnvironment.ContentRootPath, "Resources");
DirectoryInfo contentDirectoryInfo;
try
{
contentDirectoryInfo = new DirectoryInfo(contentRootPath);
}
catch (DirectoryNotFoundException)
{
// Here you should handle "Resources" directory not found exception.
throw;
}
Получить имена файлов ресурсов:
var resoruceFilesInfo = contentDirectoryInfo.GetFiles("*.resx", SearchOption.AllDirectories);
var resoruceFileNames = resoruceFilesInfo.Select(info => info.Name);
Все три примера файлов ресурсов, которые вы предоставили, следуют шаблону именования культур. То есть сочетание двухбуквенного строчного кода культуры ISO 639, связанного с языком, и двухбуквенного кода субкультуры ISO 3166, связанного со страной или регионом. Для правильного извлечения фрагмента культуры я предлагаю использовать регулярное выражение, как показано ниже:
var regex = new Regex(@"(?<=\.)[a-z]{2}-[A-Z]{2}(?=\.resx$)");
var culturePrefixes = resoruceFileNames.Select(fileName => regex.Match(fileName).Value);
Наконец, создайте коллекцию культур:
var cultureList = culturePrefixes.Select(prefix => new CultureInfo(prefix));