我需要以編程方式列出resx文件組中的可用文化,但ResourceManager類似乎沒有幫助。從.resx文件組中獲取所有可用的文化
我可能有:
Labels.resx
Labels.fr-FR.resx
Labels.ro-RO.resx
等
但是,我怎麼能找到這三個(或多少會有)文化在運行時?
我需要以編程方式列出resx文件組中的可用文化,但ResourceManager類似乎沒有幫助。從.resx文件組中獲取所有可用的文化
我可能有:
Labels.resx
Labels.fr-FR.resx
Labels.ro-RO.resx
等
但是,我怎麼能找到這三個(或多少會有)文化在運行時?
尋找在你的應用程序的目錄附屬程序集:對於每個子目錄,檢查其名稱對應於一種文化的名字,如果它包含一個.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;
}
這似乎不適用於我的Resources.resx和Resources.el.resx文件下屬性在WPF項目。請參閱下面的替代方案 – 2015-08-22 22:44:11
還有一個更優雅的方法描述here
不知道如果那個更優雅,可能會加載所有資源在內存中,如果您的意思是那裏最多的一個 – 2015-08-21 17:43:39
修改了您提到的方法(另一個在此處提到的方法沒有工作)不返回InvariantCulture,參見上文 – 2015-08-22 22:45:13
基於由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;
}
我不認爲你真的需要.NET在標題和對.NET的標籤。 – spinon 2010-07-12 08:49:08
也只是看通過這似乎是重複到: http://stackoverflow.com/questions/1283602/getting-a-list-of-available-languages-resx-files – spinon 2010-07-12 08:53:23
是的,它是一個重複,但這有一個更好的答案 – 2012-02-28 16:57:42