вторник, 23 марта 2010 г.

Автоматическое определение CultureInfo для установленных сателитных сборок

На днях понадобилось в программе автоматически определять, для каких языков в программе существуют сателитные сборки (Satellite Assemblies). Для чего это нужно? А понадобилось для того, что бы процесс локализации приложения на новый язык был максимально простым. В установленную программу просто добавляются локализированные ресурсы в виде сателитных сборок, и никаких перекомпиляций уже не требуется. Т.к. я не нашел штатных средств для извлечения информации об установленных сборках, написал свою реализацию.

private List<CultureInfo> GetInstalledCultures() {
  // declare result
  List<CultureInfo> result = new List<CultureInfo>();
  // define paths
  String rootPath = Path.GetDirectoryName(this.GetType().Assembly.Location);
  String assemblyName = this.GetType().Assembly.GetName().Name;
  String satAssemblyName = assemblyName + ".resources.dll";
  // scan directory for sat assemblies
  DirectoryInfo root_di = new DirectoryInfo(rootPath);
  foreach (DirectoryInfo di in root_di.GetDirectories()) {
    String satAssemblyPath = Path.Combine(di.FullName, satAssemblyName);
    if (File.Exists(satAssemblyPath)) {
      try {
        // check that folder contains the correct data
        CultureInfo ci = new CultureInfo(di.Name);
        Assembly satAssembly = this.GetType().Assembly.GetSatelliteAssembly(ci);
        // successful
        result.Add(ci);
      }
      catch {
        // Nothing. Test for the creating the CultureInfo and Assembly objects;
      }
    }
  }
  // result
  return result;
}


* This source code was highlighted with Source Code Highlighter.