我正在尝试使用具有两个资源文件的共享本地化。
我的
SharedResources.cs
:
namespace Web.Facade
{
public class SharedResources
{
}
}
我的
Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddLocalization(options => options.ResourcesPath = "Resources");
...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
var supportedCultures = new[] { "en-US", "ru-RU" };
var localizationOptions =
new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
...
}
我在控制器和中间件中使用本地化。
比如说我的
AuthController.cs
:
[Route("api/v1/auth")]
public class AuthController : ControllerBase
{
private readonly IAuthService authService;
private readonly IStringLocalizer<SharedResources> localizer;
private readonly ILogger<AuthController> logger;
public AuthController(
IAuthService authService,
IStringLocalizer<SharedResources> localizer,
ILogger<AuthController> logger)
{
this.authService = authService;
this.localizer = localizer;
this.logger = logger;
}
...
...
...
public async Task<IActionResult> RefreshToken([FromBody] RefreshTokenDTO refreshTokenDto)
{
if (!RefreshTokenDTO.IsValidModel(refreshTokenDto, out var errorMessage))
{
return this.BadRequest(new ErrorResponse(this.localizer[errorMessage].Value));
}
我使用
Accept-Language: ru-RU
标头调用我的 Web API 方法,但收到了默认字符串 "Invalid access or refresh tokens"
,而不是来自 "Некорректный access или refresh токен"
的预期
SharedResources.ru-RU.resx
我已经在尝试:
SharedResources.cs
移动到另一个文件夹并移至项目根目录SharedResources.cs
命名空间只有一件事对我有用:保留一个具有 ru-RU 文化的资源文件并将其重命名为
SharedResources.resx
。但在这种情况下,无论 Accept-Language
标头如何,我总是获得本地化数据。
所以,我想使用共享资源并按标题管理文化。谁能帮助我理解我所缺少的东西?
这是一个解决方法。需要修改一个文件。
程序.cs
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Options;
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLocalization();
builder.Services.Configure<RequestLocalizationOptions>(
options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("ru-RU")
};
options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
var localizeOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(localizeOptions.Value);
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();