语言发展是如何进行的?也许有人可以向我解释 .Net 上的 Web API,而不是 MVC。
比如我数据库里有华盛顿,更改语言后,前端请求的结果应该是返回“Вашингтон”。
我看到了 Microsoft.Exstensions.Localization 和 reed 如何使用,但我需要理解概念
谢谢
添加包:Microsoft.Extensions.Localization
添加一个模型来表示本地化资源(在我的示例中,其位于 EmailResource.cs 下方) - 这只是一个空类:
添加资源文件夹并添加资源文件 (x.resx)。每个资源定义都必须使用不包括程序集的命名空间,即。 EmailResource.cs 是 X.Y.ResourceDefinitions.EmailResource,因此我们创建一个文件 ResourceDefinitions.EmailResource.{locale}.resx
将本地化添加到 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);
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);
}
}