有没有办法在aspnet core本地化中添加两个资源文件夹?

Is there a way to add two resource folders to aspnet core localization?

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

目前,根据文档,这是添加本地化的方法:

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

我正在从我的 BaseStartup class 调用此方法,该方法将由消费者应用程序的 Startup class 继承。所以我需要能够设置 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() 然后创建一个包装器 class,它将使用使用 IStringLocalizerFactory?

创建的工厂为消费者应用程序提供字符串

谢谢!

我发现有两种方法可以完成,首先是添加来自不同程序集的资源:

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

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