Локализация API AspNetCore6 с помощью одного файла для каждого языка из общего проекта.C#

Место общения программистов C#
Anonymous
Локализация API AspNetCore6 с помощью одного файла для каждого языка из общего проекта.

Сообщение Anonymous »

Есть много ответов на вопросы по этой теме, но я не могу заставить его работать здесь.
Наше решение .Net Core 6 содержит множество проектов, большинство из которых — API-интерфейсы RESTful, которые может делиться ресурсами для локализации.
Итак, теперь цель состоит в том, чтобы создать проект SharedLocResources, содержащий все resx-файлы с переводами, к которым затем можно будет получить доступ во всех других проектах. Языковой стандарт запроса предоставляется заголовком Accept-Language. Заставить это работать не проблема. Я затрудняюсь с настройкой использования файлов ресурсов.

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

RestfulAPI.csproj
| - Controllers/MyController.cs
SharedLocalizationResources.csproj
|
| - Properties
| - LocalizationService.cs
| - SharedResource.cs //Dummy class to group shared resources
| - Resources.resx
| - Resources.ar.resx
| - Resources.bn.resx
....
Пользовательская служба использует IStringLocalizerFactory. Он создает экземпляр IStringLocalizer вместе с фиктивным классом, предоставляющим Type.
SharedResources.cs находится в проекте SharedLocResources.

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

namespace SharedLocalizationResources;
public class LocalizationService
{
private readonly IStringLocalizer localizer;

public LocalizationService(IStringLocalizerFactory factory)
{
var type = typeof(SharedResource);
var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
localizer = factory.Create("SharedResource", assemblyName.Name);
}
}

namespace SharedLocalizationResources;
/// 
/// Dummy class to group shared resources
/// 
public class SharedResource{}
Эта служба добавляется в процедуру запуска:

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

builder.Services.AddSingleton();
builder.Services.AddLocalization(options => options.ResourcesPath = "SharedLocalizationResources");  // Resource-containing project name

builder.Services.AddMvc().AddViewLocalization()
.AddDataAnnotationsLocalization(options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) =>
{
var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName);
return factory.Create("SharedResource", assemblyName.Name);
};
});

builder.Services.Configure(
options =>
{
var supportedCultures = new List
{
new("ar"),
new("bn"),
new("bg"),
new("en"),
new("de")
};

options.DefaultRequestCulture = new RequestCulture(culture: "de", uiCulture: "de");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;

options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
});
Но, используя это в контроллере, я вижу только строку «Тест» по умолчанию, но не локализованные ресурсы.

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

public MyController( IStringLocalizer sharedLocalizer)
{
sharedLocalizer = sharedLocalizer;
}

public ActionResult Version()
{
var res = new ActionResult(sharedLocalizer["Test"]);
return res;
}
Как мне исправить настройку, чтобы IStringLocalizer использовал ресурсы из проекта SharedLocalizationResources?

Подробнее здесь: https://stackoverflow.com/questions/783 ... ed-project

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