2010-07-12 12 views
6

È necessario elencare in modo programmatico le colture disponibili in un gruppo di file resx, ma la classe ResourceManager non sembra essere di aiuto.Ottenere tutte le colture disponibili da un gruppo di file .resx

io possa avere:

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

e così via

Tuttavia, come posso trovare queste tre (o quanti ci sarebbe) culture in fase di esecuzione?

+0

non credo che si ha realmente bisogno .net nel titolo e hanno un tag per .net. – spinon

+0

Anche guardando attraverso SO questo sembra un duplicato a: http://stackoverflow.com/questions/1283602/getting-a-list-of-available-languages-resx-files – spinon

+2

Sì, è un duplicato ma questo ha una risposta migliore –

risposta

7

Cercare assembly satellite nella directory dell'applicazione: per ogni sottodirectory, controllare se il suo nome corrisponde a un nome della cultura, e se contiene un file .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; 
} 
+0

questo non sembra funzionare per me con i file Resources.resx e Resources.el.resx in Proprietà in un progetto WPF. Vedi sotto un'alternativa che ha funzionato –

3

C'è un approccio più elegante descritto here

+0

non sicuro se quello è più elegante, probabilmente carica tutte le risorse in memoria se intendi il più votato lì –

+0

modificato quell'approccio che hai menzionato (l'altro che era stato menzionato qui non funzionava) per non restituire l'InvariantCulture, vedi sopra –

2

basata sulla risposta di @ hans-holzbart a Programmatic way to get all the available languages (in satellite assemblies) ma fisso non restituisce l'InvariantCulture troppo e avvolto in un metodo riutilizzabile:

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

utilizzando tale metodo, è possibile ottenere un elenco di stringhe di aggiungere un po 'ComboBox con il seguente:

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