语言支持本地化.Net Web Api

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

语言发展是如何进行的?也许有人可以向我解释 .Net 上的 Web API,而不是 MVC。

比如我数据库里有华盛顿,更改语言后,前端请求的结果应该是返回“Вашингтон”。

我看到了 Microsoft.Exstensions.Localization 和 reed 如何使用,但我需要理解概念

谢谢

c# asp.net .net localization
1个回答
0
投票
  1. 添加包:Microsoft.Extensions.Localization

  2. 添加一个模型来表示本地化资源(在我的示例中,其位于 EmailResource.cs 下方) - 这只是一个空类:

  1. 添加资源文件夹并添加资源文件 (x.resx)。每个资源定义都必须使用不包括程序集的命名空间,即。 EmailResource.cs 是 X.Y.ResourceDefinitions.EmailResource,因此我们创建一个文件 ResourceDefinitions.EmailResource.{locale}.resx

  2. 将本地化添加到 webapi:

 /// <summary>
 /// Add localization to the API
 /// </summary>
 /// <param name="builder">The api builder</param>
 /// <returns>The api builder</returns>
 public static WebApplicationBuilder ConfigureLocalization(this WebApplicationBuilder builder)
 {
     // Setup DI
     builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

     // Add locales
     builder.Services.Configure<RequestLocalizationOptions>(options =>
     {
         var supportedCultures = new[] { "en-US", "fr" };
         options.SetDefaultCulture(supportedCultures[0])
             .AddSupportedCultures(supportedCultures)
             .AddSupportedUICultures(supportedCultures);
         options.ApplyCurrentCultureToResponseHeaders = true;

         [MarkerForLater]
     });

     return builder;
 }

在程序.cs中

var builder = WebApplication.CreateBuilder(args);

builder.ConfigureLocalization();

...

var app = builder.Build();

// Use the request localization
var options = app.Services.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(options.Value);
  1. 使用 DI 在控制器/服务中使用定位器
public class EmailService {

    private readonly IStringLocalizer<EmailResource> _localizer;

    public EmailService(IStringLocalizer<EmailResource> localizer)
    {
      _localizer = localizer;
    }

    public void SendEmail(string subject, string content)
    {
        var localizedSubject = _localizer[subject];
        ....
    }

注意: 如果在 resx 文件中没有找到映射,则将使用原始值。

然后,当您请求 API 端点时,您可以添加 ?culture=fr 您还可以使用自定义提供程序将区域设置配置为来自标头。我已经用 [MarkerForLater] 标记了您可以在上面设置它的位置。可以使用以下行注册自定义提供程序:

// Custom provider (take from header as "Accept-Language" NOT query string)
options.RequestCultureProviders.Clear();
options.RequestCultureProviders.Add(new YourRequestCultureProvider());

提供者

public class YourRequestCultureProvider : RequestCultureProvider
{
    public override async Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        await Task.Yield();

        // Get from header
        var locale = httpContext.Request.Headers.FirstOrDefault(x => x.Key == "Accept-Language");
        var localeValue = locale.Value.ToString();

        // Return
        return new ProviderCultureResult(localeValue);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.