代码之家  ›  专栏  ›  技术社区  ›  Andrei Rînea

从.resx文件组获取所有可用区域性

  •  6
  • Andrei Rînea  · 技术社区  · 14 年前

    我需要通过编程在resx文件组中列出可用的区域性,但是resourcemanager类似乎没有帮助。

    我可能有:

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

    等等

    然而,我如何在运行时找到这三种(或者有多少种)文化呢?

    3 回复  |  直到 8 年前
        1
  •  7
  •   Thomas Levesque    8 年前

    在应用程序的目录中查找附属程序集:对于每个子目录,检查其名称是否与区域性名称对应,以及是否包含 .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
  •  3
  •   Community kfsone    7 年前

    有一种更优雅的方法 here

        3
  •  2
  •   Community kfsone    7 年前

    根据@hans holzbart的回答 Programmatic way to get all the available languages (in satellite assemblies) 但已修复为不返回不变区域性,并将其包装为可重用方法:

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

    使用该方法,可以获得要添加到某些组合框中的字符串列表,方法如下:

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