2010-07-12 63 views
6

我需要以編程方式列出resx文件組中的可用文化,但ResourceManager類似乎沒有幫助。從.resx文件組中獲取所有可用的文化

我可能有:

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

但是,我怎麼能找到這三個(或多少會有)文化在運行時?

+0

我不認爲你真的需要.NET在標題和對.NET的標籤。 – spinon 2010-07-12 08:49:08

+0

也只是看通過這似乎是重複到: http://stackoverflow.com/questions/1283602/getting-a-list-of-available-languages-resx-files – spinon 2010-07-12 08:53:23

+2

是的,它是一個重複,但這有一個更好的答案 – 2012-02-28 16:57:42

回答

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

這似乎不適用於我的Resources.resx和Resources.el.resx文件下屬性在WPF項目。請參閱下面的替代方案 – 2015-08-22 22:44:11

3

還有一個更優雅的方法描述here

+0

不知道如果那個更優雅,可能會加載所有資源在內存中,如果您的意思是那裏最多的一個 – 2015-08-21 17:43:39

+0

修改了您提到的方法(另一個在此處提到的方法沒有工作)不返回InvariantCulture,參見上文 – 2015-08-22 22:45:13

2

基於由Programmatic way to get all the available languages (in satellite assemblies) @漢斯 - 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; 
} 
使用該方法

,你可以得到一個字符串列表添加到一些組合框與以下:

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