Получить все доступные культуры из файловой группы .resx - PullRequest
6 голосов
/ 12 июля 2010

Мне нужно программно перечислить доступные культуры в группе файлов resx, но класс ResourceManager, похоже, не помогает.

У меня может быть:

Labels.resx
Labels.fr-FR.resx
Labels.ro-RO.resx

и т. Д.

Однако, как я могу найти эти три (или сколько их будет) культуры во время выполнения?

Ответы [ 2 ]

7 голосов
/ 12 июля 2010

Найдите спутниковые сборки в каталоге вашего приложения: для каждого подкаталога проверьте, соответствует ли его имя названию культуры и содержит ли он файл .resources.dll:

public IEnumerable<CultureInfo> GetAvailableCultures()
{
    var programLocation = Process.GetCurrentProcess().MainModule.FileName;
    var resourceFileName = Path.GetFileNameWithoutExtension(programLocation) + ".resources.dll";
    var rootDir = new DirectoryInfo(Path.GetDirectoryName(programLocation));
    return from c in CultureInfo.GetCultures(CultureTypes.AllCultures)
           join d in rootDir.EnumerateDirectories() on c.IetfLanguageTag equals d.Name
           where d.EnumerateFiles(resourceFileName).Any()
           select c;
}
2 голосов
/ 23 августа 2015

на основе ответа @ hans-holzbart на Программный способ получить все доступные языки (в сателлитных сборках) , но исправлено, чтобы не возвращать также InvariantCulture, и заключено в метод многократного использования:

public static IEnumerable<CultureInfo> GetAvailableCultures()
{
  List<CultureInfo> result = new List<CultureInfo>();

  ResourceManager rm = new ResourceManager(typeof(Resources));

  CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
  foreach (CultureInfo culture in cultures)
  {
    try
    {
      if (culture.Equals(CultureInfo.InvariantCulture)) continue; //do not use "==", won't work

      ResourceSet rs = rm.GetResourceSet(culture, true, false);
      if (rs != null)
        result.Add(culture);
    }
    catch (CultureNotFoundException)
    {
      //NOP
    }
  }
  return result;
}

используя этот метод, вы можете получить список строк для добавления в некоторый ComboBox со следующими данными:

public static ObservableCollection<string> GetAvailableLanguages()
{
  var languages = new ObservableCollection<string>();
  var cultures = GetAvailableCultures();
  foreach (CultureInfo culture in cultures)
    languages.Add(culture.NativeName + " (" + culture.EnglishName + " [" + culture.TwoLetterISOLanguageName + "])");
  return languages;
}
...