有没有办法将两个资源文件夹添加到aspnet核心本地化?

时间:2018-04-03 12:20:24

标签: asp.net-core asp.net-core-localization

我目前正在为一个项目开发SDK,作为一项要求,我需要添加两个资源位置。一个将提供SDK lib,另一个将由消费者应用程序提供。

目前,根据文档,这是如何添加本地化:

services.AddLocalization(options => options.ResourcesPath = "Resources");

我从我的BaseStartup类调用此方法,该类将由消费者应用程序的Startup类继承。所以我需要能够设置SDK资源文件夹的位置以及消费者应用程序的位置。

可能是这样的:

services.AddLocalization(options => 
{
    options.ResourcesPath = "SDKResources";
    options.FromAssembly = sdkResourcesAssembly;
});
services.AddLocalization(options => 
{
    options.ResourcesPath = "AppResources";
    options.FromAssembly = appResourcesAssembly;
});

这可能吗?如果是这样,怎么样?如果没有,是否有解决方法?

在线检查甚至源代码(https://github.com/aspnet/Localization)都没有多大帮助。我唯一能想到的是使用接受程序集的IStringLocalizerFactory和文件的名称。会有用吗?例如,添加services.AddLocalization()然后创建一个包装类,使用IStringLocalizerFactory创建的工厂为消费者应用程序提供字符串?

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了两种方法,首先是从不同的程序集中添加资源:

我创建了一个基本启动类来处理包含我的资源类的所有源程序集,然后加载它们。

serviceCollection.AddLocalization();

var resourceTypes = typeof(BaseResource<>).Assembly.GetDerivedGenericTypes(typeof(BaseResource<>));

if (typeFromResourceAssembly != null)
    resourceTypes.AddRange(typeFromResourceAssembly.Assembly.GetDerivedGenericTypes(typeof(BaseResource<>)));

foreach (var resourceType in resourceTypes)
{
    serviceCollection.AddScoped(resourceType, resourceType);
}

return serviceCollection;

其次,通过添加不同的资源文件夹:

services.Configure<ClassLibraryLocalizationOptions>(
                options => options.ResourcePaths = new Dictionary<string, string>
                {
                    { "ResourceClass", "ResourcesFolder" },
                    { "Localization.CustomResourceClass", "Folder1/Folder2" }
                }
            );