如何使用 Hellang 问题详细信息中间件从 IStringLocalizer 获取要解析的本地化?

问题描述 投票:0回答:1

我正在使用使用 Linux 映像在 Docker 上运行的 .NetCore 8 API 项目。我的目标是本地化 Hellang 问题详细信息映射中返回的错误消息。

下面显示的代码是我实际所做的简化版本,但也不起作用(即 localizedErrorMessage 是“UserAlreadyExists”并且 allStrings 为空)。

 builder.Services.AddProblemDetails(x => {
     x.CustomizeProblemDetails = ctx =>
     {
         var localizer = ctx.HttpContext.RequestServices.GetService<IStringLocalizer<ErrorHandling>>();
         var allStrings = localizer.GetAllStrings();
         var localizedErrorMessage = localizer[FailureCode.UserAlreadyExists.ToString()]; 
...

注意: 我还检查了此处的区域性,它反映了初始请求中提供的内容(默认为 en-US)。

注意:我还确保在本地化中间件之后调用中间件

...
builder.ConfigureLocalization();
builder.ConfigureProblemDetails();
...

我知道我已经正确设置了有关资源文件/DI 等的所有内容,因为当我从 API 控制器方法中调用它时,它会解析,如下面的代码所示(使用与上面的代码中相同的片段,并带有明显的不使用“HttpContext.RequestServices.GetService”的例外)。

[HttpPost]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("")]
public async Task<ActionResult<UserDto?>> CreateUserAsync([FromBody] CreateNewUserDto model)
{
    var allStrings = _localizer.GetAllStrings();
    var localizedErrorMessage = _localizer[FailureCode.UserAlreadyExists.ToString()];
...

任何人都可以帮助指导我找到解决方案/解释为什么它无法在中间件中解析(加载资源翻译)吗?

注意:我也知道我可以通过在抛出异常时解决它来避免在中间件中执行此操作,如下所示,但我认为在中间件中执行此操作要干净得多,因为我不必注入 IStringLocalizer到处都会出现资源重复(跨微服务)。

throw new XYZException(_localizer[FailureCode.UserAlreadyExists.ToString()]);
c# localization c#-8.0
1个回答
0
投票

我最终没有使用 .resx 文件来加载本地化 - 我编写了一个自定义解析器,它从数据库(实际上是从另一个微服务)获取资源。即。

public class ApiResourceStringLocalizer : IStringLocalizer 
{
     ....


 builder.Services.AddScoped<IStringLocalizer, ApiResourceStringLocalizer>();

无论如何,这就是我想做的,但对于这个问题,这是一种解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.