C# ASP.NET核心1.1本地化通用服务
我正在制作一个ASP.NET Core 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
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”,并从中初始化了我的所有本地化程序。但是,你的回答是正确的。非常感谢!