2010-07-12 9 views
6

Ich muss die verfügbaren Kulturen in einer ResX-Dateigruppe programmatisch auflisten, aber die ResourceManager-Klasse scheint nicht zu helfen.Erhalten Sie alle verfügbaren Kulturen aus einer RESX-Dateigruppe

I haben:

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

und so weiter

Doch wie kann ich diese drei (oder wie viele würden da sein) Kulturen zur Laufzeit finden?

+0

Das glaube ich nicht, dass Sie wirklich .net im Titel benötigen und ein Tag für .net haben. – spinon

+0

Auch nur durch SO sieht dies wie ein Duplikat zu: http://stackoverflow.com/questions/1283602/getting-a-list-of-available-languages-resx-files – spinon

+2

Ja, es ist ein Duplikat, aber das hat eine bessere Antwort –

Antwort

7

Geben Sie für Satelliten-Baugruppen in Ihrem Anwendungsverzeichnis: für jedes Unterverzeichnis, prüfen Sie, ob der Name zu einer Kultur Namen entspricht, und wenn es eine .resources.dll Datei enthält:

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

dies scheint nicht für mich mit Resources.resx und Resources.el.resx Dateien unter Eigenschaften in einem WPF-Projekt arbeiten. Siehe unten eine Alternative, die funktioniert –

3

Es ist ein eleganter Ansatz here beschrieben

+0

nicht sicher, ob das ist eleganter, lädt wahrscheinlich alle Ressourcen im Speicher, wenn Sie die am meisten gewählte dort –

+0

geändert Ansatz, den Sie erwähnt (der andere, der hier erwähnt wurde, hat nicht funktioniert) um die InvariantCulture nicht zurückzugeben, siehe oben –

2

basierend auf der Antwort von @ hans-holzbart bei Programmatic way to get all the available languages (in satellite assemblies) aber fixiert nicht die InvariantCulture zurückkehren zu und in eine wiederverwendbare Methode gewickelt:

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

diese Methode verwenden, können Sie eine Liste von Strings bekommen bis zu einem gewissen ComboBox mit dem folgenden hinzuzufügen:

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