首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩展ResourceManagerStringLocalizer功能

扩展ResourceManagerStringLocalizer功能
EN

Stack Overflow用户
提问于 2019-10-04 19:08:48
回答 1查看 408关注 0票数 0

我对.net核心相当陌生,我想在我的应用程序中实现本地化。内置的ResourceManagerStringLocalizer服务几乎满足了我的所有需求,并且开箱即用,但我想给它添加一些自定义功能,而不是复制粘贴所有类的代码,然后在我自己的本地化程序中添加一些代码。目前,我已经尝试在自己的本地化程序中从类派生,并将其注入为我的IStringLocalizer:

代码语言:javascript
运行
复制
services.AddTransient<IStringLocalizer<MyApp.SharedResource>, MyLocalizer<MyApp.SharedResource>>();

..。

代码语言:javascript
运行
复制
public class MyLocalizer<T> : ResourceManagerStringLocalizer, IStringLocalizer<T> {
    public MyLocalizer(ResourceManager resourceManager, IResourceStringProvider resourceStringProvider, string baseName, IResourceNamesCache resourceNamesCache, ILogger logger) : base(resourceManager, resourceStringProvider, baseName, resourceNamesCache, logger) {
    }

    public override LocalizedString this[string name] {
        get {
            //do some custom functionality

            return base[name];
        }
    }

    public override LocalizedString this[string name, params object[] arguments] {
        get {
            //do some custom functionality

            return base[name, arguments];
        }
    }
}

但在尝试使用它时,这会产生以下异常:

代码语言:javascript
运行
复制
System.InvalidOperationException: 'Unable to resolve service for type 'System.Resources.ResourceManager' while attempting to activate 'MyApp.Services.MyLocalizer`1[MyApp.SharedResource]'.'

我的问题是,最好的方法是什么?做这样的事情的最佳实践是什么?我觉得在这个应用程序的未来,这类东西可能会更多地出现,所有的帮助都会被感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-04 19:34:02

您不必重写内置的定位器,只需实现您的自定义定位器:

代码语言:javascript
运行
复制
public class MyLocalizer
{
    private readonly IStringLocalizer _localizer;
    public MyLocalizer(IStringLocalizerFactory factory)
    {
        var type = typeof(MyResourceType);
        var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
        _localizer = factory.Create("MyResourceType", assemblyName.Name);
    }

    public LocalizedString this[string name]
    {
        get
        {
            // ...

            return _localizer[name];
        }
    }

    public LocalizedString this[string name, params object[] arguments]
    {
        get
        {
            // ...

            return _localizer[name, arguments];
        }
    }

}

然后您可以简单地将其注入到视图中:

代码语言:javascript
运行
复制
@inject MyLocalizer _loc;

<h1>@_loc["Hellow"]</h1>

或者到后端:

代码语言:javascript
运行
复制
public class HomeController : Controller
{
    private readonly MyLocalizer _loc;
    public HomeController(MyLocalizer loc)
    {
        _loc = loc;
    }

    public IActionResult Index()
    {
        var msg = _loc["Welcome"];
        //...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58235242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档