gpt4 book ai didi

c# - ASP.NET Core 1.1 本地化通用服务

转载 作者:太空狗 更新时间:2023-10-29 23:20:25 27 4
gpt4 key购买 nike

我正在制作 ASP.NET Core 1.1 应用并尝试设置本地化。

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

public ValuesController(IStringLocalizer<ValuesController> localizer, IService<BaseEntity> service)
{
_localizer = localizer;
_service = service;
}

上面的代码将我的资源定位在“Resources/Controllers/ValuesController.en-US.resx”。

但是,当我尝试使用通用服务注入(inject) IStringLocalizer 时,它找不到我的资源文件。

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”中。

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

我的服务在命名空间“MyControl.Services”中

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

“资源/服务/基地”

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

最佳答案

解释

你是对的,问题出在泛型类中。据此source code ResourceManagerStringLocalizer(它是默认的 IStringLocalizer 实现)- 该类包含 _resourceBaseName 私有(private)字段。同样的字符串也是is used将资源文件定位为 ResourceManager 类中的搜索路径参数。

IStringLocalizer 被注入(inject)到一个封闭的泛型类型实例中时,这个字段被错误地设置为:

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

而不是正确的:

FooProject.Resources.Services.FooService

您可以在调试器中检查定位器 _resourceBaseName 值。这可能是一个错误,您可以在 GitHub 上打开一个关于它的问题:https://github.com/aspnet/Localization/issues .

解决方法

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

全类名:

MyCsprojFileName.AnyFolder.SubFolder.FooClass

基础名称:

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

关于c# - ASP.NET Core 1.1 本地化通用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44313796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com