本文是一个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>();
源码