本文是一个demo,演示了如何根据用户接口查询字段(正常放header中),设置当前culture,并获取当前culture的key value给用户提示
- 创建Resources文件夹,添加以下三个文件
其中ExceptionUnuse 是一个空的类,供IStringLocalizer使用,IStringLocalizer 决定了resource文件需要以Exceptions开头进行命名,且需要注意Exceptions这个类的命名空间,因为这个决定了能否找到资源文件
namespace CoreAPILocalization
{
public class Exceptions
{
}
}
- 创建中间件,设置当前culture
using Microsoft.Extensions.Options;
using System.Globalization;
namespace CoreAPILocalization.CoreConfig
{
public class CultureMiddleware
{
private readonly RequestDelegate _next;
private readonly IOptions<RequestLocalizationOptions> _options;
public CultureMiddleware(RequestDelegate next, IOptions<RequestLocalizationOptions> options)
{
_next = next;
_options = options;
}
public async Task InvokeAsync(HttpContext context)
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
if (_options.Value.SupportedCultures.Contains(culture))
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
}
await _next(context);
}
}
}
- 创建全局异常filter
namespace CoreAPILocalization.CoreConfig
{
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using System.Net;
namespace ExceptionFilter
{
public class GlobalExceptionFilter : IAsyncExceptionFilter
{
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly IStringLocalizer<Exceptions> _localizer;
public GlobalExceptionFilter(IWebHostEnvironment webHostEnvironment, IStringLocalizer<Exceptions> localizer)
{
_webHostEnvironment = webHostEnvironment;
_localizer = localizer;
}
public Task OnExceptionAsync(ExceptionContext context)
{
var errorCode = "errorcode500"; // 假设这是从异常中提取的错误代码
var errorMessage = _localizer[errorCode];
context.Result = new ObjectResult(new { Error = errorMessage })
{
StatusCode = (int)HttpStatusCode.InternalServerError
};
context.ExceptionHandled = true;
return Task.CompletedTask;
}
}
}
}
- DI
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.AddControllersWithViews()
.AddViewLocalization()
.AddDataAnnotationsLocalization();
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { "en-US", "zh-CN" };
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures.Select(c => new CultureInfo(c)).ToList();
options.SupportedUICultures = supportedCultures.Select(c => new CultureInfo(c)).ToList();
});
builder.Services.Configure<MvcOptions>(opt =>
{
opt.Filters.Add<GlobalExceptionFilter>();
});
.....
app.UseRequestLocalization();
app.UseMiddleware<CultureMiddleware>();