Расширение функциональности ResourceManagerStringLocalizer - PullRequest
0 голосов
/ 04 октября 2019

Я довольно плохо знаком с ядром .net и хочу реализовать локализацию в своем приложении. Встроенный сервис ResourceManagerStringLocalizer удовлетворяет почти всем моим требованиям и отлично работает из коробки, но я хочу добавить к нему некоторые пользовательские функции, не копируя и не вставляя весь код класса и не добавляя его вмой собственный локализатор. В настоящее время я пытался извлечь из класса в моем собственном Localizer и внедрить это как мой IStringLocalizer:

services.AddTransient<IStringLocalizer<MyApp.SharedResource>, MyLocalizer<MyApp.SharedResource>>();

...

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

Но это дает следующее исключение при попытке использоватьit:

System.InvalidOperationException: 'Unable to resolve service for type 'System.Resources.ResourceManager' while attempting to activate 'MyApp.Services.MyLocalizer`1[MyApp.SharedResource]'.'

Мой вопрос: как лучше всего это сделать? И как лучше всего делать такие вещи? Я чувствую, что подобные вещи могут появиться чаще в будущем этого приложения, и вся помощь будет оценена.

1 Ответ

0 голосов
/ 04 октября 2019

Вам не нужно переопределять встроенный локализатор, просто внедрите свой собственный:

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

}

Тогда вы можете просто внедрить его в представления:

@inject MyLocalizer _loc;

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

или к бэкэнду:

public class HomeController : Controller
{
    private readonly MyLocalizer _loc;
    public HomeController(MyLocalizer loc)
    {
        _loc = loc;
    }

    public IActionResult Index()
    {
        var msg = _loc["Welcome"];
        //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...