Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心1.1本地化通用服务_C#_Asp.net Core_.net Core_Asp.net Core Localization - Fatal编程技术网

C# ASP.NET核心1.1本地化通用服务

C# ASP.NET核心1.1本地化通用服务,c#,asp.net-core,.net-core,asp.net-core-localization,C#,Asp.net Core,.net Core,Asp.net Core Localization,我正在制作一个ASP.NET Core 1.1应用程序,并尝试设置本地化 当我在valuescoontroller上执行IStringLocalizer时,它工作正常并本地化了我的资源文件 public ValuesController(IStringLocalizer<ValuesController> localizer, IService<BaseEntity> service) { _localizer = localizer; _service

我正在制作一个ASP.NET Core 1.1应用程序,并尝试设置本地化

当我在
valuescoontroller
上执行
IStringLocalizer
时,它工作正常并本地化了我的资源文件

public ValuesController(IStringLocalizer<ValuesController> localizer, IService<BaseEntity> service)
{
    _localizer = localizer;
    _service = service;
}
public class Service<T> : IService<T>
    where T : BaseEntity
{
    #region Properties
    protected IRepository Repository { get; set; }
    protected IUnitOfWorkFactory UnitOfWorkFactory { get; set; }
    private readonly ILogger _logger;
    private readonly IStringLocalizer _localizer;

    #endregion

    #region Ctor
    public Service(IRepository repository, IUnitOfWorkFactory unitOfWorkFactory,
        ILogger<Service<T>> logger, IStringLocalizer<Service<T>> localizer)
    {
        Repository = repository;
        UnitOfWorkFactory = unitOfWorkFactory;
        _logger = logger;
        _localizer = localizer;
    }
}
上面的代码在“Resources/Services/Base/Service.en US.resx”中找不到我的资源

你知道怎么做吗

---编辑

MyControl.Api(Startup.cs)

名称空间MyControl.Api

services.AddLocalization(options => options.ResourcesPath = "Resources");
这一行位于“MyControl.Api”内部,在名称空间“MyControl.Api”中

此应用程序中的资源文件夹用于“资源/控制器”

我的服务位于命名空间“MyControl.services”中

此项目中的资源文件夹(同一解决方案中的两个项目)为

“资源/服务/基础”


我的服务文件的名称空间是“MyControl.Services.Services.Base”

说明

你说得对,问题出在泛型类。根据
ResourceManagerStringLocalizer
(默认为
IStringLocalizer
实现)的定义,该类包含
\u resourceBaseName
私有字段。在
ResourceManager
类中,同样的字符串也可以作为搜索路径参数来定位资源文件

IStringLocalizer
被注入到一个封闭的泛型类型实例中时,该字段设置不正确,如下所示:

FooProject.Resources.Services.FooService`1[[System.Double,System.Private.CoreLib

而不是正确的一个:

FooProject.Resources.Services.FooService

您可以在调试器中检查定位器
\u resourceBaseName
值。这可能是一个bug,您可能会在GitHub上发现一个关于它的问题:

解决方法

可以手动创建
ResourceManagerStringLocalizer
实例。我们应该从没有csproj文件名和类名本身的类全名中获取此
baseName
部分:

全名:

MyCsprojFileName.AnyFolder.SubFolder.FooClass

baseName

AnyFolder.SubFolder

因为您提供的代码
baseName
可能是
“Services.Base”
。 让我们编写一些代码,以通用的方式获得它:

public class FooService<T>
{
    private readonly IStringLocalizerFactory _factory;

    public FooService(IStringLocalizerFactory factory)
    {
        _factory = factory;
    }

    public IStringLocalizer GetLocalizer()
    {
        var type = typeof(FooService<>);

        string assemblyName = type.GetTypeInfo().Assembly.GetName().Name;
        string typeName = type.Name.Remove(type.Name.IndexOf('`'));
        string baseName = (type.Namespace + "." + typeName).Substring(assemblyName.Length).Trim('.');

        var localizer = _factory.Create(baseName, assemblyName);

        return localizer;
    }
}
公共类服务
{
私有只读IStringLocalizerFactory\u工厂;
公共食品服务(IStringLocalizerFactory)
{
_工厂=工厂;
}
公共IStringLocalizer GetLocalizer()
{
变量类型=类型(FooService);
string assemblyName=type.GetTypeInfo().Assembly.GetName().Name;
string typeName=type.Name.Remove(type.Name.IndexOf('`');
字符串baseName=(type.Namespace+“+typeName).Substring(assemblyName.Length).Trim('.');
变量定位器=_factory.Create(baseName,assemblyName);
返回定位器;
}
}

默认情况下,如果资源文件的路径正确,它应该可以工作。请在“MyControl.services”项目>“Resources/services/Base”中的“MyControl.services.services.Base”资源文件夹中添加服务的命名空间和您的
services.AddLocalization
调用question.Added.service.cs命名空间>“MyControl.services.Base”以避免出现“必须”的情况我已经创建了一个holder类“LanguageLocalizer.cs”,并从中初始化了我的所有本地化程序。但是,你的回答是正确的。非常感谢!