从.resx文件组中获取所有可用的文化

And*_*nea 6 .net resources localization resx internationalization

我需要以编程方式列出resx文件组中的可用文化,但ResourceManager类似乎没有帮助.

我可能有 :

Labels.resx
Labels.fr-FR.resx
Labels.ro-RO.resx
Run Code Online (Sandbox Code Playgroud)

等等

但是,如何在运行时找到这三种(或者有多少种)文化?

Tho*_*que 7

在应用程序的目录中查找附属程序集:对于每个子目录,检查其名称是否对应于区域性名称,以及它是否包含.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;
}
Run Code Online (Sandbox Code Playgroud)


Geo*_*lis 6

基于 @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;
}
Run Code Online (Sandbox Code Playgroud)

使用该方法,您可以获得要添加到某些 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;
}
Run Code Online (Sandbox Code Playgroud)