我有一个库项目(SamplePlugin),它可以用作MEF模块并在运行时加载。最近,我决定支持国际化。为此,我为每个支持的语言环境创建了Properties / Resource.resx和各自的Properties / Resource.xx-yy.resx。然后,我向每个资源文件添加了具有特定于语言环境的翻译的字符串但是在运行时,我似乎无法获得文化正确的资源。这是相关代码:
加载模块:
var di = new DirectoryInfo("Plugins/");
var dlls = di.GetFileSystemInfos("*.dll", SearchOption.AllDirectories);
var catalog = new AggregateCatalog();
foreach (var fi in dlls)
{
var ac = new AssemblyCatalog(Assembly.LoadFile(fi.FullName));
catalog.Catalogs.Add(ac);
}
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
MEF模块内部的方法(SamplePlugin):
string GetFrenchString()
{
var resourceManager = new ResourceManager(
"SamplePlugin.Properties.Resources",
System.Reflection.Assembly.GetExecutingAssembly());
var culture = new System.Globalization.CultureInfo("fr-FR");
return (string)resourceManager.GetObject("SampleText", culture);
}
已编译应用程序的文件结构:
app.exe
Plugins/SamplePlugin/SamplePlugin.dll
Plugins/SamplePlugin/zh-CN/SamplePlugin.resources.dll
Plugins/SamplePlugin/de-DE/SamplePlugin.resources.dll
Plugins/SamplePlugin/fr-FR/SamplePlugin.resources.dll
...
当我运行GetFrenchString()
时,我得到"Sample Text"
(来自resource.resx)而不是"exemple de texte"
(来自resource.fr-FR.resx)。我实际上发现了类似的question,但海报回答了他自己的问题,并在他的问题和答案中提供了很少的细节。
其他详情:
我所有资源文件的访问修饰符都是" public"