Сейчас я пытаюсь внедрить 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();
Код: Выделить всё
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Файлы Код: Выделить всё
Application/Resources/SharedResource.resxКод: Выделить всё
Application/Resources/SharedResource.en.resxКод: Выделить всё
Application/Resources/SharedResource.ru.resxКод: Выделить всё
Application/Resources/SharedResource.tr.resx
Код: Выделить всё
Confirm account deletion
Фактическая проблема: когда я нажимаю конечную точку теста, я возвращаю некоторую отладочную информацию. Вот что я получаю:
Код: Выделить всё
{
"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
Мобильная версия