ASP.NET Основная система API.Исключение invalidoperationexcepция в локализации

#c# #api #asp.net-core #localization #translation

Вопрос:

я пытался использовать локализацию в своем WebAPI, но каждый раз у меня возникает эта ошибка

Система.Исключение InvalidOperationException: Нет службы для типа » Microsoft.AspNetCore.Mvc.Возможности просмотра.ITempDataDictionaryFactory» был зарегистрирован.

вот моя программа.cs

 using Microsoft.OpenApi.Models;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Localization;
using System.Globalization;
using testeTraducao.Controllers;
using Microsoft.Extensions.Options;
using testeTraducao.Localize;
using testeTraducao.Resources;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

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


builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new() { Title = "testeTraducao", Version = "v1" });
});

var app = builder.Build();


// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "testeTraducao v1"));
}

app.UseHttpsRedirection();

var supportedCultures = new[]
{
    new CultureInfo("en-UK"),
    new CultureInfo("pt-BR")
};

app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-UK"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
});

app.UseAuthorization();

app.MapControllers();

app.Run();

 

я видел, как некоторые люди говорили добавить builder.Services.AddMvc(); , но все еще не работали, но с другой ошибкой

 System.InvalidOperationException: The view 'test' was not found. The following locations were searched:
/Views/Traduzido/test.cshtml
/Views/Shared/test.cshtml
/Pages/Shared/test.cshtml
   at Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable`1 originalLocations)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
   at Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](Stateamp; next, Scopeamp; scope, Objectamp; state, Booleanamp; isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(Stateamp; next, Scopeamp; scope, Objectamp; state, Booleanamp; isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

 

вот немного информации:

структура моих папок: Структура папок

файл resx

Контроллер:

 public class TraduzidoController : Controller
{
    private readonly IStringLocalizer<SharedResources> _localizador;
    public TraduzidoController(IStringLocalizer<SharedResources> localizador)
    {
        _localizador = localizador;
    }
    [HttpGet("/traduz")]
    public IActionResult Index()
    {
        return View(_localizador["test"]);
    }
}
 

целевая структура:
<TargetFramework>net6.0</TargetFramework>

Спасибо

—изменить— после изменения на return Ok(_localizador["test"]); все еще не могу получить сообщение проверьте возврат здесь

Комментарии:

1. Пожалуйста, замените изображения кодом, так как это намного проще для чтения и отладки

Ответ №1:

return View(_localizador["test"]); означает , что вы пытаетесь вызвать представление test , которое в данном случае локализовано.

Определенно добавьте builder.Services.AddMvc(); , но затем также добавьте файл представления, в котором подробно описываются ошибки:

The view 'test' was not found

Создайте корневую Views папку, Traduzido папку внутри нее для представлений вашего контроллера и, наконец, добавьте test.cshtml файл для исправления ошибок.

Комментарии:

1. я был так отвлечен, что не мог видеть, что пытаюсь вернуть просмотр, ха-ха-ха, но я все еще не могу получить сообщение, поэтому я отредактировал сообщение