Файлы ресурсов из папки ресурсов

У меня есть 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));
Другие вопросы по тегам