Локализация .NET Core: контроллер веб-API не может разрешить IStringLocalizer из другого проектаC#

Место общения программистов C#
Ответить
Anonymous
 Локализация .NET Core: контроллер веб-API не может разрешить IStringLocalizer из другого проекта

Сообщение Anonymous »

Я хочу централизовать текст приложения и отправлять локализованные сообщения, в том числе из фоновых заданий (отправка локализованных push-уведомлений пользователям на предпочитаемом ими языке). Поэтому мне нужно иметь возможность разрешать строки локализации из проекта приложения, а не только внутри страниц Razor.
Сейчас я пытаюсь внедрить IStringLocalizer в контроллер веб-API ASP.NET Core (а позже и в фоновую службу) для загрузки строк из файлов .resx, определенных в проекте приложения. Но IStringLocalizer не может найти ресурс.
Настройка локализации в Program.cs (веб-API):

Код: Выделить всё

builder.Services.AddLocalization(opts => opts.ResourcesPath = "Resources");

builder.Services.AddControllers()
.AddDataAnnotationsLocalization();

builder.Services.AddRazorPages()
.AddViewLocalization()
.AddDataAnnotationsLocalization();

builder.Services.Configure(opts =>
{
var supported = new[] { "sr-Latn-ME", "en", "ru", "tr" }
.Select(c => new CultureInfo(c)).ToList();

opts.DefaultRequestCulture = new RequestCulture("sr-Latn-ME");
opts.SupportedCultures = supported;
opts.SupportedUICultures = supported;
opts.RequestCultureProviders = new[]
{
new CookieRequestCultureProvider()
};
});

var app = builder.Build();

var locOptions = app.Services
.GetRequiredService()
.Value;

app.UseRequestLocalization(locOptions);

app.MapControllers();
app.MapRazorPages();
app.Run();
Локализация отлично работает для Razor Pages.

Код: Выделить всё

SharedResource
класс (в проекте приложения):

Код: Выделить всё

namespace Application
{
public class SharedResource
{
}
}
Тест контроллера:

Код: Выделить всё

private readonly IStringLocalizer localizer;

public IActionResult TestLoc()
{
var originalCulture = CultureInfo.CurrentCulture;
var originalUICulture = CultureInfo.CurrentUICulture;

var forcedCulture = new CultureInfo("en");
CultureInfo.CurrentCulture = forcedCulture;
CultureInfo.CurrentUICulture = forcedCulture;

var testKey = "Title";
var valueForEn = localizer[testKey];

CultureInfo.CurrentCulture = originalCulture;
CultureInfo.CurrentUICulture = originalUICulture;

var allResourceNames = typeof(SharedResource).Assembly
.GetManifestResourceNames();

return Ok(new
{
ForcedCulture = "en",
Value = valueForEn,
ResourceNamesInAssembly = allResourceNames
});
}

Код: Выделить всё

.ResxФайлы 
(в проекте приложения) — ресурсы .resx находятся в проекте приложения в папке Resources: Пример из SharedResource.en.resx:

Код: Выделить всё

Confirm account deletion

Все файлы .resx имеют значение «Действие сборки = встроенный ресурс».
Фактическая проблема: когда я нажимаю конечную точку теста, я возвращаю некоторую отладочную информацию. Вот что я получаю:

Код: Выделить всё

{
"forcedCulture": "en",
"value": {
"name": "Title",
"value": "Title",
"resourceNotFound": true,
"searchedLocation": "Application.Resources.SharedResource"
},
"resourceNamesInAssembly": [
"Application.SharedResource.resources"
]
}
  • Код: Выделить всё

    IStringLocalizer
    выполняет поиск:

    Код: Выделить всё

    Application.Resources.SharedResource
  • Но встроенный ресурс, который фактически существует в сборке приложения:

    Код: Выделить всё

    Application.SharedResource.resources


Подробнее здесь: https://stackoverflow.com/questions/798 ... lizert-fro
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»