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

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

Сообщение 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 вместе с фиктивным классом, предоставляющим тип.

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

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 ... -shared-pr
Ответить

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

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

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

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

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